Spec-Zone.ru › TensorFlow 2.9

tf.keras.optimizers.experimental.Optimizer

Базовый абстрактный класс оптимизатора.

Наследуется от: Module

tf.keras.optimizers.experimental.Optimizer(
    name,
    clipnorm=None,
    clipvalue=None,
    global_clipnorm=None,
    use_ema=False,
    ema_momentum=0.99,
    ema_overwrite_frequency=None,
    jit_compile=True,
    **kwargs
)

Этот класс поддерживает распределённое обучение. Если вы хотите реализовать свой собственный оптимизатор, пожалуйста, подклассифицируйте этот класс вместо _BaseOptimizer.

Аргументы
name Строка. Имя для использования в качестве накопителя импульса весов, созданных оптимизатором.
clipnorm Вещественное число. Если задано, градиент каждого веса индивидуально ограничивается так, чтобы его норма не превышала это значение.
clipvalue Вещественное число. Если задано, градиент каждого веса ограничивается значением, не превышающим это значение.
global_clipnorm Вещественное число. Если задано, градиент всех весов ограничивается так, чтобы их глобальная норма не превышала это значение.
use_ema Булево значение, по умолчанию False. Если True, применяется экспоненциально скользящее среднее (EMA). EMA заключается в вычислении экспоненциально скользящего среднего весов модели (поскольку значения весов изменяются после каждой обучающей партии) и периодическом перезаписи весов их скользящим средним.
ema_momentum Вещественное число, по умолчанию 0.99. Используется только если use_ema=True. Это импульс, используемый при вычислении EMA весов модели: new_average = ema_momentum * old_average + (1 - ema_momentum) * current_variable_value.
ema_overwrite_frequency Целое число или None, по умолчанию None. Используется только если use_ema=True. Каждые ema_overwrite_frequency шагов итераций мы перезаписываем переменную модели её скользящим средним. Если None, оптимизатор не перезаписывает переменные модели в середине обучения, и вам необходимо явно перезаписать переменные в конце обучения, вызвав optimizer.finalize_variable_values() (что обновляет переменные модели на месте). При использовании встроенного цикла обучения fit(), это происходит автоматически после последней эпохи, и вам ничего не нужно делать.
jit_compile Булево значение, по умолчанию True. Если True, оптимизатор будет использовать компиляцию XLA. jit_compile не может быть True при обучении с помощью tf.distribute.experimental.ParameterServerStrategy. Кроме того, если устройство GPU не найдено, этот флаг будет проигнорирован.
**kwargs Ключевые аргументы, используемые только для обратной совместимости.

Использование

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.experimental.SGD(learning_rate=0.1)
var1, var2 = tf.Variable(1.0), tf.Variable(2.0)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda: 3 * var1 * var1 + 2 * var2 * var2
# Call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])

Обработка градиентов перед их применением

Вызов minimize() обрабатывает как вычисление градиентов, так и их применение к переменным. Если вы хотите обработать градиенты перед их применением, вы можете вместо этого использовать оптимизатор в трех шагах:

  1. Вычислите градиенты с помощью tf.GradientTape.
  2. Обработайте градиенты как вам нужно.
  3. Примените обработанные градиенты с помощью apply_gradients().

Пример:

# Create an optimizer.
opt = tf.keras.optimizers.experimental.SGD(learning_rate=0.1)
var1, var2 = tf.Variable(1.0), tf.Variable(2.0)

# Compute the gradients for a list of variables.
with tf.GradientTape() as tape:
  loss = 3 * var1 * var1 + 2 * var2 * var2
grads = tape.gradient(loss, [var1, var2])

# Process the gradients.
grads[0] = grads[0] + 1

# Ask the optimizer to apply the gradients on variables.
opt.apply_gradients(zip(grads, [var1, var2]))

Динамическая скорость обучения

Динамическую скорость обучения можно получить, установив скорость обучения как встроенный или настраиваемый tf.keras.optimizers.schedules.LearningRateSchedule.

Пример:

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.experimental.SGD(learning_rate=learning_rate)
loss = lambda: 3 * var
opt.minimize(loss, var_list=[var])

Ограничение градиентов

Пользователи могут ограничить градиенты перед применением к переменным, установив clipnorm, clipvalue и global_clipnorm. Обратите внимание, что clipnorm и global_clipnorm могут быть установлены только по одному.

Пример:

opt = tf.keras.optimizers.experimental.SGD(learning_rate=1, clipvalue=1)
var1, var2 = tf.Variable(2.0), tf.Variable(2.0)
with tf.GradientTape() as tape:
  loss = 2 * var1 + 2 * var2
grads = tape.gradient(loss, [var1, var2])
print([grads[0].numpy(), grads[1].numpy()])
[2.0, 2.0]
opt.apply_gradients(zip(grads, [var1, var2]))
# Without clipping, we should get [0, 0], but as gradients are clipped to
# have max value 1, we get [1.0, 1.0].
print([var1.numpy(), var2.numpy()])
[1.0, 1.0]

