ココンの情報をいつでも、どこでも。ココントコ。

エンジニア 2018.06.21

プログラミングなし!Simbrainで学ぶニューラルネットワークの基礎 -前編-

AI戦略室の坂本です。
以前行ったKaggleのハンズオンの際に、もっとニューラルネットワークの動作原理などについて解るようなハンズオンを行って欲しい、という要望があったので、機械学習の初心者を対象にして、ニューラルネットワークの動作を一つ一つ眺めながら触って貰おう、というハンズオンを行いました。
題して、
『プログラミングなし!Simbrainで学ぶニューラルネットワークの基礎』
ニューラルネットワークについて簡単に触って貰う事が目的で、特に実用的な用途があるわけではありませんが、お付き合いください。

目次

Simbrainとは

Simbrainとは、Javaで作成されたニューラルネットワークの学習用ソフトウェアで、ビジュアル的な操作で人工ニューロンを繋げて、ニューラルネットワークを作成する事が出来るツールです。
また、人工ニューロン間の情報の伝播を、ステップ毎に見ながらニューラルネットワークの動作を監視することが出来るので、ニューラルネットワークの動作原理から学びたいという目的にはぴったりで、Simbrainでニューラルネットワークの雰囲気をつかんで貰ってからChainer等に移行すれば、より理解が進むことでしょう。
今回は、いきなりプログラムのコード作成から入ってしまった以前のハンズオンの反省を踏まえて、そもそもニューラルネットワークって何?という人に対して、ニューラルネットワークとはこんな感じのものだよ、という感覚をつかんで貰うためのハンズオンとなります。
因みにこのハンズオンの内容は、以前私が寄稿した雑誌記事(日経ソフトウエア 2017年 9月号 / 日経BPパソコンベストムック「いろいろ動かしながら学ぶ!プログラミング入門」)の内容をベースに、紙面の都合で紹介しきれなかった内容を追加したものになります。
今回は繁忙期真っ只中の業務時間中に行うという鬼畜の所業な時間設定ながらも、ある程度の参加者がハンズオンに来てくれまして、勉強熱心さに頭が下がる思いでした。

ニューラルネットワークについてのおさらい

まずはニューラルネットワークについてのおさらいからです。
そもそもニューラルネットワークは、人工知能開発の歴史から見ると非常に古くからあって、そもそもの初めは人間の脳を模倣するプログラムを作成する、という発想から始まりました。

当時は生きている脳を直接観測する術はなかったので、脳のモデル化はほとんど手探りで行われてきましたが、脳細胞(ニューロン)の動作を模倣するプログラムを作成し、そのプログラムを多数繋げることで、脳の模倣が出来ないか、という研究がなされていました。

その例がボルツマンマシンなどに代表される初期のニューラルネットワークで、多数の人工ニューロン間で情報が伝播することで、ニューラルネットワークのステータスが動的に遷移してゆくことになります。
しかし、このようなニューラルネットワークは実用的な用途には不向きだと言うことで使われなくなってゆき、代わりに順伝播型ニューラルネットワークと呼ばれるニューラルネットワークが台頭します。
これは、誤差逆電波法というアルゴリズムにより機械学習を適用することで、入力に対する出力をデータとして学習させることが出来る、という、より実用的な機能が重宝されたためです。
現在では、脳の中のニューロンの接続をそのまま再現することでニューラルネットワークを作成しようというアプローチではなく、箇々の目的に対して適応するように設計されたニューラルネットワークを使用し、機械学習によってデータを学習させることで、目的の機能を持ったAIを作成しよう、というアプローチがニューラルネットワークの主流になっています。
なので、強いAIか弱いAIか、という観点から見るとニューラルネットワークは、当初は強いAIを目指して人間の脳の模倣を目指していたものが、後になり弱いAIとしての実用用途が主流になった、と言うことが出来ます。

人工ニューロンを繋げてみる

Simbrain自体はJavaで作られたツールで、Java実行環境があればOSを問わずに実行することが出来ます。そこで環境構築については飛ばして、とりあえずSimbrainを触ってみるところから始めることにします。
まずは、以下のコマンドを実行してSimbrainを起動します。

するとSimbrainの画面が立ち上がるので、子ウィンドウの「Insert」→「Add Neuron」を3回ほど選択して人工ニューロンを作成します。また、そのうちの幾つかをSource Neuronに設定します。

ここでは上のボルツマンマシンの図に習って、全ての人工ニューロンがお互い接続する形のニューラルネットワークを作成します。
それにはメニューの「Edit」→「Connect Neurons」→「All to All」を選択します。

そして、データをランダムに初期化した後、スペースキーを押すと、その都度ニューラルネットワークに情報が伝播し、人工ニューロンの状態が変化してゆきます。

3つの人工ニューロンを作り、適当にランダムで初期化すると、だいたいの場合、ニューラルネットワークのステータスは振動パターンに陥り、1と−1の値が繰り返し循環して現れる状態に落ち着きます。

