人工知能はむれっとゲーム  [人工知能]

><

強化学習によって学習させたニューラルネットワークを使ったハムレット(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関数

参考書籍: