LoginSignup
13
15

More than 5 years have passed since last update.

深層学習 第3章 確率的勾配降下法

Last updated at Posted at 2017-01-19

第2章に引き続き、機械学習プロフェッショナルシリーズ(MLP)の第3章を読み進めていきます。
本投稿(連載)を一緒に読めば事前知識なしでも読み進められる...といったものを目指しています.

本章の内容

前章で定義した誤差関数からパラメータを導くための方法である、
確率的勾配法のアルゴリズムにまず触れます。
その後、過適合(overfit)の問題とその対策について述べます。

本文詳細

勾配降下法ではどのパラメータに対して勾配を計算する?

すべてのパラメータに対する勾配を計算し、
誤差関数を最小化するように、パラメータを更新していく。

非線形関数の最小化手法の中から勾配降下法を使う場合とは?

非線形関数の最小化手法の中では,
勾配降下法は単純なアルゴリズムで,収束が遅い.
またハイパーパラメータの設定により,収束が大きく変化するという使いにくい点も持つ。

他にも目的関数の二次微分を利用するニュートン法などがあるのだから、
通常は勾配降下法をわざわざ使わない.
使うとしたら,問題の規模が大きく,目的関数の二次微分の計算が難しい場合など.
DNNはその場合に相当する.

バッチ学習と比較して、確率的勾配降下法(SGD)の利点は?

訓練データに冗長性がある場合、
計算効率が向上し、学習を速く実行できる。

また、局所解にトラップされるリスクを低減できる。
バッチ学習の場合、最小化する目的関数はつねに同じなので、望まない局所解にトラップされると、二度とそこから抜け出せない。
しかし、SGDでは目的関数が更新ごとに異なるため、そのようなリスクが小さくなる。

じゃあなんでミニバッチ学習をするのか?

SGDには欠点もあるため。
たとえばある更新で、利用する訓練データが外れ値の場合、おかしな方向にパラメータを調整してしまう。
なので、複数の訓練データをサンプルとして利用することで、「大体正しい方向にパラメータを動かす」ことを目指す。
ただし、バッチで使う訓練データを増やしすぎると、上記で述べたような極小解にトラップされるので、
そのハイパーパラメータの調整は必要。

ネットワークの自由度が高いほど、学習時に誤差関数の浅い局所解にトラップされやすくなるのはなぜ?

ネットワークの自由度が大きいときというのは、パラメータが多いとき。

定性的に考えてみるとわかる。
1変数のときでも局所解にはまる恐れはある。
でも2変数のときは1変数のときよりももっと局所解にはまりやすい。
局所解を浅い穴、最適解を深い穴とすると、変数が増えるにつれ、浅い穴が増えるイメージ。

パラメータが多いとそれだけ、浅い穴にハマる可能性が高くなる。

過適合(局所解にトラップされるの)を防ぐための重みの正則化とは?

過適合を防ぐために重みの正則化を行う。
最も簡単な正則化は、重みになんらかの制約を加えること。
よく使われるのが次のように、誤差関数に重みの二乗和を加えて、これを最小化すること。

E_t(w) \equiv \frac{1}{N_t}\sum_{n \in D_t} E_n(w) + \frac{\lambda}{2} || w ||^2

$\lambda$は正則化の強さを制御するハイパーパラメータで、一般に$\lambda=0.01や0.00001$程度から選ぶ。

重みが極端な値になってしまうと、そのノードの影響が支配的になってしまい、層を重ねて表現力を上げる目的が達せなくなってしまう。
この状態を防ぐために、重みを大きくならないようにすれば過適合を防げるという理屈(と理解した)

白色化とはなにか?

成分間の相関を0にする変換のこと

Adagradとはなにか?

ニューラルネットの学習では学習係数${\eta}$の調整が重要
学習係数の減衰(learning rate decay)が常套手段
最初は大きく学習して、次第に小さく学習するようにする

学習係数の減衰をさらに発展させたのがAdaGrad
Adagradでは1つ1つのパラメータに対して,オーダーメイドの値を設定する

h \leftarrow h + \frac{\partial L}{\partial W} \odot \frac{\partial L}{\partial W} \\\
W \leftarrow W - \eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial W} 

${h}$は,これまで経験した勾配の二乗和を保持
パラメータ更新の際に,$\frac{1}{\sqrt{h}}$を乗算することで学習のスケールを調整
パラメータの要素の中でよく動いた要素は,学習係数が小さくなる.

重みの初期化はどうすればよい?

学習開始時に重みの初期値を決める必要があるが、その一般的な方法は正規分布から生成したランダム値を初期値とする方法。
ただその場合にガウス分布の標準偏差 $\sigma$ をどう選ぶかで学習結果に影響を与える。
この $ \sigma $をちょうどよい大きさでないと、活性化関数の出力がその値域の中でちょうどよい範囲にこなくなるから。

基準としては、
あるユニットへの総入力 $ u_j = \sum_i w_{ji} x_i $がちょうどよい分散を持つように $\sigma$ を決めるのがよいといえる。
あるユニットへの挿入力の分散を $\sigma_u^2 $にしたいときには、

$$
\sigma =
\sigma_u / M^{1/2}
$$

とするように値をとるのがよい。ただしMはあるユニットへの入力結合の数。

次は...

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15