機械学習のお勉強(単層ニューラルネットワーク)
人工ニューロン
神経細胞を2値処理を行う単純なゲートとして表現。
z = w0 * x0 + w1 * x1 + .... + wm * xm and phi(z)={ 1 (z>=0) or -1 (z<0)
これは脳内の一つのニューロンの働き(発火するかしないか)を模倣している。
パーセプトロンの学習規則
- 重みを0 or 値の小さい乱数で初期化する
- トレーニングサンプルxjごとに以下の手順で実行
- 出力値を計算(上記で言う1 or -1)
- 重みの更新
重みの更新方法
- wj = wj * delta wj <- delta wj = myu * (y - y^) * xj
- delta w0 = myu (y - y^)
- delta w1 = myu (y - y^) * x1
- delta w2 = myu (y - y^) * x2
このように重みすべてが更新されるまでy^は再計算されない。
パーセプトロンの収束性
- 2つのクラスが線形分離可能な場合
- 学習率が小さい場合
に限られる
ADALINEと学習の収束(Adaptive Linear Neuron)
重みの更新方法がパーセプトロンと異なる
単位ステップ関数ではなく、線形活性化関数に基づいて重みが更新される
目的関数
クラスラベルと計算結果の誤差平方和
J(w) = 1/2 sum(y - phi(z))2
z = w * x
特徴
線形活性化関数により、微分可能
凸関数出るため勾配降下法を用いて目的関数を最小化する重みをみつけることができる
重みの更新(バッチ勾配降下法)
w = w + delta w delta w = - myu * sum ( y - phi(z) ) * x z = w * x
重みの更新はトレーニングデータセットすべてのサンプルに基づいて計算する(バッチ勾配降下法)
パフォーマンスを上げるポイント
特徴量のスケーリング!
X_std = (X - X.mean()) / X.std()
平均を引き、標準偏差で割る。平均0 , 標準偏差を1にする。
確率的勾配降下法
w = w + delta w delta w = - myu * ( y - phi(z) ) * x z = w * x
sumがない分高速に収束させることができる。その分1サンプルの影響を受けるためノイズが多い
また、データが追加されれば随時学習するオンライン学習が可能
ポイント
エポックごとにトレーニングデータをシャッフルして循環を避ける
適応的学習率を使う(ex: myu = a / (iter回数 + b))
ミニバッチ学習
確率的・バッチ勾配降下法の折衷案
すべてをバッチとするわけでなくいくつかを抽出し、ミニバッチとして学習する
ロジスティック回帰(クラス確率のモデリング)
名前とは裏腹に回帰ではなく分類のためのモデル
線形分離可能なクラスに関してのみ有効
logit(p) = log p / (1 - p) logit(p(y = 1 | x)) = w * x = z p = phi(z) = 1 / (1 + e^-z)
p : シグモイド関数
サンプルがクラスに属している確率が予測できる(天気予報や医療診断などに用いられる)
尤度関数
0,1の2クラス分類より以下のように表せる
L(w) = PI (phi(z))^y (1- phi(z))^(1-y)
コスト関数
J(w) = sum (-y * log(phi(z)) - (1 - y)* log(1 - phi(z)))
実装
ADALINEのコスト関数を上記に置き換えるだけ
過学習・学習不足
データに対してモデルが複雑・簡単すぎるときに発生する
過学習をするモデル(偶発誤差):「バリアンス(分散?)が高い」という
学習不足をするモデル(系統誤差):「バイアス(平均?)が高い」という
モデルの汎化誤差 = バイアス2 + バリアンス + ノイズ
バイアスとバリアンスの調整手法(L2正規化)
lambda * || w || ^2 / 2 = lambda * sum(w^2) / 2
TODO:バリアンスとバイアスのトレードオフについて調査