中身のご紹介(前編) 〜ニューラルネットワークについて〜

今回は、先日公開したAIポーカーの中身を簡単にご紹介してみたいと思います。ちょっと長くなりそうなので、前編・後編に分けてお送りします。前編は、ニューラルネットワークの基本概念についてです。

基本はニューラルネットワーク

AIポーカーでは、コンピュータの思考ルーチンとして、ニューラルネットワークを基に作りました。という訳で、まずは「ニューラルネットワークとは何ぞや?」というお話から。

Wikipediaによると、

ニューラルネットワーク(Neural network)は、脳機能に見られるいくつかの特性を計算機上のシミュレーションによって表現することを目指した数学モデルである。

ニューラルネットワーク - Wikipedia

という事だそうです。

ニューラルネットワークの概念を超乱暴に描いてみると、こんな感じでしょうか。

特徴としては、以下のような点が挙げられます。

  • ある入力に対して、"適当に"演算して、それなりな出力を返す。
  • ある入力に対する正しい答えが分かっている場合には、答えを教えてあげる事で学習する事ができる。
  • 過去に学習した入力パターンと似ているが、部分的に欠如しているような情報であっても、結果を類推する事ができる。

こんな特徴がある事から、パターン認識データマイニングなんかに利用される事が多い技術です。

上のイラスト中の入力と出力に"A"と書いたのは、うまく学習されたニューラルネットワークであれば、例えば手書きの"A"という画像から、普通のフォントの"A"という画像を想起したりする事もできる、という事を表しています。

ニューラルネットワークの中を覗いてみる

ニューラルネットワークは、多数のニューロンと、ニューロン同士を結び付けるシナプスから成り立っています。

一つのニューロンに注目してみると、その動作原理は非常に単純で、以下のような動きをします。

ニューロンに接続されている複数のシナプスから入力を受け取って、ある関数(f)に従って入力の総量(x)を元に出力値が決まります。シナプスはそれぞれが重み値を持っていて、接続先のニューロンに対しては"入力値×重み"の値を渡します。

これが一つの構成単位となって、網目状にお互いが結び付きあって、全体を構成しています。

脳も基本的にはこんなつくりになっている訳ですが、ミクロな機能としては非常に単純なものなのに、マクロで見ると複雑極まりない思考をする事ができるんだから、何とも不思議なものですよね。

思考と学習の原理

閑話休題…。続いて、ニューラルネットワークによって、どのように思考(入力信号を元に出力信号を得る)・学習(教師信号を元にシナプスを更新する)を行うのか見ていきたいと思います。

思考

ニューラルネットワークは、ニューロン同士の結び付き方によっていくつかの種類に分類されるんですが、今回は階層型ネットワークを採用しました。次のような感じで、入力信号を元に出力信号を得る事ができます。

INが入力層、NNがニューラルネットワーク層、OUTが出力層です。例ではNN層は3個×2層ですが、別にもっと多くても、逆に1つだけでもちゃんと動作します。INとOUTは1層だけで、入力値として1次元の配列を渡すと、出力値として1次元の配列が返ってくるイメージです。

学習が行われない限りはシナプスの重みは変化しないので、入力信号が同じであれば、常に同じ出力信号が得られます。

学習

学習は、"思考"によって得られた結果と、"本来こうあるべき"という結果(教師信号)との差分を元に、適切な結果が得られるように全てのシナプスの重みを調整する事で行われます。

こんな風に、ニューラルネットワークというのは仕組みとしてはそんなに難しいものでもなく、比較的計算量も少ないものなんですが、「いったい、どのくらい精度が得られるものなんだろうか?」とふと疑問に思って、今回、AIポーカーを作ってみた次第です。

後編へ続く…

という訳で、今回は、ニューラルネットワークについての紹介でした。後編では、実際にどうやってAIポーカーの思考ルーチンに組み込んだのかという辺りを書こうと思います。