ニューラルネットワークのバッチ学習方法で重みはどのように更新されますか?


13

バッチ方式を使用してニューラルネットワークを構築する方法を教えてください。

バッチモードで、トレーニングセットのすべてのサンプルについて、ネットワーク内の各ニューロンの誤差、デルタ、したがってデルタの重みを計算し、重みをすぐに更新する代わりに、それらを累積してから開始することを読みました次のエポックでは、重みを更新します。

また、バッチ方式はオンライン方式に似ていますが、違いはトレーニングセット内のすべてのサンプルのエラーを合計し、平均を取り、それを使用して重みを更新することだけです次のようにオンラインの方法で行います(違いはちょうどその平均です)。

for epoch=1 to numberOfEpochs

   for all i samples in training set

         calculate the errors in output layer
         SumOfErrors += (d[i] - y[i])
   end

   errorAvg = SumOfErrors / number of Samples in training set

   now update the output layer with this error
   update all other previous layers

   go to the next epoch

end
  • これらのうち、本当に正しいバッチ方式はどれですか?
  • 最初のものの場合、すべてのデルタの重みを累積すると膨大な数になりませんか?

1
「正しい」方法はコンテキストに依存します。多くの場合、エポックごとに1回だけ重みを更新すると、確率的な更新(各例の後の重みの更新)よりもはるかにゆっくり収束することがわかります。一般に、何らかの形式のバッチ更新を使用したいというコンセンサスがありますが、エポックごとに1倍よりもはるかに頻繁です。
ターラー

回答:


8

同じ更新を生成する学習レートのペアが存在するという意味で、平均または合計の使用は同等です。

これを確認するには、最初に更新ルールを呼び出します。

wj=αEwj

次に、エポックにわたるサイズデータセットの平均誤差をとします。エラーの合計はになり、はに依存しないため、次のようになります。μEnnμEnw

wj=αnμwj=αnμwj

2番目の質問に対して、「デルタの重みを累積する」というフレーズは、これらのメソッドの1つが重みの更新を保持することを意味します。そうではありません。バッチ学習はエラーを蓄積します。指定されたエポックには、単一のベクトルのみがあります。(疑似コードのコードでは、重み更新するステップを省略しています。その後、破棄できます。)ww


1
ミニバッチ勾配降下法は同じバッチ勾配降下法ですか?ここで迷子です!そうでない場合、これらの違いは何ですか?私が間違っている場合は、バッチモードで、データセット全体をバッチで読み取る必要があり、勾配が計算され、すべてが読み取られると、平均化され、パラメータが更新されますが、ミニバッチでは、バッチが読み取られ、勾配が計算されてからパラメーターが更新され、1つのエポックが終了するまで次のミニバッチが読み取られます。
リカ

1
これが一般的に与えられている定義です。一度に1つのトレーニングデータのサブセットを使用してパラメーターを更新します。(ミニバッチを収束するまでランダムにサンプリングする方法がいくつかあります。つまり、エポックでバッチを走査しません。)これが役立つかどうかを確認ます。
ショーンイースター

0

2つの答えは同等です。個人的には、合計ではなく平均誤差と考えています。ただし、勾配降下には学習率と呼ばれるパラメーターがあり、誤差の勾配の一部のみが減算されることに注意してください。したがって、エラーが平均の合計として定義されているかどうかは、学習率を変更することで補正できます。


おかげですが、それらが本当に同じである場合、単純な変数のみであるエラーのみを合計できるのに、なぜ各パターンの累積更新を保持するのに多くのメモリを浪費するのでしょうか?
リカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.