Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

ADALINEを実際に試してみる

パーセプトロンの時と同様に、アヤメのデータを使ってADALINEの挙動を見てみましょう。

numpyの行列表記を使ってやれば、前回のパーセプトロンのコードを少しいじるだけでいけそうです。

以下のスクリプトは、学習率と最大エポック数を変化させて4通りの結果をグラフで出力します。

学習率:0.01 最大エポック数:20 の結果

左上からエポック毎の重みの変化、正答率の変化、コスト関数の変化、また学習後の決定領域を示しています。

学習率が0.01では、重みとコスト関数が発散しており、全く学習できていません。

f:id:darden:20160817194008p:plain

学習率:0.0001 最大エポック数:20 の結果

学習率を0.0001とものすごく小さくしてやるとエポック毎のコスト関数が小さくなっており、学習されているのがわかります。

しかし重みもコスト関数もまだ一定値に収束しておらず、20回のエポックループでは学習が足りていません。

f:id:darden:20160817194032p:plain

学習率:0.0001 最大エポック数:400 の結果

エポックループを400回にしてやると、ようやく重みとコスト関数が収束します。

学習率を小さくすると、それだけ重みを更新する量が小さくなり、学習のスピードが遅くなります。

f:id:darden:20160817194713p:plain

学習率:0.01 最大エポック数:20 の結果(特徴量を標準化)

学習率を小さくしないとだめ。しかも学習のスピードが遅いとなると、いいとこ無しに見えますが、特徴量を標準化してやるとこの問題は解決します。

20回のエポックループでコスト関数が収束しており十分学習できているのがわかります。

f:id:darden:20160817194143p:plain

特徴量の標準化について

この例では特徴量として、がく片の長さと花びらの長さを用いてますが、長さのスケールが2つの特徴量で異なっています。

特徴量の標準化とは、各特徴量を同じスケールに変換してやることを意味しています。

ここでは各特徴量で平均と標準偏差を算出し、元の特徴量データからその平均を引き標準偏差で割る操作をしています。

各特徴量の平均値

{\displaystyle
\mu_j = \frac{1}{m} \sum_{i=1}^{m} x_{ij}    \tag{1}
}

各特徴量の標準偏差

{\displaystyle
\sigma_j = \sqrt{ \frac{1}{m} \sum_{i=1}^{m} ( x_{ij} - \mu_j )^{2} }    \tag{2}
}

標準化された特徴量

{\displaystyle
x_{ij}^{ \prime } = \frac{x_{ij} - \mu_j }{\sigma_j}    \tag{3}
}

{i}{j}はそれぞれトレーニングサンプル、特徴量のインデックスを表し、{m}はトレーニングサンプル数を表しています。

標準化により、各特徴量が平均0、標準偏差1のデータとなり、同じスケールで比較することができるようになります。

勾配降下法は、特徴量の標準化により最適化効率改善が顕著に現れるアルゴリズムです。