tf.keras.mixed_precision.experimental.LossScaleOptimizer
| Просмотреть исходный код на GitHub |
Оптимизатор, применяющий масштабирование потерь.
Наследуется от: Optimizer
tf.keras.mixed_precision.experimental.LossScaleOptimizer(
optimizer, 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.25)
opt = tf.keras.mixed_precision.experimental.LossScaleOptimizer(opt,
"dynamic")
var = tf.Variable(1.)
loss_fn = lambda: var ** 2
# 'minimize' applies loss scaling to the loss and updates the loss sale.
opt.minimize(loss_fn, var_list=var)
var.numpy()
0.5
Если для вычисления градиентов используется tf.GradientTape вместо LossScaleOptimizer.minimize или LossScaleOptimizer.get_gradients, потери и градиенты должны быть масштабированы вручную. Это можно сделать, вызвав LossScaleOptimizer.get_scaled_loss перед передачей потерь в tf.GradientTape и LossScaleOptimizer.get_unscaled_gradients после вычисления градиентов с помощью tf.GradientTape. Например:
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
| Аргументы | |
|---|---|
optimizer | Экземпляр Optimizer для обертывания. |
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.compat.v1.VariableAggregation.NONE
)
apply_gradients
apply_gradients(
grads_and_vars, name=None, experimental_aggregate_gradients=True
)
Применение градиентов к переменным.
Это вторая часть minimize(). Она возвращает Operation, который применяет градиенты.
Метод суммирует градиенты со всех реплик при наличии tf.distribute.Strategy по умолчанию. Вы можете самостоятельно агрегировать градиенты, передав experimental_aggregate_gradients=False.
Пример:
grads = tape.gradient(loss, vars)
grads = tf.distribute.get_replica_context().all_reduce('sum', grads)
# Processing aggregated gradients.
optimizer.apply_gradients(zip(grads, vars),
experimental_aggregate_gradients=False)
| Аргументы | |
|---|---|
grads_and_vars | Список пар (градиент, переменная). |
name | Необязательное имя для возвращаемой операции. По умолчанию используется имя, переданное в конструктор Optimizer. |
experimental_aggregate_gradients | Нужно ли суммировать градиенты от разных реплик при наличии tf.distribute.Strategy. Если False, пользователь отвечает за агрегацию градиентов. По умолчанию True. |
| Возвращаемое значение | |
|---|---|
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()
Возвращает текущие веса оптимизатора.
Веса оптимизатора — это его состояние (т.е. переменные). Эта функция возвращает значения весов, связанные с этим оптимизатором, в виде списка массивов NumPy. Первое значение всегда — счётчик итераций оптимизатора, а за ним — переменные состояния оптимизатора в порядке их создания. Возвращённый список можно использовать для загрузки состояния в аналогичные оптимизаторы.
Например, оптимизатор RMSprop для этой простой модели возвращает список из трёх значений — счётчик итераций, а затем среднеквадратичное значение для ядра и смещения единственного слоя Dense:
opt = tf.keras.optimizers.RMSprop()
m = tf.keras.models.Sequential([tf.keras.layers.Dense(10)])
m.compile(opt, loss='mse')
data = np.arange(100).reshape(5, 20)
labels = np.zeros(5)
print('Training'); results = m.fit(data, labels)
Training ...
len(opt.get_weights())
3
| Возвращает | |
|---|---|
| Значения весов в виде списка массивов NumPy. |
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 | Необязательное имя для возвращаемой операции. |
| Возвращает | |
|---|---|
Объект Operation, который обновляет переменные в var_list. Счётчик iterations будет автоматически увеличен на 1. |
| Исключения | |
|---|---|
ValueError | Если некоторые из переменных не являются объектами Variable. |
set_weights
set_weights(
weights
)
Устанавливает веса оптимизатора.
Веса оптимизатора — это его состояние (т.е. переменные). Эта функция принимает значения весов, связанные с этим оптимизатором, в виде списка массивов NumPy. Первое значение всегда — счётчик итераций оптимизатора, а за ним — переменные состояния оптимизатора в порядке их создания. Переданные значения используются для установки нового состояния оптимизатора.
Например, оптимизатор RMSprop для этой простой модели принимает список из трёх значений — счётчик итераций, а затем среднеквадратичное значение для ядра и смещения единственного слоя Dense:
opt = tf.keras.optimizers.RMSprop()
m = tf.keras.models.Sequential([tf.keras.layers.Dense(10)])
m.compile(opt, loss='mse')
data = np.arange(100).reshape(5, 20)
labels = np.zeros(5)
print('Training'); results = m.fit(data, labels)
Training ...
new_weights = [np.array(10), np.ones([20, 10]), np.zeros([10])]
opt.set_weights(new_weights)
opt.iterations
<tf.Variable 'RMSprop/iter:0' shape=() dtype=int64, numpy=10>
| Аргументы | |
|---|---|
weights | Значения весов в виде списка массивов NumPy. |
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/r2.3/api_docs/python/tf/keras/mixed_precision/experimental/LossScaleOptimizer