Używam TensorFlow do trenowania sieci neuronowej. Oto jak inicjalizuję GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
Chodzi o to, że nie wiem, jak ustawić regułę aktualizacji dla współczynnika uczenia lub wartości zaniku dla tego.
Jak mogę tutaj zastosować adaptacyjny współczynnik uczenia się?
python
tensorflow
wyświetlana nazwa
źródło
źródło
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Wydaje się, że ustawienie nowego tempa uczenia się wymaga zainicjowania modelu z już wyuczonymi zmiennymi. Ale nie wiem, jak to zrobić.Odpowiedzi:
Przede wszystkim
tf.train.GradientDescentOptimizer
ma na celu stosowanie stałej szybkości uczenia się dla wszystkich zmiennych na wszystkich etapach. TensorFlow zapewnia również gotowe do użycia adaptacyjne optymalizatory, w tymtf.train.AdagradOptimizer
i oraztf.train.AdamOptimizer
, które mogą być używane jako zamienniki typu drop-in.Jeśli jednak chcesz sterować szybkością uczenia się za pomocą zwykłego gradientu zstępującego, możesz skorzystać z faktu, że
learning_rate
argument dlatf.train.GradientDescentOptimizer
konstruktora może byćTensor
obiektem. Umożliwia to obliczenie innej wartości współczynnika uczenia się na każdym kroku, na przykład:Alternatywnie możesz utworzyć skalar,
tf.Variable
który utrzymuje współczynnik uczenia się i przypisywać go za każdym razem, gdy chcesz zmienić współczynnik uczenia.źródło
tf.clip_by_norm
nie akceptuje tensora dla normy klipu, więc co powiesz na to[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, gdziect = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, jedyną rzeczą, która uniemożliwia mu zaakceptowanie tensora jako danych wejściowych, jestconstant_op.constant(1.0 / clip_norm)
. Zastąpienie tego wyrażeniamath_ops.inv(clip_norm)
sprawiłoby, że zadziałałoby ono z elementem zastępczym (lub jakimkolwiek innym tensorem).)Tensorflow zapewnia op automatycznie zastosować rozkład wykładniczy do tensora stopy learning:
tf.train.exponential_decay
. Aby zapoznać się z przykładem użycia, zobacz tę linię w przykładzie modelu splotowego MNIST . Następnie użyj sugestii @ mrry powyżej, aby podać tę zmienną jako parametr learning_rate do wybranego optymalizatora.Kluczowy fragment, na który należy zwrócić uwagę, to:
Zwróć uwagę na
global_step=batch
parametr, aby zminimalizować. To mówi optymalizatorowi, aby pomocnie zwiększał parametr „partii” za każdym razem, gdy trenuje.źródło
batch
jest zmienna, która jest wywoływanaglobal_step
i istnieje kilka wygodnych funkcji, jedna służąca do jej tworzeniatf.train.create_global_step()
(która po prostu tworzy liczbę całkowitątf.Variable
i dodaje ją dotf.GraphKeys.GLOBAL_STEP
kolekcji) itf.train.get_global_step()
.Algorytm zstępowania gradientu wykorzystuje stałą szybkość uczenia się, którą można zapewnić podczas inicjalizacji . Możesz przejść różne wskaźniki uczenia się w sposób pokazany przez Mrry.
Ale zamiast tego można zastosować bardziej zaawansowane optymalizatory, które mają szybszy współczynnik konwergencji i dostosowują się do sytuacji.
Oto krótkie wyjaśnienie oparte na moim zrozumieniu:
Adam lub pęd adaptacyjny to algorytm podobny do AdaDelta. Ale oprócz przechowywania współczynników uczenia się dla każdego z parametrów, zapisuje również zmiany pędu dla każdego z nich oddzielnie
A kilka wizualizacje :
źródło
Z oficjalnych dokumentów tensorflow
źródło
Jeśli chcesz ustawić określone współczynniki uczenia się dla interwałów takich jak
0 < a < b < c < ...
. Następnie możesz zdefiniować współczynnik uczenia się jako warunkowy tensor, zależny od kroku globalnego i przekazać to optymalizatorowi w normalny sposób.Możesz to osiągnąć za pomocą kilku zagnieżdżonych
tf.cond
instrukcji, ale łatwiej jest zbudować tensor rekurencyjnie:Następnie, aby go użyć, musisz wiedzieć, ile kroków szkoleniowych jest w jednej epoce, abyśmy mogli użyć kroku globalnego, aby przełączyć się we właściwym czasie, a na koniec zdefiniować żądane epoki i wskaźniki uczenia się. Więc jeśli chcę, aby współczynniki uczenia się
[0.1, 0.01, 0.001, 0.0001]
w przedziałach epoki[0, 19], [20, 59], [60, 99], [100, \infty]
odpowiednio, zrobiłbym:źródło