初心者プログラマがガチムチプログラマを目指すぶろぐ

2017年の春から本格的にプログラミングを学び始めた学生です!よろしければ閲覧、ご指導のほどよろしくお願いいたします!!

機械学習の勉強を真面目に始めましたわ[part1]

機械学習の勉強を真面目にはじめました!

今回しっかりと基礎から見直そうと思い、入門書を精読することにしました。 具体的には上記の本を精読し、しっかりとゼロから作っていこうかと。 なんとなく難しかったところとかを適当にまとめたり、シンプルに要約したりしてる(つもり)です。とりあえず長くなりそうだったので、畳み込みニューラルネットワークの手前まで!機械学習の基本事項までですかね?

ニューラルネットワークの構成要素

入力ネットワークの構造

入力層、隠れ層、出力層に分けられる。 入力層は例えば、28x28の画像であれば、28x28=784の入力。 隠れ層は何層重ねてもよく、さらにどれだけ縮小しても拡大しても良い。 出力層はクラス分類問題であれば、クラスの数となる。 行列計算と非常に相性が良い構造である。

活性化関数

これらを回帰問題か分類問題かなどに応じて使い分ける。 主に、重みを付与しながらの層から層への情報伝播の後、 各層で行われる処理はこのような関数による変換。

バッチ処理

一回に入力する量を増やす処理。 画像であれば、何枚もの画像を別次元に格納する。 この処理により高速化の恩恵が得られる。

データの学習に関する主な手法

損失関数

損失関数とは機械学習における目標値である。 損失関数から出力される値を最小化することを目標に機械は学習を行う。 主に用いられる関数として下記のものがあげられる。

勾配法

極小値にハマり学習の進まないプラトーという状況に陥ることに注意。
毎回の学習の更新量を定めるパラメタを 学習率 と呼ぶ。 学習率は人間があらかじめ設定する必要があるため ハイパーパラメタ と呼ばれる。

ここまでのまとめ

まとめてみると学習の流れは

  1. ミニバッチ
  2. 勾配の算出
  3. パラメタの更新

これらを繰り返すことになる。この流れを確率的勾配降下法と呼ぶ。 また、ミニパッチ一回分の繰り返しを 1epoch と呼ぶ

テクニック的なものも多分に含む様々な手法

過学習

学習に用いたデータセットに特化した学習を行ってしまい汎化能力が失われた状態。 この状態を避けるために学習データとテストデータを分け、 定期的にテストデータの認識精度も測ることで、 両方の認識精度が向上していることを確認する必要がある。

誤差逆伝播(backpropagation)

微分値によってパラメタを進める方向、量を決めるが、 微分は一般的に重たい計算のため、高速化するために誤差逆伝播法を用いる。 これは各計算を分解、独立化し、chain ruleによって、 独立した計算それぞれに対する微分を考えていくことで、 行列計算として微分計算を行えると言う利点がある。
隠れ層での行列の形状を変化させる計算をAffineレイヤと呼び、 Affineレイヤを含む、上記の活性化関数それぞれに対し、 独立して計算済みのレイヤを実装していくことで、 部品を組み立てるようにニューラルネットワークを実装することができ、 かつ高速に微分計算を行うことができる。

勾配確認

実装の難しい誤差逆伝播法のバリデーションのため、 実装の簡単な数値微分の結果と比較すること。

最適化手法

パラメタの更新のことを最適化と呼ぶ。

上記の4つをこの書籍では取り上げていた。

SGD

最もシンプルな手法。 勾配に学習率をかけたものを次のパラメタ更新に用いる。 欠点として、最小値までの傾斜が等方的でない場合、 ジグザグな動きをすることとなり、学習スピードが遅くなる。

Momentum

前回の学習スピードを保持することで、 同じ方向に進むときは加速度的に進み、 ジグザグな動きをするときはSGDと比べて減速するようにした。

AdaGrad

学習率を定数ではなく変数にする。 過去全ての更新量を記憶し、そのぶん学習率を小さくしていく。 欠点として、学習に長時間かかった場合、学習率が0に近づき、 学習が進まなくなることが挙げられるが、それを改善したRMSProp と言う手法も存在する。

Adam

直感的にはMomentumとAdaGradを組み合わせたようなものらしい

重みの初期値

1を標準偏差としたガウス分布

0と1にアクティベーション(各レイヤの出力)が固まることから 勾配消失が起きているとわかる。

0.001を標準偏差としたガウス分布

0.5付近に固まるため、勾配消失は怒っていないが、 その代わり表現力が小さくなっている。 ある値にアクティベーションが集まると、 単一のレイヤで全てのレイヤを表現できてしまうと言う問題や、 学習が効率よくいかない問題が挙げられる。

Xavierの初期値

前層のノードの数に準じて初期値を小さくする手法。 活性化関数が線形関数(線形関数に近似される関数)の際に用いられる。

Heの初期値

Xavierに2倍の広がりをもたせたもの。 非線形関数に用いられる。

Batch Normalization

データを綺麗な分布にならす手法。 Affineレイヤと活性化関数レイヤの間に Batch Normalizationレイヤを入れて使用する。

  • 学習スピードの増加
  • 初期値に対する依存度の減少
  • 過学習の抑制

などの効果がある。

正則化

過学習を抑制するための手法

Weight decay(荷重減衰)

損失関数に重みに準じた量を加算することで、 大きな重みを持つことにペナルティを課す。

Dropout

確率で、ノードを消去することで何かうまいこと過学習が抑制されるらしい。