<
強化学習によって学習させたニューラルネットワークを使ったハムレット(4目並べ)ゲームを作った。
だいぶ前からニューラルネットワークとか人工知能とかに興味があったんだけど、なかなかプログラミングする暇がなくてほったらかしにしてた。
そのうち、内容を解説していくつもり。
今回は、そのさわりの部分。
アーキテクチャ
アーキテクチャは、ざっくりこんな感じ。
+-----------------+
+-------->lRL Agent |
| | |
| +---->|[Value Function] |
| | +-------------+---+
| | |
State | | Reward | Action
| | |
| | +-----------+ |
| +---|Environment|<--+
| | |
+-------| |
+-----------+
- RL Agent: 強化学習エージェント(今回の場合プレイヤー)
- Value Function: 各State(ボードの状態)の価値を算出する関数
- Environment: 環境(今回の場合ゲームボード)
実際の動き
動きとしては、
- RL Agent(プレイヤー)が、現在のState(盤面)を取得する: Environment --> RL Agent
- RL Agentが、最も価値の高い次のStateを自分の価値関数(Value Function)から調べる: RL Agent --> Value Function
- 上記のStateに移行するためのActionをEnvironment(環境)になげる。: RL Agent --> Environment
- 環境からのReward(報酬)をえる。: Environment --> RL Agent
- 報酬を元に価値関数をアップデートする。: RL Agent --> Value Function
V(s)<-V(s) + α[reward + γV(s')-V(s)] :TD(0)方式
言葉にすると、現在のStateの価値は、次のステートの価値+rewardに近づくように学習されるということ
で、RL Agentが持つ価値関数[Value Function]の部分はどのような関数になるのかは未知であるので、ニューラルネットワークでState -> Valueの対応付けを学習させることにした。
今回のサイトに関して
- 10万回以上のRL Agent同士のゲームにより学習させたニューラルネットワークを用いています。
- 学習部分は割愛しています。(もともと学習部分はjavaでデスクトップように作っていたので。。そのうちperlに移植して学習機能付きにします)
- ニューラルネットワークの重みデータ + 百行程度のperl + javascript(GUIとか用)で出来ています。
- 同ディレクトリのhamlett.cgiに以下のデータをつけることによりjsonpデータが返ります。
- board=0_0_1_2_.... #ボードの盤面。1(先攻player)、2(後攻)、盤面(左下から左上、左から右に順次"_"で区切って並べたもの)
- player=1 or 2 # 自分(1=先攻、2=後攻)
- callback=xxxx #jsonpのcallback関数
参考書籍:
<iframe id=”4627826613”src=”http://motivation.drivendevelopment.jp/amazon_query_proxy/queryproxy_ruby.cgi?ItemId=4627826613” onload=”fitFrame(this.id)” frameborder=”0” width=”100%”></iframe>
2003年にこんなサイト作ってた。時代がやっと追いついた?
複雑系・人工知能ゲーム