元々は、一つの学習データ毎にNNに学習させるのだったのですが、学習の能率と安定性を考えると、バッチ単位で学習するほうが良いと思われました。
ことろが、どうしてその後、確率的勾配降下法(stochastic gradient descent, SGD)が有名になって、良く使われることになったのでしょうか。
Q1 : 「確率的勾配降下法SGD」って、一つの学習データを単位に学習するのですね。これは最初の学習法(安定性が悪い)に戻るのではと思いますが、誤解でしょうか。
Q2 :「確率的勾配降下法SGD」を使う場合、**『バッチ正規化』(batch normalization)**という訓練精度を上げるのにとても重要な方法とされるテクニックが利用できなくなる(無意味になる)のではないでしょうか。
ご存知の方説明お願いします。
【結論】
★★★★★★★★★★
「確率的勾配降下法SGD」は一つの訓練データ毎にパラメータを更新するので**『バッチ正規化』**がそもそも対象外。 これは「確率的勾配降下法SGD」にとって非常に不利。
ミニバッチ学習法 と バッチ学習法 なら、batch normalizationを実施可能。
ただし、(R.Shigemori氏より)
オンライン学習の不安定性は欠点と捉えられていましたが、局所解回避しやすいという利点でもあります。さらにいうとこの不安定さはひとつひとつで見るとその通りなのですが、全体で見ると安定した分布を描くので、与えられたデータを頭から順番に計算するよりランダムに選択して計算する処理を繰り返したほうがうまくいくというアイデアがSDGとして結実していると考えるべきでしょう。
ミニバッチ学習ですが、オンライン学習とバッチ学習の利点をうまく取り入れたものとして、メジャー化しています。
★★★★★★★★★★
ミニバッチ学習法 は バッチ学習法 と オンライン学習法を折衷した方法である。
3者の間に数学的な差はなく、loss関数(目標関数)の定義に加味したり、サンプリング順番を工夫したりする程度の差しなかい。
★★★★★★★★★★
バッチ学習法とオンライン学習法とはどっちが先に発明されたかについて、 算法自身からは分からない。
降下法系のoptimizer算法からすると、算法自身が一回の自動変数の更新に利用するサンプル数と関係なく、一回の更新に一つのサンプルを使うか、それとも複数のサンプルを使うかはloss関数の定義による。
一回の更新に一つのサンプルを使うのは自然で、オリジナルだと思われる。これを基本にして、パフォーマンス的な配慮を入れて、複数のサンプル(batch / mini batch)に関する訓練lossの平均値をbatch / mini batch のloss関数とする。
ただ、
1.勾配を利用する以上、loss関数が自動変数(NNのweight)に微分可能でなければならない;
2.共役勾配法の場合、loss関数(目標関数)は二次形である必要:
f(X) = X'AX + bX A: matrix; X: 自動変数vector
日本語版のWikipedia:確率的勾配降下法は『バッチ学習である最急降下法をオンライン学習に改良した物。』
【注】最急降下法 = 勾配降下法( Gradient descent, Steepest descent)
最急降下法をオンライン学習に改良した物を確率的勾配降下法と呼ぶ。
英語版のWikipedia: Stochastic gradient descent
Stochastic gradient descent (often shortened to SGD), also known as incremental gradient descent, is an **iterative method **for optimizing a differentiable objective function, a stochastic **approximation of gradient **descent optimization. It is called stochastic because samples are __selected randomly (or shuffled) instead of as a single group __(as in standard gradient descent) or in the order they appear in the training set.
★★★★★★★★★★
「batch normalization」は非常に重要なテクニック:
【働き原理】内部の共変量シフトを減少させる(Reduce Internal Covariate Shift)
『基本的には、勾配消失・爆発を防ぐための手法である』という説があるが、そのメカニズムを調べる分からず、想像に、layer間の入力データの期待値とスケールがまちまちなので、その微分値のサイズもまちまち、スケールの大きいデータに生成される微分値も大きくて、back-propgationプロセスにおいて大きな影響力を持つに対して、入力データのスケールが小さいlayerがback-propgationプロセスにほとんど影響なし(勾配消失)----不公平!
上記データの極端性についてactivition関数によってある程度和らげるものの、layer間全連結(Full Connection FC)というAffine変換の結果がいつもReLU関数の平坦域に存在すれば、微分値・勾配が依然0になりがち。 もっと効果的な是正方法として、batch normalizationが提案された。batch normalizationは各layer毎に入力データの正規化("白化"+rescaling)を行う。
具体的な効果として、
① 学習レートを大きくすることが可能にして、訓練速度アップ;
② ネットワークの学習プロセスを全体的に安定化させる;
③ NNの初期値の影響を抑える;
④ batch normalizationによって L2正規化 L2正則化 や dropoutが不要になるか必要性が下がるため、過学習を和らげる働きがあると推測。
L2正則化項をloss関数に加える事によってNNパラメータの大きさが制限され、小さければ一部のニューロが存在しないことに等価的で、dropoutの効果と同じ-----これでNNの過学習を回避できる。
※ 『Batch Normalization と Dropout は併用しない方が良い』という話がある。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/21 15:57
2019/03/23 11:07 編集
2019/03/22 14:14
2019/03/24 03:00 編集
2019/03/24 23:43
2019/03/26 23:15 編集
2019/03/26 23:16 編集