合計ではなくバッチの平均損失を最小限に抑えることは一般的な方法ですか?


14

Tensorflowには、CIFAR-10の分類に関するサンプルチュートリアルがあります。チュートリアルでは、バッチ全体の平均クロスエントロピー損失が最小化されます。

def loss(logits, labels):
  """Add L2Loss to all the trainable variables.
  Add summary for for "Loss" and "Loss/avg".
  Args:
    logits: Logits from inference().
    labels: Labels from distorted_inputs or inputs(). 1-D tensor
            of shape [batch_size]
  Returns:
    Loss tensor of type float.
  """
  # Calculate the average cross entropy loss across the batch.
  labels = tf.cast(labels, tf.int64)
  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
      logits, labels, name='cross_entropy_per_example')
  cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
  tf.add_to_collection('losses', cross_entropy_mean)

  # The total loss is defined as the cross entropy loss plus all of the weight
  # decay terms (L2 loss).
  return tf.add_n(tf.get_collection('losses'), name='total_loss')

cifar10.pyの 267行目を参照してください。

代わりに、バッチ全体の合計を最小化しないのはなぜですか?違いはありますか?これがバックプロップの計算にどのように影響するかわかりません。


正確な合計/平均は関係ありませんが、損失の選択はアプリケーション設計の選択です。たとえば、平均が適切である場合は、平均を最適化します。アプリケーションが最悪のシナリオ(自動車事故など)に敏感な場合は、最大値を最適化する必要があります。
Alex Kreimer

回答:


15

pkubikで述べたように、通常、入力に依存しないパラメーターの正則化用語があります。たとえば、テンソルフローでは次のようになります。

# Loss function using L2 Regularization
regularizer = tf.nn.l2_loss(weights)
loss = tf.reduce_mean(loss + beta * regularizer)

この場合、ミニバッチでの平均化は、バッチサイズが変更される間、cross_entropy損失と損失の比率を一定に保つのに役立ちますregularizer

さらに、学習率は損失の大きさ(勾配)にも敏感であるため、異なるバッチサイズの結果を正規化するには、平均をとることがより良いオプションのようです。


更新

Facebookによるこのペーパー(正確で大規模なミニバッチSGD:1時間でのImageNetのトレーニング)は、実際にバッチサイズに従って学習率をスケーリングすると非常にうまく機能することを示しています。

線形スケーリングルール:ミニバッチサイズにkを掛けると、学習率にkが掛けられます。

これは基本的に勾配にkを掛けて学習率を変更しないことと同じなので、平均を取る必要はないと思います。


8

私はその部分に焦点を当てます:

これがバックプロップの計算にどのように影響するかわかりません。

最初に、おそらくすでに気付いたように、結果の損失値の唯一の違いは、平均損失が合計に対しての係数、つまりによって縮小されることです、ここではバッチサイズです。同じ関係が任意の変数wrtの導関数に当てはまることは簡単に証明できます。微分の定義を見ることによる損失関数(): 今、私たちは関数の値を乗算し、それが派生にどのように影響するかを見てみたいです: 1BLSUM=BLAVGBdLSUMdx=BdLAVGdx

dLdx=limΔ0L(x+Δ)L(x)Δ
d(cL)dx=limΔ0cL(x+Δ)cL(x)Δ
定数を分解して制限の前に移動すると、元の導関数定義に定数を掛けたものが得られます。証明したかったとおりです:
d(cL)dx=climΔ0L(x+Δ)L(x)Δ=cdLdx

SGDでは、勾配に学習率を掛けた値を使用して重みを更新し、最終的な重みの更新が等しくなるようにこのパラメーターを選択できることが明確にわかります。最初の更新ルール: と2番目の更新ルール(と想像してください): λ

W:=W+λ1dLSUMdW
λ1=λ2B
W:=W+λ1dLAVGdW=W+λ2BdLSUMdW


dontlooによる優れた発見は、合計を使用することが少し適切なアプローチであるかもしれないことを示唆するかもしれません。より一般的であると思われる平均を正当化するために、合計を使用すると、重みの正規化でいくつかの問題が発生する可能性があることを付け加えます。異なるバッチサイズのレギュラライザーのスケーリングファクターの調整は、学習率の調整と同じように煩わしい場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.