由於亞當優化保持一對跑步平均像漸變的平均值/方差,我不知道它應該如何正確處理重量衰減。我看到了兩種實現方法。什麼是正確的方法來減輕亞當優化的衰減
只根據每個微量批次的目標損失,明確衰減權重更新梯度的平均值/方差。 (下面的代碼是從https://github.com/dmlc/mxnet/blob/v0.7.0/python/mxnet/optimizer.py截取)
weight[:] -= lr*mean/(sqrt(variance) + self.epsilon) wd = self._get_wd(index) if wd > 0.: weight[:] -= (lr * wd) * weight
更新平均值/方差基於所述目標損失+正規化損失,和類似的通常的更新權重的梯度。 (下面的代碼是從https://github.com/dmlc/mxnet/blob/master/src/operator/optimizer_op-inl.h#L210截取)
grad = scalar<DType>(param.rescale_grad) * grad + scalar<DType>(param.wd) * weight; // stuff Assign(out, req[0], weight - scalar<DType>(param.lr) * mean/ (F<square_root>(var) + scalar<DType>(param.epsilon)));
這兩種方法有時顯示在訓練結果顯著差異。實際上,我認爲第一個更有意義(並且發現它可以提供更好的結果)。 Caffe和舊版本的mxnet遵循第一種方法,而火炬,tensorflow和新版本的mxnet則遵循第二種方法。
非常感謝您的幫助!
注意兩者之間的差異對於低位寬度訓練是巨大的,在這種情況下,猜測重量正則化會變得傷害。 (這也可能適用於其他類似案例) –
您確定tensorflow支持AdamOptimizer的體重衰減嗎?我剛剛檢查了代碼,並沒有看到有關體重衰減的任何信息。 https://github.com/tensorflow/tensorflow/blob/9bdb72e124e50e1b12b3286b38cbb1c971552741/tensorflow/core/kernels/training_ops.cc#L284 – iron9light