2016-06-20 39 views
14

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ć?

Odpowiedz

8

Reguła aktualizacji, że faktycznie stosowana jest metoda apply_gradients, zależy od konkretnego optymalizatora. Spójrz na implementację apply_gradients w tf.train.Optimizer klasie here. Opiera się na klasach pochodnych implementujących regułę aktualizacji w metodach _apply_dense i _apply_spares. Reguła aktualizacji, do której się odnosisz, jest zaimplementowana przez GradientDescentOptimizer.

chodzi żądanej dodatniej aktualizacji dodatku: Jeśli dzwonisz opt jest konkretyzacji GradientDescentOptimizer, wtedy można rzeczywiście osiągnąć to, co chcesz robić przez

grads_and_vars = opt.compute_gradients(E, [v]) 
eta = opt._learning_rate 
my_grads_and_vars = [(g-(1/eta)*p, v) for g, v in grads_and_vars] 
opt.apply_gradients(my_grads_and_vars) 

The bardziej elegancki sposób to zrobić to chyba napisać nowy optymalizator (dziedziczący po tf.train.Optimizer), który implementuje żądaną regułę aktualizacji bezpośrednio.

+0

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

+0

Dzięki. Inny optymalizator gradientu może obliczyć np. momenty oparte na moim zaktualizowanym gradiencie, lub dlaczego byłyby niezgodne z tym podejściem? –

+0

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