質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3630閲覧

「確率的勾配降下法SGD」と『バッチ正規化』テクニックとの相性について

OOZAWA

総合スコア45

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/20 02:24

編集2019/03/27 16:05

元々は、一つの学習データ毎に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 は併用しない方が良い』という話がある。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Q1について
確率的勾配降下法は、その内部でランダムにサンプリングしたデータを使って勾配降下法を適用するものです。おおまかにいうと、1万件のデータから内部的に1000件を抽出して学習するという処理を繰り返すというものです。したがって、『一つの学習データを単位に学習する』という理解は違うように思います。

Q2について
通常のニューラルネットワークの場合、optimizerはコスト関数に対して適用されます。一方、batch normalizationはコスト関数より前に実行されます。よってbatch normalizationが有効の有効性とoptimizerに何を使うかはほぼ無関係と思われます。batch normalizationの効果に影響するものということでいえば、ミニバッチ学習のバッチ単位のほうかもしれません。この段階で1件ずつ学習させるとした場合は、質問に記載のようにbatch normalizationの効果がでないかもしれません。

投稿2019/03/21 15:51

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/03/21 15:57

フォーマルな説明かどうかはわかりませんが、「確率的勾配降下法=オンライン学習(1データずつ勾配を計算して更新)」という説明のサイトや文献をよく見るので、Q1については違うとは言い切れない気がします。
OOZAWA

2019/03/23 11:07 編集

R.Shigemori様 ご解説ありがとうございます! 「1000件をランダムに抽出して学習するという」のはまさに「ミニバッチ学習法」と思いますけれども。。。 「確率的勾配降下法SGD」だと hayataka2049様が指摘された事に同感を抱いています。
R.Shigemori

2019/03/22 14:14

オンライン学習は、ミニバッチ学習・バッチ学習と対比する形で説明されるケースしか見たことがありませんでした。その上、ミニバッチ学習の説明は確率的勾配降下法の説明をほぼ同じなので、私のなかではオンライン学習はモデラーが意図的に確率勾配降下法と同じ状態を作り出すテクニックと理解していました。ちなみにsklearnに実装されているSDGはデフォルトは1件ずつ学習させるオンライン学習ですが、ミニバッチ学習もメソッドとして用意されていることから、ミニバッチ学習はオンライン学習を一般化したものということなのでしょう。実際、tensorflowで実装する際、バッチサイズ=1としてミニバッチ学習させればオンライン学習になります。 なお、バッチ学習は、ミニバッチを指定しないコード(よってfor文がネストしない)になるのでミニバッチとは感じが異なるので、私のなかでは別物となっています。
OOZAWA

2019/03/24 03:00 編集

R.Shigemori様お返答有難うございます。 いい勉強になりました。 自分の理解を整理して書いてみますが、正しいかどうか、もう一度ご意見をお伺いしても宜しいでしょうか。 ① もともとは一つのサンプル(学習データ)毎にNNのパラメータを更新します。これは所謂「オンライン学習法」 ② データ量が多い上、「オンライン学習法」が学習過程が不安定のため、「バッチ学習法」が利用されます。 ③ 「バッチ学習法」がNNのパラメータを一回更新するには全学習データに対応する個々のloss 値を計算しなければならないので、    学習能率がよくないため、再び「オンライン学習法」に戻りました。 ただ、★ランダム的にサンプリングや繰り返し学習させるテクニックを加味しました。これを「確率的勾配降下法(SGD)」と呼ばれます。 ④ 従来の「オンライン学習法」と同じ「確率的勾配降下法(SGD)」にも不安定の欠点があるので、   幾つかランダムに抽出した学習データの訓練loss値を平均して、NNのパラメータの更新計算に利用されます。   これを「ミニバッチ学習法」と呼ばれます。     なので、「ミニバッチ学習法」のNNのパラメータの更新算法は「確率的勾配降下法(SGD)」とは基本的なやり方は同じ。   ----でも「バッチ学習法」とも基本的な処は変わりませんね。だってもも「バッチ学習法」の場合も、サンプリングにはランダム性があり、epoch単位で繰り返し学習も行えます。 ⑤ NNパラメータを一回更新する時に複数の学習データを利用すれば---「バッチ」か「ミニバッチ」に関わらず、batch normalizationを利用すべきです。 ⑥ 単一学習データでNNパラメータを更新する場合、batch normalizationを行うことは原理的に不可能です。 ⑦ 安定性とbatch normalizationが不可能である視点からオンライン学習法を是非回避したいものです。 以上は学習法発展のロジックだと考えて大丈夫でしょうか。
R.Shigemori

2019/03/24 23:43

私自身、この分野の歴史を研究しているわけではないので、「大丈夫でしょうか」と問われても何とも言えません。なので、細かいところで個人的見解を記載します。 ①、②ですが、コスト関数の本来的な主旨からするとバッチ学習が王道だったと捉えています。ただ、バッチ学習はコンピューターリソースを多く必要とするので、数十年前だと非実用的なのでオンライン学習が好まれたと思っています。 ③のオンライン学習の不安定性は欠点と捉えられていましたが、局所解回避しやすいという利点でもあります。さらにいうとこの不安定さはひとつひとつで見るとその通りなのですが、全体で見ると安定した分布を描くので、与えられたデータを頭から順番に計算するよりランダムに選択して計算する処理を繰り返したほうがうまくいくというアイデアがSDGとして結実していると考えるべきでしょう。 ④のミニバッチ学習ですが、オンライン学習とバッチ学習の利点をうまく取り入れたものとして、メジャー化しています。現状のニューラルネットワークの実装はこの学習方法をoptimizerの外側の問題としているところは注目すべきかと思います。SDGはその最適化アルゴリズムに学習方法が包含されているので、モデラーは何も考えず全件を投入すればいいはずです。このあたりの経緯はわかっていません。もしかすると、SDG以降に考案されたoptimizerと関係しているのかもしれません。 ⑤ですが、batch normalizationは勾配消失を回避するテクニックのひとつと認識しているので、使用必須と感じていません。ただ、私自身、十分理解しているわけではないので、何とも言えません
OOZAWA

2019/03/26 23:15 編集

貴重なコメントありがとうございます。 本当に助かりました!
OOZAWA

2019/03/26 23:16 編集

SDG ⇒ SGD
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問