読者です 読者をやめる 読者になる 読者になる

Masaponto's Blog

お勉強メモ

多層パーセプトロンを実装してみた

こんにちは。
Aizu Advent Calendar 2014 19日目の記事です。

前の人 @takuti
会津若松〜東京間の高速バス(往復約8時間)に日帰りで4月から9月まで毎週乗った話 - きたくち

機械学習アルゴリズムである多層パーセプトロンを実装したので、それについて書きます。
間違えや、Pythonについて教えてください。
厳密性は犠牲になりました。

多層パーセプトロン

単純では

単純パーセプトロンの式はこれでした。

{ \displaystyle
\ f( g(\boldsymbol{x}) ) = f( \sum_{i=1}^{N} w_i x_i ) = f( \boldsymbol{w}^t\boldsymbol{x} )\
}

ここで簡単のため、特徴ベクトルの次元 N = 3 とします。

{ \displaystyle
\ f( g(\boldsymbol{x}) ) = f( \sum_{i=1}^{3} w_i x_i) = f( \boldsymbol{w}^t\boldsymbol{x})\
}

さらに、この式を図で表すと次のようになります。

f:id:masaponto:20150608232424p:plain

左の入力層の x1, x2, x3 が特徴ベクトルxの要素。
出力層のwが重みベクトルです。

見方としては、まず入力層にベクトルxの要素のx1, x2, x3 が入ります。
その後、出力層で特徴ベクトルxと重みベクトル w内積計算をし、
最後に活性関数が適用され結果が出るていう流れです。

多層パーセプトロン

一方、多層パーセプトロンの式はこれ (厳密ではない) です。(中間層1層、ユニット数2)

{ \displaystyle
\ y = f( \sum v_k   h(  \sum w_i x_i )  ) = f( \boldsymbol{v}^t  h( \boldsymbol{w}^t\boldsymbol{x}) )\
}

wは中間層の重み、v は出力層の重みです。
図はこれです。

f:id:masaponto:20150608232627p:plain

まさに、単純パーセプトロンの式を2回適用した感じですね。
図を見ると、多層と呼ばれる由縁がわかると思います。
図では2クラス分類の場合のため、出力ユニットがひとつです。 他クラス分類では、クラス数の数だけ出力ユニット用意します。

重み修正 ~誤差逆伝搬法 (バックプロパゲーション)~

多層パーセプトロンでの重み修正方法は誤差逆伝播法というものがよく使われます。
誤差逆伝播法はバックプロパゲーションとも呼ばれます。

詳しくは下記のリンクを参照してください。

多層パーセプトロンによる関数近似 - 人工知能に関する断創録

多層パーセプトロン-Stephen Machine Learning- - gerumaniumの日記

Pythonで多層パーセプトロンの実装例 - stMind

田舎な爺だ 多層パーセプトロンの仕組み

実装

上記のサイトを参考にPython3で実装してみました。
中間層は1層での合計3層の多層パーセプトロンです。
活性関数は中間層、出力層ともに、シグモイド関数
重み修正法はバックプロパゲーションです。

多クラス分類、公開されてるデータ・セットに対応させたコードはこちらを参照してください github.com

今回は、多層パーセプトロンを用いて、XOR問題をといてみました。 XOR問題は、線形分類不可能のため前回の単純パーセプトロンでは分類することができません。

gistb2eab035acc8198a1f4b

ちなみに、XORの真理値表はこれ。

f:id:masaponto:20141219003545p:plain

結果

中間層のユニット数2, 出力層1です。 また、学習率0.5でやってみました。

[1, 1]:[ 0.50196166]
[1, 0]:[ 0.9771374]
[0, 1]:[ 0.97709995]
[0, 0]:[ 0.01843416]

また、中間層ユニット数を5にしてみたら。精度が上がりました。

[1, 1]:[ 0.01694916]
[1, 0]:[ 0.98602664]
[0, 1]:[ 0.98414518]
[0, 0]:[ 0.0134073]

おわり

出力層のユニット数を増やすことで、多クラス分類できるそうなので、実際に何かを(識別)認識させてみたいと思います。

参考

多層パーセプトロンによる関数近似 - 人工知能に関する断創録

多層パーセプトロン-Stephen Machine Learning- - gerumaniumの日記

Pythonで多層パーセプトロンの実装例 - stMind

田舎な爺だ 多層パーセプトロンの仕組み

多層パーセプトロンの動きを可視化する - StatsFragments