Использование экспоненциально скользящего среднего.

Эмпирически было установлено, что использование экспоненциально скользящего среднего (EMA) обученных параметров глубокой сети обеспечивает лучшую производительность, чем использование её обученных параметров напрямую. Оптимизаторы Keras позволяют пользователям вычислять это скользящее среднее и перезаписывать переменные модели в нужное время.

Пример:

# Create an SGD optimizer with EMA on. `ema_momentum` controls the decay rate
# of the moving average. `ema_momentum=1` means no decay and the stored moving
# average is always model variable's initial value before training. Reversely,
# `ema_momentum=0` is equivalent to not using EMA. `ema_overwrite_frequency=3`
# means every 3 iterations, we overwrite the trainable variables with their
# moving average values.
opt = tf.keras.optimizers.experimental.SGD(
    learning_rate=1,
    use_ema=True,
    ema_momentum=0.5,
    ema_overwrite_frequency=3)
var1, var2 = tf.Variable(2.0), tf.Variable(2.0)
with tf.GradientTape() as tape:
  loss = var1 + var2
grads = tape.gradient(loss, [var1, var2])
# First iteration: [var1, var2] = [1.0, 1.0]
opt.apply_gradients(zip(grads, [var1, var2]))
print([var1, var2])

# Second iteration: [var1, var2] = [0.0, 0.0]
opt.apply_gradients(zip(grads, [var1, var2]))
print([var1, var2])

# Third iteration, without EMA, we should see [var1, var2] = [-1.0, -1.0],
# but overwriting results in [var1, var2] = [-0.125, -0.125]. The full
# calculation for the moving average of var1 is:
# var1=2*0.5**3+1*(1-0.5)*0.5**2+0*(1-0.5)*0.5**1+(-1)*(1-0.5)=-0.125.
opt.apply_gradients(zip(grads, [var1, var2]))
print([var1, var2])

Когда оптимизатор создается с use_ema=True, в пользовательском цикле обучения пользователи могут явно вызвать finalize_variable_values() для перезаписи обучаемых переменных их значениями EMA. finalize_variable_values() по умолчанию вызывается в конце model.fit().

Использование с tf.distribute.Strategy

Этот класс оптимизатора tf.distribute.Strategy -осознающий, что означает автоматическое суммирование градиентов по всем репликам. Для самостоятельного агрегирования градиентов вызовите apply_gradients с skip_aggregate_gradients установленным в True. Это полезно, если вам нужно обработать агрегированные градиенты.

# This example is not runnable, it consists of dummy code for simple tutorial.
strategy = tf.distribute.experimental.TPUStrategy()

with strategy.scope():
  opt = tf.keras.optimizers.experimental.SGD()
  model = magic_function_that_returns_model()
  gradients = magic_function_that_returns_gradients()
  # Custom logic to aggregate gradients.
  gradients = strategy.reduce("SUM", gradients, axis=None)
  opt.apply_gradients(zip(gradients, model.trainable_variables),
      skip_aggregate_gradients=True)

Создание пользовательского оптимизатора

Если вы намерены создать свой собственный алгоритм оптимизации, пожалуйста, унаследуйте от этого класса и переопределите следующие методы:

  • build: Создайте переменные, относящиеся к вашему оптимизатору, такие как momentums в оптимизаторе SGD.
  • update_step: Реализуйте логику обновления вашего оптимизатора.
  • get_config: Сериализация оптимизатора, включите все гиперпараметры.

Ваш оптимизатор будет автоматически совместим с распределённым обучением tensorflow, если вы подклассифицируете optimizer_experimental.Optimizer.

Атрибуты
iterations Количество шагов обучения, пройденных этим optimizer.

По умолчанию, итерации будут увеличиваться на единицу каждый раз, когда вызывается apply_gradients().

learning_rate

Методы

add_variable

Просмотреть исходный код

add_variable(
    shape, dtype=None, initializer='zeros', name=None
)

Создать переменную оптимизатора.

Аргументы
shape Список целых чисел, кортеж целых чисел или 1-мерный тензор типа int32. По умолчанию скаляр, если не указано.
dtype Тип DType переменной оптимизатора, подлежащей созданию. По умолчанию tf.keras.backend.floatx, если не указано.
initializer строка или вызываемый объект. Экземпляр инициализатора.
name Имя переменной оптимизатора, подлежащей созданию.
Возвращаемые значения
Переменная оптимизатора в формате tf.Variable.

add_variable_from_reference

Просмотреть исходный код

add_variable_from_reference(
    model_variable, variable_name, shape=None, initial_value=None
)

Создать переменную оптимизатора из переменной модели.

Создайте переменную оптимизатора, основываясь на информации о переменной модели. Например, в оптимизаторе SGD импульс, для каждой переменной модели, создаётся соответствующая переменная импульса той же формы и типа.

