はじめに
強化学習という分野を初めて認識したので、簡単なお題を強化学習で対応できるかをやってみることにします。
- DQNの生い立ち + Deep Q-NetworkをChainerで書いた : きっかけになった記事
- 強化学習: ε-Greedy法 について参考にしました
今回のは ChainerとかDeepLearningは関係ない話です。
お題: 足し算ゲーム
ゲームの基本は足し算です(?)よね。
ゲーム
- 状態S: 0~9 の整数
- アクションA: 1~4の整数
- 次状態S': (S + A) % 10
- 報酬R:
- +1: S' == 7
- -100: S' in (5, 9)
というゲームを考えます。
要するにプレイヤーには 0〜9の数字が提示され、それについて 1〜4 の数字で答える(A)というものです。
そして次の状態が 7 になれば 1点もらえて、 5か9になると -100点されます。この「報酬」は次のターンになったときにゲーム環境からプレイヤーに知らされます。
現在の状態(S)と次の状態(S') は S' = (S + A) mod 10
という単純な関係ですが、それはプレイヤーには知らされていません。
学習の評価
「100回アクション(ターン)した際の報酬Rの総和」とします。
基本的に3ターンで1つ報酬がもらえるので、100ターンの報酬上限は33〜34になります。
実験
実験に使ったコードはこちらになります。
Q-Learning というのをそのまま実装したつもりです。
ゲーム環境を表しているのが AddingGame
classで、 QLearning を実装したのが QLearningPlayer
になります。
QLearningPlayer
は ひたすら action(state, last_reward)
Methodを呼ばれるので、 action
(1〜4の整数値) を return するのが義務になります。
training モードのときは、 「E-Greedyによるランダムな行動選択」「QTableの更新」を行いますが、そうでないとき(評価モード)は、今信じている最善の行動を返すのみです。
結果
QTableの初期値はRandomなので、それによって学習の進捗はかなり違うのですが、
一例を示すと以下のようになります。
このグラフは 「100turn Trainingモード」 → 「100turn 評価モード」
を繰り返したときの「評価モード」フェーズの報酬の総和の推移をグラフにしたものです。
1500回目の評価辺りで MaxなScoreを出しています。この後も安定してこのScoreを出します。
※ちなみに1回目は-3300というScoreだったですが、グラフが見難くなるので切ってます。
あと(約20回くらい試したうち)1度だけScoreが25のまま33にならない時がありました。
こんな単純な問題でも局所最適解から抜けられないということがあるようだ、ということなのでしょうか。
興味深いです。
さいごに
今回は 状態Sの種類が10個しかないのでこういう実装でもOKですが、
状態Sが画面のピクセル数にもなると全く適用できないのはまあ間違いないでしょう。
そこで DeepLearning的な何か の出番なのだと思いますが、
まだイマイチちゃんとイメージできていないので、もうちょっと勉強しよう。。