パーセプトロンの収束に学習率が関係ないのは初期値が0のときだけ
前回の記事でパーセプトロンの収束には学習率が関係ないということを検証した.前回に言及するのを忘れていたが,重みベクトルの初期値が0でない場合は一致しない気がする.というわけで初期値が0でない場合には学習率によって収束までの誤り回数が変化することを確認する.
前回のコードの重みベクトルの初期値の部分だけ書き換えて再び実行してみる.学習率は上から100, 10, 1, 0.1, 0.01, 0.001.
- wvec = [1.0] * wvec_size の場合
% python perceptron.py toy.txt Converged. Error count=54884 [3348801.0, 226.06249997977648, -19032.551200037629] Converged. Error count=55332 [337361.0, 2.9031399996479195, -1935.9149800046262] Converged. Error count=55045 [33598.0, 0.8705759999159568, -189.90208100040871] Converged. Error count=55711 [3393.8999999980088, -0.066518400001122302, -19.657670100016219] Converged. Error count=56392 [343.55999999983254, -0.025139169999773725, -1.9660564600026147] Converged. Error count=53663 [33.471000000012694, 0.0022932369999100893, -0.18949181800067472]
学習率によって収束までの誤り回数が変化した.ほら,学習率が小さい方がいいでしょ! と言いたくなったけれど,別の場合も検証するかと重みベクトルの初期値を今度は[-1, -1, ..., -1]にしたところ
- wvec = [- 1.0] * wvec_size の場合
% python perceptron.py toy.txt Converged. Error count=55532 [3382999.0, 78.132199979674624, -19242.433800038201] Converged. Error count=56414 [342959.0, -50.088410000344538, -1932.3852700046682] Converged. Error count=55366 [33755.0, -0.23962600008422896, -191.07075200040958] Converged. Error count=55056 [3357.3999999980419, 0.11958949999896262, -18.985869600015949] Converged. Error count=55830 [339.37999999983634, -0.014409209999749817, -1.9223932400025676] Converged. Error count=58529 [34.781000000009641, -0.0083143650000968711, -0.19700559900071246]
という結果を得た.うーんよくわからん.これだけでは一般化が難しい.とりあえずここまでのまとめ
- 線形分離可能な場合,パーセプトロンの収束に学習率は影響しない.分離超平面も変わらない
- ただし,重みベクトルの初期値が0のときに限る.
- 重みベクトルの初期値が0でない場合,学習率によって収束の速さはまちまち.
ということを確認した.おそらく誰でも知っている当たり前のことなのだろうけれど,ようやく自分自身が理解できた気がする.
PRMLを読み返していたらPRML上巻にこのことが「しっかりと」書かれていたorz
ここで,ηは学習率パラメータであり,τは整数で,アルゴリズムのステップ数を表す.wに定数を掛けても,(4.52)のパーセプトロン関数y(x, w)は変化しないので,一般性を失うことなく学習率パラメータηを1に設定することができる.学習中に重みベクトルが変化すると,誤分類されるパターンの集合が変化することには注意されたい.
(PRML日本語訳(上) p.192)
学習中に重みベクトルが変化というのは初期ベクトルが0でなかったり,パーセプトロンによる更新以外で重みベクトルを変化させた場合のことを指していると思われる.
教訓: 教科書はちゃんと読みましょう.