tf.keras.mixed_precision.experimental.LossScaleOptimizer
| Просмотреть исходный код на GitHub |
Оптимизатор, применяющий масштабирование потерь.
Наследуется от: Optimizer
tf.keras.mixed_precision.experimental.LossScaleOptimizer(
opt, loss_scale
)
Масштабирование потерь — это процесс умножения потерь на множитель, называемый масштабом потерь, и деления каждого градиента на тот же множитель. Псевдокод для этого процесса:
loss = ... loss *= loss_scale grads = gradients(loss, vars) grads /= loss_scale
Математически масштабирование потерь не оказывает влияния, но может помочь избежать численных потерь точности в промежуточных градиентах при использовании тензоров float16. Умножая потери, к каждому промежуточному градиенту применяется тот же множитель.
Масштаб потерь может быть либо фиксированной константой, выбранной пользователем, либо динамически определяться. Динамическое определение масштаба потерь удобно, поскольку не нужно явно выбирать масштаб потерь. Однако это снижает производительность.
Этот оптимизатор оборачивает другой оптимизатор и применяет к нему масштабирование потерь через LossScale. Масштабирование потерь применяется при вычислении градиентов, либо через minimize() или get_gradients(). Масштаб потерь обновляется через LossScale.update() при применении градиентов, либо через minimize() или apply_gradients(). Например:
opt = tf.keras.optimizers.SGD(0.1) opt = tf.keras.mixed_precision.experimental.LossScaleOptimizer(opt, "dynamic") # 'minimize' applies loss scaling to the loss and updates the loss sale. opt.minimize(loss_fn)
Если для вычисления градиентов используется tf.GradientTape вместо LossScaleOptimizer.minimize или LossScaleOptimizer.get_gradients, потери и градиенты необходимо масштабировать вручную. Это можно сделать, вызвав LossScaleOptimizer.get_scaled_loss перед передачей потерь в tf.GradientTape и LossScaleOptimizer.get_unscaled_gradients после вычисления градиентов с помощью tf.GradientTape. Например:
opt = tf.keras.mixed_precision.experimental.LossScaleOptimizer(...) vars = ... with tf.GradientTape() as tape: loss = ... scaled_loss = opt.get_scaled_loss(loss) scaled_grads = tape.gradient(scaled_loss, vars) grads = opt.get_unscaled_gradients(scaled_grads) opt.apply_gradients(zip(grads, vars)) # Loss scale will be updated here
| Аргументы | |
|---|---|
opt | Экземпляр оптимизатора для обертывания. |
loss_scale | Масштаб потерь для масштабирования потерь и градиентов. Это может быть целое число/вещественное число для использования фиксированного масштаба потерь, строка "dynamic" для использования динамического масштабирования потерь или экземпляр LossScale. Строка "dynamic" эквивалентна передаче DynamicLossScale(), а передача целого числа/вещественного числа эквивалентна передаче FixedLossScale с заданным масштабом потерь. |
| Атрибуты | |
|---|---|
iterations | Переменная. Количество шагов обучения, выполненных этим оптимизатором. |
learning_rate | |
loss_scale | Экземпляр LossScale , связанный с этим оптимизатором. |
lr | |
weights | Возвращает переменные этого оптимизатора в порядке их создания. |
Методы
add_slot
add_slot(
var, slot_name, initializer='zeros'
)
Добавить новую переменную слота для var.
add_weight
add_weight(
name, shape, dtype=None, initializer='zeros', trainable=None,
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.VariableAggregation.NONE
)
apply_gradients
apply_gradients(
grads_and_vars, name=None
)
Применить градиенты к переменным.
Это вторая часть minimize(). Она возвращает Operation, который применяет градиенты.
| Аргументы | |
|---|---|
grads_and_vars | Список пар (градиент, переменная). |
name | Необязательное имя для возвращаемой операции. По умолчанию имя, переданное конструктору Optimizer. |
| Возвращает | |
|---|---|
Operation, который применяет указанные градиенты. Значение iterations автоматически увеличится на 1. |
| Исключения | |
|---|---|
TypeError | Если grads_and_vars имеет неправильный формат. |
ValueError | Если ни у одной из переменных нет градиентов. |
from_config
@classmethod
from_config(
config, custom_objects=None
)
Создает оптимизатор из его конфигурации.
Этот метод является обратным к get_config, способный создать тот же оптимизатор из словаря конфигурации.
| Аргументы | |
|---|---|
config | Словарь Python, обычно результат get_config. |
custom_objects | Словарь Python, сопоставляющий имена дополнительным объектам Python, используемым для создания этого оптимизатора, таким как функция, используемая для гиперпараметра. |
| Возвращает | |
|---|---|
| Экземпляр оптимизатора. |
get_config
get_config()
Возвращает конфигурацию оптимизатора.
Конфигурация оптимизатора — это словарь Python (сериализуемый) содержащий конфигурацию оптимизатора. Тот же оптимизатор может быть позже пересоздан (без сохранения состояния) из этой конфигурации.
| Возвращает | |
|---|---|
| Словарь Python. |
get_gradients
get_gradients(
loss, params
)
Возвращает градиенты loss по отношению к params.
| Аргументы | |
|---|---|
loss | Тензор потерь. |
params | Список переменных. |
| Возвращает | |
|---|---|
| Список тензоров градиентов. |
| Исключения | |
|---|---|
ValueError | В случае, если какой-либо градиент не может быть вычислен (например, если функция градиента не реализована). |
get_scaled_loss
get_scaled_loss(
loss
)
Масштабирует потери на масштаб потерь.
Этот метод необходим только в том случае, если вы вычисляете градиенты вручную, например, с помощью tf.GradientTape. В этом случае вызовите этот метод для масштабирования потерь перед передачей потерь в tf.GradientTape. Если вы используете LossScaleOptimizer.minimize или LossScaleOptimizer.get_gradients, масштабирование потерь применяется автоматически, и этот метод не нужен.
Если этот метод вызывается, следует также вызвать get_unscaled_gradients. См. документацию tf.keras.mixed_precision.experimental.LossScaleOptimizer для примера.
| Аргументы | |
|---|---|
loss | Потери, которые будут умножены на масштаб потерь. Может быть либо тензором, либо вызываемой функцией, возвращающей тензор. |
| Возвращает | |
|---|---|
loss умноженный на LossScaleOptimizer.loss_scale(). |
get_slot
get_slot(
var, slot_name
)
get_slot_names
get_slot_names()
Список имен слотов этого оптимизатора.
get_unscaled_gradients
get_unscaled_gradients(
grads
)
Рассчитывает градиенты, деля их на масштаб потерь.
Этот метод нужен только если вы вычисляете градиенты вручную, например, с помощью tf.GradientTape. В этом случае, вызовите этот метод для деления градиентов на масштаб потерь после их вычисления с помощью tf.GradientTape. Если вы используете LossScaleOptimizer.minimize или LossScaleOptimizer.get_gradients, масштабирование потерь применяется автоматически, и этот метод не нужен.
Если этот метод вызван, get_scaled_loss также должен быть вызван. Смотрите tf.keras.mixed_precision.experimental.LossScaleOptimizer документацию для примера.
| Аргументы | |
|---|---|
grads | Список тензоров, каждый из которых будет разделен на масштаб потерь. Может содержать значения None, которые игнорируются. |
| Возвращает | |
|---|---|
Новый список той же длины, что и grads, где каждое ненулевое значение в grads делится на LossScaleOptimizer.loss_scale(). |
get_updates
get_updates(
loss, params
)
get_weights
get_weights()
minimize
minimize(
loss, var_list, grad_loss=None, name=None
)
Минимизирует loss, обновляя var_list.
Этот метод просто вычисляет градиент с помощью tf.GradientTape и вызывает apply_gradients(). Если вы хотите обработать градиент перед применением, то вызовите tf.GradientTape и apply_gradients() явно вместо использования этой функции.
| Аргументы | |
|---|---|
loss | Функция без аргументов, возвращающая значение для минимизации. |
var_list | Список или кортеж объектов Variable, которые нужно обновить для минимизации loss, или функция, возвращающая список или кортеж объектов Variable. Используйте функцию, когда список переменных был бы неполным до minimize, так как переменные создаются в первый раз, когда вызывается loss. |
grad_loss | Необязательно. Объект Tensor, содержащий градиент, вычисленный для loss. |
name | Необязательное имя для возвращаемой операции. |
| Возвращает | |
|---|---|
Операция, которая обновляет переменные в var_list. Если global_step не None, эта операция также увеличивает global_step. |
| Возможные исключения | |
|---|---|
ValueError | Если некоторые переменные не являются объектами Variable. |
set_weights
set_weights(
weights
)
variables
variables()
Возвращает переменные этого оптимизатора в порядке их создания.
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/keras/mixed_precision/experimental/LossScaleOptimizer