2017-06-09 27 views
6

由於亞當優化保持一對跑步平均像漸變的平均值/方差,我不知道它應該如何正確處理重量衰減。我看到了兩種實現方法。什麼是正確的方法來減輕亞當優化的衰減

  1. 只根據每個微量批次的目標損失,明確衰減權重更新梯度的平均值/方差。 (下面的代碼是從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 
    
  2. 更新平均值/方差基於所述目標損失+正規化損失,和類似的通常的更新權重的梯度。 (下面的代碼是從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則遵循第二種方法。

非常感謝您的幫助!

+0

注意兩者之間的差異對於低位寬度訓練是巨大的,在這種情況下,猜測重量正則化會變得傷害。 (這也可能適用於其他類似案例) –

+0

您確定tensorflow支持AdamOptimizer的體重衰減嗎?我剛剛檢查了代碼,並沒有看到有關體重衰減的任何信息。 https://github.com/tensorflow/tensorflow/blob/9bdb72e124e50e1b12b3286b38cbb1c971552741/tensorflow/core/kernels/training_ops.cc#L284 – iron9light

回答

1

重量衰變僅僅是一個方便快捷的實現L2規範化和正規化的僅僅是增強你的損失函數。是數學上準確,以下兩個操作必須產生相同的結果:

optimize(objective_loss, weight_decay=0.1)

optimize(objective_loss + 0.1*L2_of_weights, weight_decay=0)

這應該是任何正則(L1,L2,或甚至L0)真,因此我不認爲L2的行爲應該是任何不同的。較舊的實現違反了該規則,並在稍後的實施中修復。