ニューラルネットワークについて書きたかった跡地の再開発

None

どうも、Λlisueです。KawazAdventCalendarではニューラルネットワークについて書く予定でしたが時間が取れずにソースコードを貼り付けるという荒業に出てしまい申し訳ありません(笑。

さて、あんなのじゃプログラマでもわからないと思うので少し追記したいと思います。「ニューラルネットワークってなんだろう?」という疑問を持った方は読んでいただけると光栄です。 なお本気で勉強したい人にとってこの記事はなんの意味も持ちません。ニューラルネットワークに関してはググれば良い記事が山ほど出てくるので今回は非プログラマ用の概要説明にとどめます。

ニューラルネットワークとは?

ニューラルネットワークとはコンピューター上で人間の脳の構造を模式したものです。 日本はかなり教育レベルが高いのでご存知かとは思いますが、人の脳には神経細胞(ニューロン:Neuron)と呼ばれる特殊な細胞が大量に詰まっています。個々のニューロンは他のニューロンと軸索(アクソン:Axon)およびシナプス(Synapse)と呼ばれる部分でつながっています。このニューロンは他のニューロンから電気信号として刺激を受け取り、ある一定レベル(閾値:Threshould)以上の刺激が与えられると次のニューロンに電気信号として刺激を送信(発火したという)します。(図参照)

g5213.png

閾値って言葉はあまり聞いたこと無いかもしれませんが、コップに水を溌ぐことを考えていただけるとイメージしやすいと思います。 ニューロン(コップ)はたくさんの前ニューロンから電気信号という刺激(水)を受けます。ある一定のレベル(コップのサイズ)を超えると発火(コップから水が溢れ)します。って感じです。

g5258.png

簡単に言うとこんな仕組みで僕らはみんな生きています。いや、うそ、簡単過ぎる。まぁそれはいいとして「ニューロンのコネクションが重要なんだよ!」と言われてもピンと来ないとおもいます。 なので女性の落とし方を例にコネクションの重要性を見ていきましょう。ジョニーがリンゴを使って金髪子猫ちゃんを物にする、という設定です。ジョニーリンゴを使って金髪子猫ちゃんを物にする、という設定です(笑

  1. 子猫ちゃんは人生で初めてリンゴを食べました。非常に甘くておいしいので脳内ではリンゴ = 甘いという接続(コネクション)が形成されます
  2. 人生においてリンゴを食べるごとにリンゴ = 甘いという接続は太く・強くなっていきます(学習)
  3. そこに目をつけたジョニー君、子猫ちゃんに毎日リンゴをプレゼントしてあげました
  4. 子猫ちゃんにとってジョニーくんは「リンゴをくれる人」です。際限なくリンゴをくれる使い勝手のいい男ですね
  5. 何度も何度もジョニーくんがリンゴを持ってくるので子猫ちゃんの脳内にはリンゴ = ジョニーという接続も形成されていきます
  6. 子猫ちゃんにとって、リンゴはもはや甘いだけの存在ではありません。リンゴという言葉にはジョニー君というイメージまでも含まれてきます
  7. リンゴ = 甘い、リンゴ = ジョニー君 したがって ジョニー君 = 甘い
  8. 「まぁ、ジョニーってば甘い(いい男)のね♡」ジョニー君の作戦は大成功です

g4805.png

まぁ実際の脳の仕組みとはだいぶ異なりますが、コネクションが重要というのはわかっていただけたと思います。各ニューロンを結ぶコネクションの強さが重要になります。

モデル化する

イントロで何が重要だかわかったかと思います。ここから実際にモデル化してみましょう。 先に見たように各ニューロンは軸索を通して他のニューロンとつながっています。各軸索はそれぞれ太さが違い(ようは次のニューロンへの刺激の伝わり安さです)があります。

また各ニューロンが発火するかどうかを決める関数を定義します。先に説明した仕組みに追従するならば前ニューロンからの刺激の合計値がある一定の値を超えたときに1を返すような関数にすれば良いのですが、そうしてしまうと後々で調教するのが面倒になります。詳しい話は省略しますが教育の方法に「バックプロパゲーション」という方法を用いるには発火関数は微分可能である必要があります。ここでよく使われるのは「シグモイド関数」と呼ばれる以下のようなグラフになる関数がよく用いられるので僕のプログラムでもこれを利用しています。

Sigmoid関数
出典: Wikipedia

実際の脳ではニューロンが形成するネットワークは無数に広がっていますが、一般的にニューラルネットワークといえばこのニューロン同士のネットワークを三層に限定した3層パーセプトロンという仕組みを使用することが多いです。三層パーセプトロンでは「入力層(Input)」、「隠れ層(Hidden)」および「出力層(Output)」という三種類の層が存在します。各層に存在する個々のニューロンは次の層のニューロンとつながっています(刺激の流れに方向が存在する)。図では出力層のニューロン数は1個ですが多数の出力を持つ場合もあります。

g5194.png

ネットワークの教育

ニューラルネットワークは「教育」によって各ニューロン同士のコネクション強度を変えていきます。この「教育」に関して詳しく述べると一冊の本になるのでここでは概要の紹介にしますが、主に「バックプロパゲーション」という方法が用いられています。「バックプロパゲーション」とは特定の正解になるべく近くなるように各ニューロン同士のコネクション強度を少しずつ強くしていくという教育方法です。この「少しずつ」というのが味噌で少しずつ値に近づけていくことで未知の問題の結果予想もできるようになります。

まぁ簡単に言うとこんなかんじです。

最後に

なんとなくニューラルネットワークってなんだろうという概要がつかめましたかね?このニューラルネットワークは手書き文字の認識など未知の問題への回答を予測する問題解決に使用できます。 ゲームでの仕様は時系列問題(その時の最善が必ずしも最善とは限らない、過去の行動によって最善行動が変化するなど)があるため単純適用は難しいですが(笑。 書いているうちにだんだん説明が面倒くさくなってきたのは秘密wニューラルネットワークについてはググるといい資料が(日本語でも)たくさんあるので興味を持った方はご自身で勉強してください。

1 AttaQ (@AttaQ)

2013のブログ記事から飛びました。
今更ですがニューラルってこういうものだったのですねー
何となくでしか知らなかったので勉強になりました。

教育についてもゲームで良く感じる(正解への直観、作業に対して指が動くか否か等の)成長と近い気がしますね。
そのものごとにおいていらないコネクションを閉ざすことによって処理を軽く早く正確に特化させて洗練していくのでしょうか。

数の暴力で勝負する量子コンピューターと反対で面白い。
両方の側面で将棋や囲碁等のAIの方向性を見てみたいです。

Only registered users are allowed to comment on the entry. Please log in to comment.