Аргументы
model_variable tf.Variable. Соответствующая переменная модели, для создаваемой переменной оптимизатора.
variable_name Строка. Префикс имени переменной оптимизатора, подлежащей созданию. Имя создаваемой переменной будет следовать шаблону {variable_name}/{model_variable.name}, например, momemtum/dense_1.
shape Список или кортеж, по умолчанию None. Форма создаваемой переменной оптимизатора. Если None, создаваемая переменная будет иметь ту же форму, что и model_variable.
initial_value Тензор или Python-объект, преобразуемый в тензор, по умолчанию None. Начальное значение переменной оптимизатора, если None, начальное значение будет установлено по умолчанию в 0.
Возвращаемые значения
Переменная оптимизатора.

aggregate_gradients

Просмотреть исходный код

aggregate_gradients(
    grads_and_vars
)

Агрегировать градиенты на всех устройствах.

По умолчанию мы будем выполнять reduce_sum градиентов по устройствам. Пользователи могут реализовать свою собственную логику агрегирования, переопределив этот метод.

Аргументы
grads_and_vars Список пар (градиент, переменная).
Возвращаемые значения
Список пар (градиент, переменная).

apply_gradients

Просмотреть исходный код

apply_gradients(
    grads_and_vars, skip_gradients_aggregation=False
)

Применить градиенты к переменным.

Аргументы
grads_and_vars Список пар (градиент, переменная).
skip_gradients_aggregation Если True, агрегация градиентов не будет выполнена внутри оптимизатора. Обычно этот аргумент устанавливается в True, когда вы пишете пользовательский код для агрегирования градиентов вне оптимизатора.
Возвращаемые значения
None
Исключения
TypeError Если grads_and_vars имеет неправильный формат.
RuntimeError Если вызов происходит в контексте кросс-репликации.

build

Просмотреть исходный код

@abc.abstractmethod
build(
    var_list
)

Инициализирует переменные оптимизатора, такие как переменные момента.

Эта функция должна быть реализована подклассами оптимизаторов, и подклассы оптимизаторов должны вызывать super().build(var_list).

Аргументы
var_list Список переменных модели, на которых будут строиться оптимизаторы. Например, оптимизатор SGD с моментом будет хранить одну переменную момента, соответствующую каждой переменной модели.

compute_gradients

Просмотреть исходный код

compute_gradients(
    loss, var_list, tape=None
)

Вычисляет градиенты функции потерь по обучаемым переменным.

Аргументы
loss Tensor или вызываемый объект. Если вызываемый объект, loss не должен принимать аргументы и возвращать значение для минимизации.
var_list список или кортеж объектов Variable, которые нужно обновить для минимизации loss.
tape (Необязательно) tf.GradientTape. Если loss предоставлен как Tensor, лента, которая вычислила loss, должна быть предоставлена.
Возвращает
Список пар (градиент, переменная). Переменная всегда присутствует, но градиент может быть None.

finalize_variable_values

Просмотреть исходный код

finalize_variable_values(
    var_list
)

Устанавливает конечное значение обучаемых переменных модели.

Иногда перед окончанием обновлений переменных есть дополнительные шаги, такие как переопределение переменных модели их средним значением.

Аргументы
var_list список переменных модели.

from_config

Просмотреть исходный код

@classmethod
from_config(
    config
)

Создает оптимизатор из его конфигурации.

Этот метод является обратным get_config, способным создать тот же оптимизатор из словаря конфигурации.

Аргументы
config Словарь Python, обычно вывод get_config.
Возвращает
Экземпляр оптимизатора.

get_config

Просмотреть исходный код

get_config()

Возвращает конфигурацию оптимизатора.

Конфигурация оптимизатора — это словарь Python (сериализуемый), содержащий конфигурацию оптимизатора. Тот же оптимизатор можно позже восстановить (без сохранённого состояния) из этой конфигурации.

Подкласс оптимизатора должен переопределить этот метод, чтобы включить другие гиперпараметры.

Возвращает
Словарь Python.

minimize

Просмотреть исходный код

minimize(
    loss, var_list, tape=None
)

Минимизирует loss путём обновления var_list.

Этот метод просто вычисляет градиент с помощью tf.GradientTape и вызывает apply_gradients(). Если вы хотите обработать градиент перед применением, то вызовите tf.GradientTape и apply_gradients() явно вместо использования этой функции.

Аргументы
loss Tensor или вызываемый объект. Если вызываемый объект, loss не должен принимать аргументы и возвращать значение для минимизации.
var_list список или кортеж объектов Variable, которые нужно обновить для минимизации loss.
tape (Необязательно) tf.GradientTape.
Возвращает
None

update_step

Просмотреть исходный код

@abc.abstractmethod
update_step(
    gradient, variable
)

Функция обновления значения переменной на основе заданных градиентов.

Этот метод должен быть реализован в пользовательских оптимизаторах.

Аргументы
gradient Градиент обратного распространения заданной переменной.
variable Переменная, значение которой нужно обновить.
Возвращает
Объект Operation, который применяет указанные градиенты.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/keras/optimizers/experimental/Optimizer

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API