Dokumentacja nie jest do końca jasna. Przypuszczam, że gradienty, które można uzyskać przez opt.compute_gradients(E, [v])
, zawierają ∂E/∂x = g(x)
dla każdego elementu x
tensora, który przechowuje v
. Czy opt.apply_gradients(grads_and_vars)
zasadniczo wykonuje x ← -η·g(x)
, gdzie η
to szybkość uczenia się? Oznaczałoby to, że jeśli chcę dodać dodatnią zmianę dodatku p
do zmiennej, musiałbym zmienić g(x) ← g(x) - (1/η)p
, np. tak:Co robi opt.apply_gradients() w TensorFlow?
opt = tf.train.GradientDescentOptimizer(learning_rate=l)
grads_and_vars = opt.compute_gradients(loss, var_list)
for l, gv in enumerate(grads_and_vars):
grads_and_vars[l] = (gv[0] - (1/l) * p, gv[1])
train_op = opt.apply_gradients(grads_and_vars)
Czy jest lepszy sposób to zrobić?
Przepraszam, przeoczyłem linię '' opt = tf.train.GradientDescentOptimizer (learning_rate = l) '' w podanym fragmencie kodu, co sprawia, że pierwszy akapit mojej odpowiedzi jest w jakiś sposób nieistotny. Pozostaje jednak w kontekście. – lballes
Dzięki. Inny optymalizator gradientu może obliczyć np. momenty oparte na moim zaktualizowanym gradiencie, lub dlaczego byłyby niezgodne z tym podejściem? –
Inne optymalizatory implementują reguły aktualizacji, takie jak pochodzenie gradientowe z pędem, AdaGrad i tak dalej. Oczywiście dodanie stałej wartości do kroku aktualizacji jest zgodne z każdą regułą aktualizacji (jak sensowne jest oddzielne pytanie). – lballes