Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

tf.keras.optimizers.Optimizer

Wersja TensorFlow 1 Wyświetl źródło na GitHub

Klasa podstawowa dla optymalizatorów Keras.

Nie należy używać tej klasy bezpośrednio, ale zamiast tego utworzyć instancję jednej z jej podklas, takich jak tf.keras.optimizers.SGD , tf.keras.optimizers.Adam itp.

Stosowanie

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda: 3 * var1 * var1 + 2 * var2 * var2
# In graph mode, returns op that minimizes the loss by updating the listed
# variables.
opt_op = opt.minimize(loss, var_list=[var1, var2])
opt_op.run()
# In eager mode, simply call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])

Wykorzystanie w niestandardowych pętlach treningowych

W modelach Keras czasami zmienne są tworzone przy pierwszym wywołaniu modelu, zamiast w czasie budowy. Przykłady obejmują 1) modele sekwencyjne bez wstępnie zdefiniowanego kształtu wejściowego lub 2) modele podklasy. W takich przypadkach należy przekazać var_list jako wywoływalne.

Przykład:

opt = tf.keras.optimizers.SGD(learning_rate=0.1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(num_hidden, activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, activation='sigmoid'))
loss_fn = lambda: tf.keras.losses.mse(model(input), output)
var_list_fn = lambda: model.trainable_weights
for input, output in data:
  opt.minimize(loss_fn, var_list_fn)

Przetwarzanie gradientów przed ich zastosowaniem

Wywołanie minimize() zajmuje się zarówno obliczaniem gradientów, jak i zastosowaniem ich do zmiennych. Jeśli chcesz przetworzyć gradienty przed ich zastosowaniem, możesz zamiast tego użyć optymalizatora w trzech krokach:

  1. Oblicz gradienty za pomocą tf.GradientTape .
  2. Przetwarzaj gradienty, jak chcesz.
  3. Zastosuj przetworzone gradienty za pomocą apply_gradients() .

Przykład:

# Create an optimizer.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)

# Compute the gradients for a list of variables.
with tf.GradientTape() as tape:
  loss = <call_loss_function>
vars = <list_of_variables>
grads = tape.gradient(loss, vars)

# Process the gradients, for example cap them, etc.
# capped_grads = [MyCapper(g) for g in grads]
processed_grads = [process_gradient(g) for g in grads]

# Ask the optimizer to apply the processed gradients.
opt.apply_gradients(zip(processed_grads, var_list))

Używaj z tf.distribute.Strategy

Ta klasa optymalizatora to tf.distribute.Strategy aware, co oznacza, że ​​automatycznie sumuje gradienty we wszystkich replikach. Aby tf.keras gradienty, musisz podzielić stratę przez globalny rozmiar partii, co jest wykonywane automatycznie, jeśli używasz wbudowanych pętli szkoleniowych lub oceniających tf.keras . Zobacz argument reduction straty, który powinien być ustawiony na tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE dla uśredniania lub tf.keras.losses.Reduction.SUM dla nie.

Aby samodzielnie zagregować gradienty, wywołaj apply_gradients z experimental_aggregate_gradients ustawionym na False. Jest to przydatne, jeśli musisz przetwarzać zagregowane gradienty.

Jeśli ich nie używasz i chcesz uśredniać gradienty, powinieneś użyć tf.math.reduce_sum aby tf.math.reduce_sum straty na przykład, a następnie podzielić przez globalny rozmiar partii. Należy zauważyć, że podczas korzystania z tf.distribute.Strategy pierwszym składnikiem kształtu tensora jest lokalny rozmiar partii repliki , który jest tf.distribute.Strategy o współczynnik równy liczbie replik używanych do obliczenia pojedynczego kroku. W rezultacie użycie tf.math.reduce_mean da złą odpowiedź, co spowoduje, że gradienty mogą być wielokrotnie za duże.

Zmienne ograniczenia

Wszystkie optymalizatory Keras uwzględniają zmienne ograniczenia. Jeśli funkcja ograniczenia zostanie przekazana do dowolnej zmiennej, ograniczenie zostanie zastosowane do zmiennej po zastosowaniu gradientu do zmiennej. Ważne: jeśli gradient jest tensorem rzadkim, zmienne ograniczenie nie jest obsługiwane.

Zgodność wątków

Cały optymalizator jest obecnie zgodny z wątkami, a nie bezpieczny dla wątków. W razie potrzeby użytkownik musi przeprowadzić synchronizację.

Sloty

Wiele podklas optymalizatorów, takich jak Adam i Adagrad alokuje dodatkowe zmienne powiązane ze zmiennymi do trenowania i zarządza nimi. Nazywa się to automatami . Automaty mają nazwy i możesz zapytać optymalizatora o nazwy gniazd, których używa. Gdy masz już nazwę gniazda, możesz poprosić optymalizator o utworzoną przez niego zmienną, która będzie przechowywać wartość gniazda.

Może to być przydatne, jeśli chcesz rejestrować debugowanie algorytmu szkoleniowego, raportować statystyki dotyczące automatów itp.

Hiperparametry

Są to argumenty przekazywane do konstruktora podklasy optymalizatora (metoda __init__ ), a następnie przekazywane do self._set_hyper() . Mogą to być zwykłe wartości Pythona (np. 1,0), tensory lub wywołania. Jeśli są wywoływalne, wywoływalne zostanie wywołane podczas apply_gradients() aby uzyskać wartość parametru hyper.

Hiperparametry można nadpisać za pomocą kodu użytkownika:

Przykład:

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda: 3 * var1 + 2 * var2
# In eager mode, simply call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])
# update learning rate
opt.learning_rate = 0.05
opt.minimize(loss, var_list=[var1, var2])

Szybkość uczenia się na żądanie

Optimizer akceptuje wywoływalne tempo uczenia się na dwa sposoby. Pierwszy sposób to wbudowany lub dostosowany tf.keras.optimizers.schedules.LearningRateSchedule . Harmonogram będzie wywoływany w każdej iteracji z schedule(iteration) , tf.Variable której właścicielem jest optymalizator.

Przykład:

var = tf.Variable(np.random.random(size=(1,)))
learning_rate = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=.01, decay_steps=20, decay_rate=.1)
opt = tf.keras.optimizers.SGD(learning_rate=learning_rate)
loss = lambda: 3 * var
opt.minimize(loss, var_list=[var])
<tf.Variable...

Drugi sposób to wywoływalna funkcja, która nie przyjmuje żadnych argumentów.

Przykład:

var = tf.Variable(np.random.random(size=(1,)))
def lr_callable():
  return .1
opt = tf.keras.optimizers.SGD(learning_rate=lr_callable)
loss = lambda: 3 * var
opt.minimize(loss, var_list=[var])
<tf.Variable...

Tworzenie niestandardowego optymalizatora

Jeśli zamierzasz stworzyć własny algorytm optymalizacji, po prostu dziedzicz z tej klasy i nadpisuj następujące metody:

  • _resource_apply_dense (zmienna aktualizacji, której tensor gradientu jest gęsty)
  • _resource_apply_sparse (zaktualizuj zmienną, której tensor gradientu jest rzadki)
  • _create_slots (jeśli algorytm optymalizatora wymaga dodatkowych zmiennych)
  • get_config (serializacja optymalizatora, uwzględnij wszystkie get_config )

name Niepusty ciąg. Nazwa używana dla akumulatorów utworzonych dla optymalizatora.
**kwargs argumenty słów kluczowych. Dozwolone na { clipnorm , clipvalue , lr , decay }. clipnorm to gradienty klipów według normy; clipvalue to gradienty klipów według wartości, decay jest uwzględniony w celu zap