tf.keras.optimizers.Optimizer
| Просмотреть исходный код на GitHub |
Базовый класс для оптимизаторов Keras.
tf.keras.optimizers.Optimizer(
name, gradient_aggregator=None, gradient_transformers=None, **kwargs
)
Вы не должны использовать этот класс напрямую, а вместо этого создать один из его подклассов, таких как tf.keras.optimizers.SGD, tf.keras.optimizers.Adam и т. д.
Использование
# Create an optimizer with the desired parameters. opt = tf.keras.optimizers.SGD(learning_rate=0.1) # `loss` is a callable that takes no argument and returns the value # to minimize. loss = lambda: 3 * var1 * var1 + 2 * var2 * var2 # In graph mode, returns op that minimizes the loss by updating the listed # variables. opt_op = opt.minimize(loss, var_list=[var1, var2]) opt_op.run() # In eager mode, simply call minimize to update the list of variables. opt.minimize(loss, var_list=[var1, var2])
Использование в пользовательских циклах обучения
В моделях Keras иногда переменные создаются при первом вызове модели, а не во время её построения. Примеры включают 1) последовательные модели без предварительно определённой формы входных данных или 2) модели, созданные подклассом. В этих случаях передайте var_list как вызываемую функцию.
Пример:
opt = tf.keras.optimizers.SGD(learning_rate=0.1) model = tf.keras.Sequential() model.add(tf.keras.layers.Dense(num_hidden, activation='relu')) model.add(tf.keras.layers.Dense(num_classes, activation='sigmoid')) loss_fn = lambda: tf.keras.losses.mse(model(input), output) var_list_fn = lambda: model.trainable_weights for input, output in data: opt.minimize(loss_fn, var_list_fn)
Обработка градиентов перед их применением
Вызов minimize() обрабатывает как вычисление градиентов, так и их применение к переменным. Если вы хотите обработать градиенты перед их применением, вы можете использовать оптимизатор в три этапа:
- Вычислите градиенты с помощью
tf.GradientTape. - Обработайте градиенты по своему усмотрению.
- Примените обработанные градиенты с помощью
apply_gradients().
Пример:
# Create an optimizer. opt = tf.keras.optimizers.SGD(learning_rate=0.1) # Compute the gradients for a list of variables. with tf.GradientTape() as tape: loss = <call_loss_function> vars = <list_of_variables> grads = tape.gradient(loss, vars) # Process the gradients, for example cap them, etc. # capped_grads = [MyCapper(g) for g in grads] processed_grads = [process_gradient(g) for g in grads] # Ask the optimizer to apply the processed gradients. opt.apply_gradients(zip(processed_grads, var_list))
Использование с tf.distribute.Strategy
Этот класс оптимизатора tf.distribute.Strategy учитывает, что автоматически суммирует градиенты по всем репликам. Для усреднения градиентов разделите вашу функцию потерь на глобальный размер пакета, что выполняется автоматически, если вы используете встроенные циклы обучения или оценки Keras. Обратитесь к аргументу reduction вашей функции потерь, который должен быть установлен на tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE для усреднения или tf.keras.losses.Reduction.SUM для отсутствия усреднения.
Чтобы самостоятельно агрегировать градиенты, вызовите apply_gradients с experimental_aggregate_gradients установленным в значение False. Это полезно, если вам нужно обработать агрегированные градиенты.
Если вы не используете эти методы и хотите усреднить градиенты, вы должны использовать tf.math.reduce_sum для суммирования ваших потерь на пример и затем разделить на глобальный размер пакета. Обратите внимание, что при использовании tf.distribute.Strategy, первый компонент формы тензора — это локальный размер пакета реплики, который отличается от фактического размера пакета на множитель, равный количеству реплик, используемых для вычисления одного шага. В результате использование tf.math.reduce_mean даст неверный результат, что приведёт к градиентам, которые могут быть многократно больше необходимых.
Ограничения переменных
Все оптимизаторы Keras соблюдают ограничения переменных. Если функция ограничения передана любой переменной, ограничение будет применено к переменной после применения градиента к этой переменной. Важно: Если градиент является тензором разреженной матрицы, ограничение переменных не поддерживается.
Совместимость с потоками
Весь оптимизатор в настоящее время совместим с потоками, но не потокобезопасен. Пользователь должен выполнить синхронизацию при необходимости.
Слотовые переменные
Многие подклассы оптимизаторов, такие как Adam и Adagrad, выделяют и управляют дополнительными переменными, связанными с переменными, которые требуется обучить. Они называются слотовыми переменными. Слотовые переменные имеют имена, и вы можете запросить у оптимизатора имена используемых им слотовых переменных. После получения имени слотовой переменной вы можете запросить у оптимизатора переменную, созданную для хранения значения слотовой переменной.
Это может быть полезно, если вы хотите регистрировать отладочные данные алгоритма обучения, сообщать статистику о слотовых переменных и т.д.
Гиперпараметры
Это аргументы, передаваемые в конструктор подкласса оптимизатора (метод __init__ ), а затем передаваемые методу self._set_hyper(). Они могут быть либо обычными значениями Python (например, 1.0), либо тензорами, либо вызываемыми функциями. Если это вызываемая функция, она будет вызвана во время apply_gradients() для получения значения гиперпараметра.
Гиперпараметры могут быть переопределены с помощью пользовательского кода:
Пример:
# Create an optimizer with the desired parameters. opt = tf.keras.optimizers.SGD(learning_rate=0.1) # `loss` is a callable that takes no argument and returns the value # to minimize. loss = lambda: 3 * var1 + 2 * var2 # In eager mode, simply call minimize to update the list of variables. opt.minimize(loss, var_list=[var1, var2]) # update learning rate opt.learning_rate = 0.05 opt.minimize(loss, var_list=[var1, var2])
Вызываемая функция для скорости обучения
Оптимизатор принимает вызываемую функцию скорости обучения двумя способами. Первый способ — через встроенные или настраиваемые tf.keras.optimizers.schedules.LearningRateSchedule. Расписание будет вызываться на каждой итерации с schedule(iteration), переменной, принадлежащей оптимизатору.
Пример:
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.SGD(learning_rate=learning_rate) loss = lambda: 3 * var opt.minimize(loss, var_list=[var]) <tf.Variable...
Второй способ — через вызываемую функцию, не принимающую аргументов.
Пример:
var = tf.Variable(np.random.random(size=(1,))) def lr_callable(): return .1 opt = tf.keras.optimizers.SGD(learning_rate=lr_callable) loss = lambda: 3 * var opt.minimize(loss, var_list=[var]) <tf.Variable...
Создание пользовательского оптимизатора
Если вы планируете создать свой собственный алгоритм оптимизации, просто унаследуйте от этого класса и переопределите следующие методы:
-
_resource_apply_dense(обновление переменной, учитывая тензор градиента — плотнаяtf.Tensor) -
_resource_apply_sparse(обновление переменной, учитывая тензор градиента — разреженнаяtf.IndexedSlices. Наиболее распространённым способом этого является взятие градиента черезtf.gather.) -
_create_slots(если ваш алгоритм оптимизатора требует дополнительных переменных) -
get_config(сериализация оптимизатора, включая все гиперпараметры)
| Аргументы | |
|---|---|
name | Строка. Имя, используемое для весов аккумулятора моментума, созданных оптимизатором. |
gradient_aggregator | Функция для агрегирования градиентов по устройствам (при использовании tf.distribute.Strategy). Если None, по умолчанию суммирует градиенты по устройствам. Функция должна принимать и возвращать список кортежей (gradient, variable) . |
gradient_transformers | Необязательно. Список функций для преобразования градиентов перед применением обновлений к переменным. Функции применяются после gradient_aggregator. Функции должны принимать и возвращать список кортежей (gradient, variable) . |
**kwargs | дополнительные аргументы. Разрешены следующие аргументы: clipvalue, clipnorm, global_clipnorm. Если clipvalue (число с плавающей точкой) установлено, градиент каждого веса ограничен сверху этим значением. Если clipnorm (число с плавающей точкой) установлено, градиент каждого веса индивидуально ограничен сверху по норме этим значением. Если global_clipnorm (число с плавающей точкой) установлено, градиент всех весов ограничен сверху по глобальной норме этим значением. |
| Возбуждает | |
|---|---|
ValueError | в случае некорректных аргументов. |
| Атрибуты | |
|---|---|
clipnorm | float или None. Если установлено, градиенты ограничиваются максимальной нормой. |
clipvalue | float или None. Если установлено, градиенты ограничиваются максимальным значением. |
global_clipnorm | float или None. Если установлено, градиенты ограничиваются максимальной нормой. См. |
iterations | Переменная. Количество шагов обучения, выполненных этим оптимизатором. |
weights | Возвращает переменные этого оптимизатора в порядке их создания. |
Методы
add_slot
add_slot(
var, slot_name, initializer='zeros', shape=None
)
Добавление новой слотовой переменной для var.
Слотовая переменная — это дополнительная переменная, связанная с var для обучения. Она выделяется и управляется оптимизаторами, например, Adam.
| Аргументы | |
|---|---|
var | объект Variable . |
slot_name | имя слотовой переменной. |
initializer | инициализатор слотовой переменной |
shape | (Необязательно) форма слотовой переменной. Если не установлено, по умолчанию будет использована форма 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, 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 | Если ни у одной из переменных нет градиентов. |
RuntimeError | Если вызов происходит в контексте кросс-репликации. |
from_config
@classmethod
from_config(
config, custom_objects=None
)
Создаёт оптимизатор из его конфигурации.
Этот метод является обратным для get_config, способным восстановить тот же оптимизатор из словаря конфигурации.
| Аргументы | |
|---|---|
config | Словарь Python, обычно результат вызова get_config. |
custom_objects | Словарь Python, сопоставляющий имена с дополнительными объектами Python, используемыми для создания этого оптимизатора, например, функцией, используемой для гиперпараметра. |
| Возвращаемое значение | |
|---|---|
| Экземпляр оптимизатора. |
get_config
@abc.abstractmethod get_config()
Возвращает конфигурацию оптимизатора.
Конфигурация оптимизатора — это словарь Python (сериализуемый), содержащий конфигурацию оптимизатора. Тот же оптимизатор можно повторно создать позже (без сохранения состояния) из этой конфигурации.
| Возвращаемое значение | |
|---|---|
| Словарь Python. |
get_gradients
get_gradients(
loss, params
)
Возвращает градиенты loss по отношению к params.
Должен использоваться только в режиме v1 графиков.
| Аргументы | |
|---|---|
loss | Тензор потери. |
params | Список переменных. |
| Возвращаемое значение | |
|---|---|
| Список тензоров градиента. |
| Исключения | |
|---|---|
ValueError | В случае, если градиент не может быть вычислен (например, если функция градиента не реализована). |
get_slot
get_slot(
var, slot_name
)
get_slot_names
get_slot_names()
Список имён слотов этого оптимизатора.
get_updates
get_updates(
loss, params
)
get_weights
get_weights()
Возвращает текущие веса оптимизатора.
Веса оптимизатора — это его состояние (т.е. переменные). Эта функция возвращает значения весов, связанные с этим оптимизатором, как список массивов NumPy. Первое значение всегда — счётчик итераций оптимизатора, за которым следуют переменные состояния оптимизатора в порядке их создания. Возвращаемый список можно использовать для загрузки состояния в аналогичные параметризованные оптимизаторы.
Например, оптимизатор RMSprop для этой простой модели возвращает список из трёх значений — счётчик итераций, а затем среднеквадратичное значение (RMS) для ядра и смещения единственного слоя 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) results = m.fit(data, labels) # Training. len(opt.get_weights()) 3
| Возвращаемое значение | |
|---|---|
| Значения весов как список массивов NumPy. |
minimize
minimize(
loss, var_list, grad_loss=None, name=None, tape=None
)
Минимизирует loss обновляя var_list.
Этот метод просто вычисляет градиент с помощью tf.GradientTape и вызывает apply_gradients(). Если вы хотите обработать градиент перед применением, вызовите tf.GradientTape и apply_gradients() явно вместо использования этой функции.
| Аргументы | |
|---|---|
loss | Значение для минимизации или вызываемая функция. Если вызываемая функция, она должна не принимать аргументы и возвращать значение для минимизации. Если значение, аргумент tape должен быть передан. |
var_list | Список или кортеж объектов Variable, которые нужно обновить для минимизации loss, или вызываемая функция, возвращающая список или кортеж объектов Variable. Используйте вызываемую функцию, когда список переменных в противном случае будет неполным до minimize, так как переменные создаются в первый раз, когда вызывается loss. |
grad_loss | (Необязательно). Объект Tensor, содержащий градиент, вычисленный для loss. |
name | (Необязательно) str. Имя для возвращаемой операции. |
tape | (Необязательно) tf.GradientTape. Если loss предоставляется как вызываемая функция, должна быть предоставлена лента, которая вычислила loss . |
| Возвращаемое значение | |
|---|---|
Объект Operation, обновляющий переменные в var_list. Счётчик iterations автоматически увеличится на 1. |
| Исключения | |
|---|---|
ValueError | Если некоторые из переменных не являются объектами Variable . |
set_weights
set_weights(
weights
)
Устанавливает веса оптимизатора.
Веса оптимизатора — это его состояние (т.е. переменные). Эта функция принимает значения весов, связанные с этим оптимизатором, как список массивов NumPy. Первое значение всегда — счётчик итераций оптимизатора, за которым следуют переменные состояния оптимизатора в порядке их создания. Переданные значения используются для установки нового состояния оптимизатора.
Например, оптимизатор RMSprop для этой простой модели принимает список из трёх значений — счётчик итераций, а затем среднеквадратичное значение (RMS) для ядра и смещения единственного слоя 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) 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()
Возвращает переменные этого оптимизатора в порядке их создания.
© 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/Optimizer