ミニバッチ勾配降下法は、バッチ内の各例の重みをどのように更新しますか?


12

10個の例をバッチで処理すると、各例の損失を合計できることは理解できますが、各例の重みの更新に関して逆伝播はどのように機能しますか?

例えば:

  • 例1->損失= 2
  • 例2->損失= -2

この結果、平均損失は0(E = 0)になるので、これにより各重みが更新されて収束するでしょうか。遅かれ早かれ「うまくいけば」収束するのは、単にバッチのランダム化によるものですか?また、これは処理された最後の例の最初の重みのセットの勾配のみを計算しませんか?

回答:


15

勾配降下法は、提案した方法ではうまく機能しませんが、同様の問題が発生する可能性があります。

バッチから平均損失を計算するのではなく、損失関数の平均勾配を計算します。勾配は、重みに関する損失の導関数であり、ニューラルネットワークでは、1つの重みの勾配はその特定の例の入力に依存し、モデル内の他の多くの重みにも依存します。

モデルに5つのウェイトがあり、ミニバッチサイズが2の場合、次のようになります。

gradients=(1.5,2.0,1.1,0.4,0.9)

gradients=(1.2,2.3,1.1,0.8,0.7)

(1.35,0.15,0,0.2,0.8)

0

コメントに応じて編集:

kLiwj

Lwj=1ki=1kLiwj

コメントでリンクしたチュートリアルコードでは、Tensorflowを使用して平均損失を最小限に抑えています。

1ki=1kLi

これを最小化するために、各重みに関する平均損失の勾配を計算し、勾配降下を使用して重みを更新します。

Lwj=wj1ki=1kLi

微分は和の中に入れることができるので、私の例のアプローチからの式と同じです。

wj1ki=1kLi=1ki=1kLiwj


ゴッチャ。それでも、batch_sizeでの損失を平均したいですか?あなたがテンソルフローに精通しているかどうかはわかりませんが、私はこのチュートリアルで私の理解を調整しようとしています:tensorflow.org/get_started/mnist/beginners損失は​​バッチ全体で平均化されていることがわかります(reduce_meanコード)。私はテンソルフローが重みの内部カウント/平均を保持していると思いますか?
2017年

1
@carboncomputedそうそうそうそう、彼らは損失を平均化するので、Tensorflowが平均損失の勾配を計算するとき、それは各損失の勾配の平均を効果的に計算している。この計算を表示するように回答を編集します。
Hugh

面白い。説明をありがとう。それでは、少し深く掘り下げるために、フォワードパス中にサンプルごとに重み勾配が計算されて保存されますか、それともテンソルフローの最適化プロセス中に計算されますか?私は、テンソルフローのこれらの勾配が「どこに」あるのか見当たらないと思いますか?フォワードパスと損失が表示されるので、テンソルフローはこれらの勾配計算/平均化を内部で実行していますか?
2017年

1
@carboncomputedこれがTensorflowの魅力です。シンボリック数学を使用して、内部で微分を行うことができます
Hugh

きちんとした答えをありがとう。しかし、この例で示されているように、TFが平均損失で逆伝播する方法をどのようにして知っているのか理解できませんでしたcode line 170
罪人

-1

ミニバッチを使用する理由は、その効果を平均化することでノイズの可能性が低減されるように、十分な量のトレーニング例を用意することですが、多くのデータセットで大量のメモリを必要とする可能性があるのは完全なバッチではありません。重要な事実の1つは、評価するエラーは常に距離であることです。予測された出力と実際の出力の間:つまり、負になることはないため、キャンセルした2と-2のエラーは発生しませんが、代わりに4のエラーになります。次に、すべての重みに関して誤差の勾配を評価するので、重みのどの変化が最もそれを減らすかを計算できます。そうしたら、学習率アルファの大きさに基づいて、その方向に「一歩」進みます。(これは基本的な概念です。ディープNNのバックプロパゲーションについては詳しく説明しません)特定の数のエポックについてデータセットでこのトレーニングを実行した後、学習ステップが大きすぎない場合は、ネットワークが収束することを期待できます。発散させます。あなたはまだ極小値になるかもしれません、これは、重みを異なる方法で初期化し、異なるオプティマイザーを使用して、正則化を試みることで回避できます。


追加するだけです。主に計算効率のためにミニバッチを使用します。降下の精度と重みの更新頻度の間にはトレードオフがあります。データはメモリに収まらないように非常に大きくする必要があります。
ルカシュGradの

それぞれを理解していますが、特定のバッチの重みをどのように更新しますか?各例の重量勾配も合計されますか?
2017年

いいえ、バッチ誤差全体には、微分係数のベクトルである勾配が1つだけあります。これは、勾配に基づいて重みを一度更新することを意味します。つまり、このミニバッチのエラーを最も減少させる更新の方向です。勾配は偏微分で構成されます。つまり、各重みに関するミニバッチエラーの微分です。これにより、各重みが小さくなったり大きくなったりする必要があるかどうか、およびその大きさがわかります。すべての重みは、他のミニバッチから独立している、そのミニバッチのエラーを減らすために、バッチの1つの更新を取得します。
ダンテ2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.