Spec-Zone.ru › TensorFlow 1.15

tf.contrib.mixed_precision.LossScaleOptimizer

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

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

tf.contrib.mixed_precision.LossScaleOptimizer(
    opt, loss_scale_manager
)

Этот класс полезен для «обучения в смешанной точности» на GPU (или других потенциальных ускорителях), подхода для повышения производительности вычислений без ущерба для качества модели.

Канонический способ выполнения обучения в смешанной точности следующий:

  • Переменные модели хранятся в высокой точности (например, float32).
  • Вычисления выполняются в меньшей точности (например, float16), что обеспечивает ускорение производительности благодаря аппаратной поддержке. Переменные преобразуются в меньшую точность перед использованием.
  • Конечные градиенты преобразуются обратно в тип высокой точности, затем используются для обновления переменных.

Побочным эффектом выполнения вычислений в меньшей точности является меньший числовой диапазон. Во время обратного распространения небольшие градиенты могут выходить за пределы числового диапазона, что приводит к сходимости модели на суб-оптимальном уровне.

Для предотвращения переполнения этот оптимизатор умножает потери на множитель перед началом обратного распространения. Вследствие этого градиенты линейно увеличиваются на тот же множитель, не попадая в зону переполнения. После этого, чтобы сохранить правильность обратного распространения, градиенты уменьшаются на тот же множитель, преобразуются в (большую) точность переменных, затем применяются к переменным.

Подробнее см. Руководство Nvidia по обучению в смешанной точности.

Для использования оптимизатора масштабирования потерь достаточно выбрать стратегию масштабирования потерь и обернуть обычный оптимизатор. Примеры ниже.

loss = loss_fn()
opt = tf.AdamOptimizer(learning_rate=...)

# Choose a loss scale manager which decides how to pick the right loss scale
# throughout the training process.
loss_scale_manager = tf.contrib.mixed_precision.FixedLossScaleManager(5000)

# Wraps the original optimizer in a LossScaleOptimizer.
loss_scale_optimizer =
    tf.contrib.mixed_precision.LossScaleOptimizer(opt, loss_scale_manager)

# Call minimize() on the loss scale optimizer.
train_op = loss_scale_optimizer.minimize(loss)

Если применяется обрезка градиентов, можно вызвать optimizer.compute_gradients() и optimizer.apply_gradients() по отдельности.

Обратите внимание, что данный способ использования LossScaleOptimizer нежелателен. Всегда используйте loss_scale_optimizer.compute_gradients() для вычисления градиентов вместо tf.gradients(), если выполняется обучение в смешанной точности.

# The following is a wrong way to use LossScaleOptimizer along with
# tf.gradients().

# Always use loss_scale_optimizer.compute_gradients() to compute grads, or
# loss scale is not correctly applied.
grads = tf.gradients(loss, ...)

# Do some custom grad clipping.
grads = clip_grads(grads, ...)

loss_scale_optimizer.apply(grads_and_vars)
Args
opt Фактический оптимизатор, который будет использоваться для вычисления и применения градиентов. Должен быть реализацией интерфейса tf.compat.v1.train.Optimizer.
loss_scale_manager Объект LossScaleManager.

Методы

apply_gradients

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

apply_gradients(
    grads_and_vars, global_step=None, name=None
)

Применить градиенты. См. базовый класс tf.compat.v1.train.Optimizer.

compute_gradients

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

compute_gradients(
    loss, var_list=None, gate_gradients=optimizer.Optimizer.GATE_OP,
    aggregation_method=None, colocate_gradients_with_ops=False, grad_loss=None
)

Вычислить градиенты. См. базовый класс tf.compat.v1.train.Optimizer.

get_name

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

get_name()

get_slot

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

get_slot(
    var, name
)

Возвращает слот с именем name , созданный для var оптимизатором.

Некоторые подклассы Optimizer используют дополнительные переменные. Например, Momentum и Adagrad используют переменные для накопления обновлений. Этот метод предоставляет доступ к этим объектам Variable , если они вам по какой-то причине нужны.

Используйте get_slot_names() для получения списка имен слотов, созданных оптимизатором Optimizer.

Args
var Переменная, переданная в minimize() или apply_gradients().
name Строка.
Возвращает
Переменную Variable для слота, если она была создана, None в противном случае.

get_slot_names

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

get_slot_names()

Возвращает список имён слотов, созданных оптимизатором Optimizer.

См. get_slot().

Возвращает
Список строк.

minimize

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

minimize(
    loss, global_step=None, var_list=None, gate_gradients=GATE_OP,
    aggregation_method=None, colocate_gradients_with_ops=False, name=None,
    grad_loss=None
)

Добавить операции для минимизации loss путём обновления var_list.

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

Args
loss Объект, содержащий значение для минимизации.
global_step Необязательный параметр, увеличивающий счётчик на один после обновления переменных.
var_list Необязательный список или кортеж объектов Variable для обновления, чтобы минимизировать loss. По умолчанию это список переменных, собранных в графе под ключом GraphKeys.TRAINABLE_VARIABLES.
gate_gradients Как управлять вычислением градиентов. Может быть GATE_NONE, GATE_OP, или GATE_GRAPH.
aggregation_method Определяет метод объединения градиентов. Допустимые значения определены в классе AggregationMethod.
colocate_gradients_with_ops Если True, попытаться разместить градиенты с соответствующим оператором.
name Необязательное имя для возвращаемого оператора.
grad_loss Необязательно. Объект Tensor , содержащий вычисленный градиент для loss .
Возвращает
Оператор, обновляющий переменные в var_list. Если global_step не None, этот оператор также увеличивает global_step.
Исключения
ValueError Если некоторые из переменных не являются объектами Variable .

Совместимость с Eager

При включённом режиме Eager execution, loss должна быть Python-функцией без аргументов, вычисляющей значение для минимизации. Минимизация (и вычисление градиента) выполняется относительно элементов var_list , если оно не равно None, иначе — относительно любых обучаемых переменных, созданных во время выполнения функции loss . gate_gradients, aggregation_method, colocate_gradients_with_ops и grad_loss игнорируются при включенном режиме Eager execution.

variables

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

variables()

Список переменных, которые кодируют текущее состояние Optimizer.

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

Возвращает
Список переменных.

Переменные класса

  • GATE_GRAPH = 2
  • GATE_NONE = 0
  • GATE_OP = 1

© 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/contrib/mixed_precision/LossScaleOptimizer

Spec-Zone.ru

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