私は最近、Golang で基本的な Q-Learning アルゴリズムを実装しようとしました。私は一般的に強化学習と AI に慣れていないため、エラーは私のものである可能性が非常に高いことに注意してください。
m,n,k ゲーム環境へのソリューションの実装方法は次のとおりです。t
エージェントは、指定された時間ごとに、最後の状態アクション(s, a)
とそれに対して獲得した報酬を保持します。エージェントa'
は、イプシロン貪欲ポリシーに基づいて移動を選択し、報酬を計算してから、 for timer
の値の更新に進みますQ(s, a)
t-1
func (agent *RLAgent) learn(reward float64) {
var mState = marshallState(agent.prevState, agent.id)
var oldVal = agent.values[mState]
agent.values[mState] = oldVal + (agent.LearningRate *
(agent.prevScore + (agent.DiscountFactor * reward) - oldVal))
}
ノート:
agent.prevState
アクションを実行した直後と環境が応答する前 (つまり、エージェントが移動した後、他のプレイヤーが移動する前) の前の状態を保持します。これを状態アクション タプルの代わりに使用しますが、それが正しいアプローチですagent.prevScore
前の状態アクションへの報酬を保持します- 引数は、現在のステップの状態アクション ( )
reward
に対する報酬を表しますQmax
状態アクション値のオーバーフローによりagent.LearningRate = 0.2
、agent.DiscountFactor = 0.8
エージェントは 100K エピソードに到達できません。私は golang のfloat64
(標準 IEEE 754-1985 倍精度浮動小数点変数) を使用してい±1.80×10^308
ます±Infiniti
。それは私が言うには大きすぎる値です!
の学習率0.02
と の割引率でトレーニングされ、 0.08
2M エピソード (それ自体で 1M ゲーム) を通過したモデルの状態を次に示します。
Reinforcement learning model report
Iterations: 2000000
Learned states: 4973
Maximum value: 88781786878142287058992045692178302709335321375413536179603017129368394119653322992958428880260210391115335655910912645569618040471973513955473468092393367618971462560382976.000000
Minimum value: 0.000000
報酬関数は次を返します。
- エージェント獲得: 1
- エージェントの喪失: -1
- 引き分け: 0
- ゲーム続行: 0.5
しかし、最小値がゼロで、最大値が高すぎることがわかります。
私が Python スクリプトで見つけたより単純な学習方法を使用すると、完全に問題なく動作し、実際にはよりインテリジェントに感じられることに言及する価値があるかもしれません! 遊んでみると引き分け(うっかり遊んでも勝てます)がほとんどなのですが、通常のQ-Learningでは勝てません!
agent.values[mState] = oldVal + (agent.LearningRate * (reward - agent.prevScore))
これを修正する方法についてのアイデアはありますか? Q-Learning では、そのような状態アクション値は正常ですか?!
更新:
パブロの回答とニックがこの質問に提供したわずかではあるが重要な編集を読んだ後、問題にはprevScore
前のステップoldVal
の報酬 (この例では - 1、0、0.5 または 1)。
その変更後、エージェントは正常に動作するようになり、2M エピソード後のモデルの状態は次のようになります。
Reinforcement learning model report
Iterations: 2000000
Learned states: 5477
Maximum value: 1.090465
Minimum value: -0.554718
エージェントとの 5 つのゲームのうち、2 勝 (エージェントは私が 2 つのストーンを続けて持っていることを認識していませんでした) と 3 引き分けでした。