このニューラルネットワークの最終ステータスを、目的となる機能(Source Neuronに対する入力に対して、目的となる出力)を実現するように人工ニューロン間の接続を作成または機械学習することが、ボルツマンマシンの実装となります。

順伝播型ニューラルネットワークを作ってみる

これだけでは何をやっているのか解らないでしょうから、もう少しだけ実際的なニューラルネットワークも作成してみます。
実際的なニューラルネットワークということで、ここでは順伝播型ニューラルネットワークに対して教師データから逆伝播を行い、機械学習によるパラメーターの作成を行います。
まずは機械学習させるデータを用意します。

まず±1.0の範囲にランダムな数値を60個用意し、それぞれXとY座標からなる30個の点にします。
なお、このハンズオンで使用したデータファイルは全て、以下のURLにあるプログラムを使用して生成することが出来ます。
https://github.com/cocon-ai-group/simbrain-handson-makedata

用意した30個の点をどうするのかというと、それを上の図にあるような二つの領域にクラス分類します。
そのために、それぞれの点がどの領域に属しているのかを表すファイルも用意します。

次に、Simbrainにもどって子ウィンドウの「Insert」→「Insert Network」→「Backprop」を選択し、上の図のパラメーターを入力します。

すると上のように、2層だけからなる単純なニューラルネットワークが作成されました。
中間層の存在しない入力層と出力層のみからなるニューラルネットワークですが、一応これでも順伝播型ニューラルネットワークとして動作することが出来ます。

ニューラルネットワークの数学的解析

さて、このニューラルネットワークには4つの人工ニューロンしか含まれていないので、その動作について人間が頭で考えることは、まだ可能なレベルです。
そこで最初は、このニューラルネットワークがどう動作するか、頭で考えてみることにしましょう。

まず、それぞれの人工ニューロンは相互に接続されていますが、人工ニューロンの動作としては、全ての入力値に重みを掛け合わせた上で、足し合わせることになります。
さらにその結果と、活性化関数であるsigmoid関数へと入力すれば、人工ニューロンの出力値が計算できます(Simbrainでは出力値のバイアスは使用しない)。

ここで、入力値に掛け合わせられる重みが、ニューラルネットワークの学習パラメーターとなります。ここでは4つの接続が存在するので、その重みをa,b,c,dとすれば、ニューラルネットワークの目指す動作は上の図のように定義できます。
そして、aとb、cとdがそれぞれ逆の符号で、かつ絶対値ができるだけ大きくなるようになれば、ニューラルネットワークの出力として上の図のような分類が可能になる事が解ると思います(連立方程式とSigmoid関数のグラフをよく眺めてください)。

機械学習によるパラメーターの作成

ニューラルネットワークの動作原理について、数式での理解が出来たら、実際に機械学習によって目的の機能が作成されることを確認します。
まずは機械学習の設定を行います。
各接続の初期値をランダムに初期化したあと、学習アルゴリズムのパラメーターを指定します。
Simbrainでは、Momentum SGDを使用して学習を行うので、Learning Rateの他にMomentumの値も設定する必要があります。

そして、作成した30個の点とそれぞれの点の属する分類を学習させます。

学習が終わった後、Simbrainの画面からパラメーターがどのように変化しているかを確認します。


各人工ニューロン間の接続のパラメーターは行列として作成されるので、上の図のようにSimbrainの画面からその値を確認することが出来ます。

Simbrainでは重みのパラメーターは10.0でクリッピングするので、絶対値の上限は10.0です。
ニューラルネットワークの動作を数式から解析したときに、「aとb、cとdがそれぞれ逆の符号で、かつ絶対値ができるだけ大きくなるように」なればニューラルネットワークは正しく動作するとなった事を思い出してください。
正しく学習が行われれば、上の図のように、ほぼ10.0と-10.0に近い値が作成されて、「aとb、cとdがそれぞれ逆の符号で、かつ絶対値ができるだけ大きくなるように」という条件に合致する結果となっているはずです。

続きます

イベントインタビュー広報 2020.01.31

「OpenID Summit Tokyo 2020」参加レポート

広報の馬場です。4年に一度のOpenIDの祭典「OpenID Summit Tokyo 2020」が渋谷ストリーム・ホールにて1月2…

イベントインタビュー広報 2019.11.11

世界のハッカーが競う「DEF CON CTF Finals 2019」参加者インタビュー

広報の馬場です。 DEF CONの人気コンテンツの一つである「DEF CON CTF」は、熾烈な予選を勝ち抜いたチーム…

エンジニア 2019.08.23

危険すぎると話題の文章生成モデル「GPT-2」で会社紹介文を生成してみました

ココングループのAI TOKYO LABの細川です。AI、特にディープラーニング系のホットな技術を実際に動かすと…