LoginSignup
17
18

More than 5 years have passed since last update.

機械学習と戯れる:足し算ゲームを強化学習で学習できるか?

Last updated at Posted at 2015-07-13

はじめに

強化学習という分野を初めて認識したので、簡単なお題を強化学習で対応できるかをやってみることにします。

今回のは 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 評価モード」
を繰り返したときの「評価モード」フェーズの報酬の総和の推移をグラフにしたものです。

スクリーンショット_2015_07_13_12_10.png

1500回目の評価辺りで MaxなScoreを出しています。この後も安定してこのScoreを出します。
※ちなみに1回目は-3300というScoreだったですが、グラフが見難くなるので切ってます。

あと(約20回くらい試したうち)1度だけScoreが25のまま33にならない時がありました。
こんな単純な問題でも局所最適解から抜けられないということがあるようだ、ということなのでしょうか。
興味深いです。

さいごに

今回は 状態Sの種類が10個しかないのでこういう実装でもOKですが、
状態Sが画面のピクセル数にもなると全く適用できないのはまあ間違いないでしょう。

そこで DeepLearning的な何か の出番なのだと思いますが、
まだイマイチちゃんとイメージできていないので、もうちょっと勉強しよう。。

続き:足し算ゲームをChainerを使って強化学習できるか?

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18