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
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
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!
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). –
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