Spec-Zone.ru › TensorFlow 2.4

tf.keras.mixed_precision.LossScaleOptimizer

Оптимизатор, применяющий масштабирование потерь для предотвращения численных потери точности.

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

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.keras.mixed_precision.LossScaleOptimizer

tf.keras.mixed_precision.LossScaleOptimizer(
    inner_optimizer, dynamic=True, initial_scale=None, dynamic_growth_steps=None
)

Масштабирование потерь — это техника, предотвращающая потерю точности в промежуточных градиентах при использовании float16. Для предотвращения потери точности потеря умножается (или «масштабируется») на определённый множитель, называемый «масштабом потерь», что приводит к масштабированию промежуточных градиентов также на масштаб потерь. Окончательные градиенты делятся (или «размасштабиваются») на масштаб потерь, чтобы вернуть их к исходному значению.

LossScaleOptimizer обёртку другого оптимизатора и применяет к нему масштабирование потерь. По умолчанию масштаб потерь динамически обновляется со временем, поэтому вам не нужно выбирать масштаб потерь. Метод minimize автоматически масштабирует потерю, размасштабирует градиенты и обновит масштаб потерь, поэтому всё, что вам нужно сделать, это обернуть свой оптимизатор с помощью LossScaleOptimizer, если вы используете minimize. Например:

opt = tf.keras.optimizers.SGD(0.25)
opt = tf.keras.mixed_precision.LossScaleOptimizer(opt)
var = tf.Variable(1.)
loss_fn = lambda: var ** 2
# 'minimize' applies loss scaling and updates the loss sale.
opt.minimize(loss_fn, var_list=var)
var.numpy()
0.5

Если для вычисления градиентов используется tf.GradientTape, а не minimize, вы должны вручную масштабировать потерю и градиенты. Это можно сделать с помощью методов LossScaleOptimizer.get_scaled_loss и LossScaleOptimizer.get_unscaled_gradients. Например:

with tf.GradientTape() as tape:
  loss = loss_fn()
  scaled_loss = opt.get_scaled_loss(loss)
scaled_grad = tape.gradient(scaled_loss, var)
(grad,) = opt.get_unscaled_gradients([scaled_grad])
opt.apply_gradients([(grad, var)])  # Loss scale is updated here
var.numpy()
0.25
Предупреждение: Если вы забудете вызвать get_scaled_loss или get_unscaled_gradients (или оба), при использовании tf.GradientTape, модель, скорее всего, сойдётся к худшему качеству. Пожалуйста, убедитесь, что вы вызываете каждую функцию ровно один раз.

При использовании смешанной точности с float16, как правило, нет риска потери точности, влияющей на качество модели, если масштабирование потерь используется должным образом. См. руководство по смешанной точности для получения более подробной информации о том, как использовать смешанную точность.

Аргументы
inner_optimizer Экземпляр tf.keras.optimizers.Optimizer для обёртки.
dynamic Булево значение, указывающее, используется ли динамическое масштабирование потерь. По умолчанию True. Если True, масштаб потерь будет динамически обновляться со временем с помощью алгоритма, который поддерживает масштаб потерь вблизи его оптимального значения. Если False, используется один фиксированный масштаб потерь, и должен быть указан initial_scale, который используется в качестве масштаба потерь. Рекомендуется оставлять как True, так как выбор фиксированного масштаба потерь может быть сложным. В настоящее время существует небольшая накладная стоимость для динамического масштабирования потерь по сравнению с фиксированным масштабированием потерь.
initial_scale Начальный масштаб потерь. Если dynamic равно True, это по умолчанию 2 ** 15. Если dynamic равно False, это значение должно быть указано и используется в качестве единственного масштаба потерь, поскольку масштаб потерь не меняется со временем. При использовании динамического масштабирования потерь, предпочтительнее, чтобы это значение было очень большим числом, потому что масштаб потерь, который слишком велик, снижается гораздо быстрее, чем масштаб потерь, который слишком мал, увеличивается.
dynamic_growth_steps При динамическом масштабировании потерь каждые dynamic_growth_steps шагов с конечными градиентами масштаб потерь удваивается. По умолчанию 2000. Если встречается бесконечный градиент, счётчик сбрасывается обратно к нулю, градиенты пропускаются на этом шаге, и масштаб потерь уменьшается вдвое. Счётчик можно запросить с помощью LossScaleOptimizer.dynamic_counter. Этот аргумент может быть указан только если dynamic равно True.

LossScaleOptimizer иногда будет пропускать применение градиентов к переменным, в этом случае изменяемые переменные не изменятся на этом шаге. Это делается потому, что динамический масштаб потерь иногда будет слишком высоким, вызывая переполнение в градиентах. Обычно первые 2-15 шагов модели пропускаются, так как начальный масштаб потерь очень велик, но после этого шаги будут пропускаться в среднем 0,05% времени (доля пропущенных шагов равна 1 / dynamic_growth_steps).

