機械学習記12日目 ~ ニューラルネットワーク
▶形式ニューロン
ニューラルネットワークとは、人間の脳にある「ニューロン」という神経細胞を模したプログラムを、複数接続した機械学習システムのことです。
人間のニューロンは、外部から様々な電気刺激を受けて興奮し、やがて別のニューロンに電気信号を出力することで興奮が収束するという性質があります。このニューロンを模して作られたのが「形式ニューロン」(人工ニューロン)と呼ばれるプログラムです(図1)。
形式ニューロンは、「入力(1か0か)×重み」の総和がしきい値を超えていると1を出力し、超えていなければ0を出力するという単純なプログラムです。この計算によって1を出力するか0を出力するかを決める関数を「活性化関数」と呼びます。
「単純パーセプトロン」は、この形式ニューロンを機械学習に利用したものです。
▶単純パーセプトロン
形式ニューロンは通常、入力が1か0のどちらかですが、入力を実数に対応させ、かつ、学習により重みを更新できるように改良したものが「単純パーセプトロン」です。
単純パーセプトロンの構造は形式ニューロンと似ていますが、入力部分を「入力層」、出力部分を「出力層」と呼び、それぞれを構成するパーツをニューロンと呼びます(図2)。
単純パーセプトロンでは、学習することで入力したデータを1か0に分類する「2クラス分類」(2値分類)が可能です。ただし、クラスを分離する境界に直線を用いるため、線形分離可能なデータしか判別できません。したがって、入力データによっては、1に分類されるか0に分類されるか判別できない場合があります。
この単純パーセプトロンが持つ問題を「XOR問題」といいます。
例えば、データと正解ラベルに、ORの関係がある学習データがあったとします。この学習データから、図3のようにラベル1をクラス1、ラベル0をクラス2に分離する決定境界が引けます。
では、図4のような学習データはどうでしょうか。
ANDとNANDは、分離するクラスが逆になるだけで、決定境界の直線は同じです。
OR,AND,NANDときたら、最後はXORですね(図5)。
このように、XORの学習データから直線の決定境界は引けません。これが単純パーセプトロンの「XOR問題」です。
▶多層パーセプトロン
ところが、OR、AND、NANDの判別をする形式ニューロンを多層に組み合わせると、XORの識別ができることが分かっています(図7)。
つまり、形式ニューロン(単純パーセプトロン)を何層も組み合わせることで、複雑な決定境界を引けるようになる、これが「多層パーセプトロン」です。
多層パーセプトロンでは、入力部分を「入力層」、出力部分を「出力層」、その間にあるパーセプトロン「隠れ層」(中間層)と呼び、この隠れ層を2重3重と増やすことで複雑な決定境界を引くことができるようになります(図8)。
そして、このような多層パーセプトロンを利用した機械学習システムを「ニューラルネットワーク」と呼びます。
▶多層パーセプトロンの活性化関数
ニューラルネットワークの活性化関数には、ロジスティック回帰で登場した「シグモイド関数」が利用されていましたが、最近は「ReLU (Rectified Linear Unit)関数」が用いられます。
ReLU関数は、入力が0を超えていれば入力をそのまま出力し、0以下なら0を出力する関数です(図9)。
ちなみに、入力をそのまま出力する関数のことを「恒等関数」と呼びます(図10)。
ニューラルネットワークで分類を行う際、出力層の活性化関数に「ソフトマックス関数」(正規化指数関数)を採用することがあります。ソフトマックス関数は、出力がどのクラスに分類されるかを、確率で出力するために使われます(図11)。
単純パーセプトロンでは更新する重みベクトルは1つですが、多層パーセプトロンの場合、どの順番でパーセプトロンが判断したのかによって、更新する重みが変わります。
ニューロンを逆にたどりながら重みを更新するアルゴリズムとしては「誤差逆伝播」(バックプロパゲーション、Backpropagation)が有名です。
とりあえず、ニューラルネットワークの考え方は理解しました。次は、scikit-learnで試してみたいと思います。