tf.keras.optimizers.legacy.Optimizer
Базовый класс для оптимизаторов Keras.
Наследуется от: Optimizer
tf.keras.optimizers.legacy.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 -осознающий, что означает автоматическое суммирование градиентов по всем репликам. Для усреднения градиентов разделите свою функцию потерь на глобальный размер пакета, что делается автоматически, если вы используете встроенные в tf.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 | в случае каких-либо неверных аргументов. |
© 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/legacy/Optimizer