多層パーセプトロン
#アルゴリズム
線形分離不可能な問題を解く
ニューラルネットワークで触れたように、シグモイド関数によるニューロンのモデルは、ひとつだと線形分離しかできない
しかし、これを素子(ユニット)とし、たくさん組み合わせると、線形分離不可能な問題も解けるようになる!
組み合せ方はさまざまなものがあるが、最も基本的なものとして、信号が一方向にのみ流れるフィードフォワード型のニューラルネットワークとして、多層パーセプトロンを取り上げる
多層パーセプトロン
下の図は、入力層―中間層―出力層の3層からなるニューラルネットワーク
各層の丸はニューロン(ユニット)。各層の間で、ニューロン同士は結合し、その結合ごとに結合重み(シナプス伝達強度にあたるもの)をもつ
https://gyazo.com/a50ec037b8d16d901f6b9a81f5f41b0c
図は1.17. Neural network models (supervised) — scikit-learn 1.1.3 documentationより引用
中間層は2つ以上の複数の層にすることもできるが、総称して多層パーセプトロンという
上図の場合は三層パーセプトロン
流儀によっては入力層をカウントせず二層パーセプトロンと呼ぶこともある(そのほうが主流?)
このようにユニットを多層に配置することで、原理的には任意の非線形関数を近似できる(universal approximator)
この層を何重にも配置して「深く」したものが深層学習(ディープラーニング)※非常に粗い説明です
この「深い」構造により有効な特徴量を抽出することができ、大量のデータを学習させることで、性能を大きく向上させた……といわれている
各層の機能
入力層は、説明変数の各変数の値をそのまま次の層へ渡す
中間層の各ユニットは、入力層ユニットの線形結合(各説明変数の値に結合重みをかけたものの総和)を非線形変換する
伝統的にはシグモイド関数などのS字型関数、近年はReLU関数を用いることが多い
出力層のユニットは、中間層ユニットを線形結合することで、モデルとしての最終出力を行う
この出力をそのまま用いると非線形回帰モデルになる
出力にシグモイド関数やソフトマックス関数を適用することで、分類モデルにもできる
前者だと二値分類、後者だと多クラス分類におけるクラス所属確率を表現することができる
$ f(x) = \frac{1}{1 + \exp(-x)}(シグモイド関数)
$ f_i(x_1, x_2, \dots, x_k) = \frac{\exp(x_i)}{\sum_{k=1}^K \exp(x_k)}(ソフトマックス関数)
多層パーセプトロンの学習
バックプロパゲーション(back propagation; 誤差逆伝播法)とよばれる勾配法によって結合重みを調整する
モデルと出力の誤差を前の層へ「伝播(propagate)」させることで多層の結合重みを逐次修正する方法
誤差を小さくする方向へ重みを「少しずつ繰り返し修正していく」ことで、「データに合う」ような重みを「学習」できる
「誤差を小さくする方向」は二乗誤差を重みパラメータで微分することで見つける(=勾配法)
多層パーセプトロンのライブラリ
scikit-learnではsklearn.neural_network.MLPClassifierなど
https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier
scikit-learnだけでなく、keras, pytorch, chainer, tensorflowなど、ニューラルネットワーク(深層学習)のためのライブラリも数多い