2017-06-09 20 views
6

Ponieważ Adam Optimizer utrzymuje parę średnich średnich, takich jak średnia/wariancja dla gradientów, zastanawiam się, jak należy właściwie radzić sobie z rozkładem masy ciała. Widziałem dwa sposoby jego realizacji.Jaki jest właściwy sposób rozkładania wagi dla Adama Optimizer

  1. Aktualizuj średnią/wariancję z gradientów wyłącznie na podstawie straty obiektywnej, masy zaniku wyraźnie w każdej mini-partii. (Poniższy kod pochodzi z 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. Aktualizacja średniej/wariancji z gradientów w oparciu o obiektywną utratę + straty regularyzacji i zaktualizuj ciężarów jak zwykle. (Poniższy kod pochodzi z 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))); 
    

Te dwa podejścia czasami wykazują znaczącą różnicę w wynikach szkoleniowych. I rzeczywiście uważam, że pierwszy ma więcej sensu (i daje lepsze rezultaty od czasu do czasu). Caffe i starsza wersja mxnet są zgodne z pierwszym podejściem, podczas gdy latarka, tensorflow i nowa wersja mxnet podążają za drugą.

naprawdę wdzięczni za pomoc!

+0

Zauważ, że różnica między nimi jest olbrzymia w przypadku treningu o niskiej liczbie bitów, w takim przypadku regulacja wagi zgadywania staje się bolesna. (i to może również dotyczyć innych podobnych przypadków). –

+0

Czy jesteś pewien, że tensorflow wspiera rozkład masy swojego AdamOptimizer? Właśnie sprawdziłem kod i nie widziałem nic o rozkładzie wagi. https://github.com/tensorflow/tensorflow/blob/9bdb72e124e50e1b12b3286b38cbb1c971552741/tensorflow/core/kernels/training_ops.cc#L284 – iron9light

Odpowiedz

1

Waga rozpad jest po prostu wygodne i efektywne wdrożenie uregulowania L2 i uregulowania jest po prostu zwiększając swoją funkcję strat. Aby być matematycznie dokładne, dwa następujące operacje muszą prowadzić do tego samego rezultatu:

optimize(objective_loss, weight_decay=0.1)

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

ta powinna być prawdziwa dla dowolnego regularizer (L1, L2, a nawet L0) i stąd ja don Uważam, że zachowanie dla L2 powinno być inne. Starsza implementacja łamie tę zasadę i zostaje naprawiona w późniejszej implementacji.

Powiązane problemy