LossScaleOptimizer делегирует все публичные Optimizer методы внутреннему оптимизатору. Кроме того, в методах minimize и get_gradients, it scales the loss and unscales the gradients. In methodsminimizeandapply_gradients`, он дополнительно обновляет масштаб потерь и пропускает применение градиентов, если любой градиент имеет бесконечное значение.

Гиперпараметры

К гиперпараметрам можно получить доступ и настроить их в LossScaleOptimizer, что будет делегировано обернутому оптимизатору.

opt = tf.keras.optimizers.Adam(beta_1=0.8, epsilon=1e-5)
opt = tf.keras.mixed_precision.LossScaleOptimizer(opt)
opt.beta_1  # Equivalent to `opt.inner_optimizer.beta_1`
0.8
opt.beta_1 = 0.7  # Equivalent to `opt.inner_optimizer.beta_1 = 0.7`
opt.beta_1
0.7
opt.inner_optimizer.beta_1
0.7

Однако доступ или изменение не гиперпараметров не делегируется LossScaleOptimizer. В оптимизаторе Adam, beta_1 является гиперпараметром, но epsilon не является, так как оптимизатор Adam вызывает только Optimizer._set_hyper на beta_1.

opt.inner_optimizer.epsilon
1e-5
opt.epsilon
Traceback (most recent call last):

AttributeError: 'LossScaleOptimizer' object has no attribute 'epsilon'
opt.epsilon = 1e-4  # This does NOT set epsilon on `opt.inner_optimizer`
opt.inner_optimizer.epsilon
1e-5

В примере выше, несмотря на установку epsilon в LossScaleOptimizer, старое значение epsilon по-прежнему будет использоваться при обучении, поскольку epsilon не был установлен в внутреннем оптимизаторе.

Исключения
ValueError в случае любого недопустимого аргумента.
Атрибуты
dynamic Булево значение, указывающее, используется ли динамическое масштабирование потерь.
dynamic_counter Количество шагов с момента последнего увеличения или уменьшения масштаба потерь.

Это None, если LossScaleOptimizer.dynamic равно False.

Счётчик увеличивается на каждом шаге. Достигнув LossScaleOptimizer.dynamic_growth_steps, масштаб потерь удваивается, а счётчик сбрасывается обратно к нулю. Если встретятся бесконечные градиенты, масштаб потерь уменьшится вдвое, а счётчик сбросится обратно к нулю.

dynamic_growth_steps Количество шагов, необходимое для увеличения масштаба потерь.

Это None, если LossScaleOptimizer.dynamic равно False.

Каждый dynamic_growth_steps последовательных шагов с конечными градиентами, масштаб потерь увеличивается.

initial_scale Начальный масштаб потерь.

Если LossScaleOptimizer.dynamic равно False, это то же число, что и LossScaleOptimizer.loss_scale, так как масштаб потерь никогда не меняется.

inner_optimizer Оптимизатор, который обернут этим LossScaleOptimizer.
loss_scale Текущий масштаб потерь как скалярный тензор float32.

Методы

get_scaled_loss

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

get_scaled_loss(
    loss
)

Масштабирует потерю на масштаб потерь.

Этот метод необходим только если вы вычисляете градиенты вручную, например, с помощью tf.GradientTape. В этом случае вызовите этот метод, чтобы масштабировать потерю перед передачей потери в tf.GradientTape. Если вы используете LossScaleOptimizer.minimize или LossScaleOptimizer.get_gradients, масштабирование потерь применяется автоматически, и этот метод не нужен.

Если этот метод вызывается, то должен быть вызван и get_unscaled_gradients. См. документацию tf.keras.mixed_precision.LossScaleOptimizer для примера.

Аргументы
loss Потеря, которая будет умножена на масштаб потерь. Может быть либо тензором, либо вызываемой функцией, возвращающей тензор.
Возвращает
loss , умноженное на LossScaleOptimizer.loss_scale.

get_unscaled_gradients

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

get_unscaled_gradients(
    grads
)

Размасштабирует градиенты на масштаб потерь.

Этот метод необходим только если вы вычисляете градиенты вручную, например, с помощью tf.GradientTape. В этом случае вызовите этот метод, чтобы размасштабировать градиенты после их вычисления с помощью tf.GradientTape. Если вы используете LossScaleOptimizer.minimize или LossScaleOptimizer.get_gradients, масштабирование потерь применяется автоматически, и этот метод не нужен.

Если этот метод вызывается, то должен быть вызван и get_scaled_loss. См. документацию tf.keras.mixed_precision.LossScaleOptimizer для примера.

Аргументы
grads Список тензоров, каждый из которых будет разделен на масштаб потерь. Может содержать значения None, которые игнорируются.
Возвращает
Новый список такой же длины, как и grads, где каждое ненулевое значение в grads делится на LossScaleOptimizer.loss_scale.

© 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/r2.4/api_docs/python/tf/keras/mixed_precision/LossScaleOptimizer

Spec-Zone.ru

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