tf.contrib.opt.ShampooOptimizer
Оптимизатор Shampoo
Наследуется от: Optimizer
tf.contrib.opt.ShampooOptimizer(
global_step=0, max_matrix_size=768, gbar_decay=0.0, gbar_weight=1.0,
mat_gbar_decay=1.0, mat_gbar_weight=1.0, learning_rate=1.0, svd_interval=1,
precond_update_interval=1, epsilon=0.0001, alpha=0.5, use_iterative_root=False,
use_locking=False, name='Shampoo'
)
Вариант Adagrad, использующий одну матрицу предварительного кондиционирования для каждого измерения переменной. Подробнее см. https://arxiv.org/abs/1802.09568
gbar — это взвешенная по времени накопленная градиент: gbar[t] = gbar_decay[t] * gbar[t-1] + gbar_weight[t] * g[t]
mat_gbar — это взвешенная по времени накопленная квадрат градиента: mat_gbar_j[t] = mat_gbar_decay[t] * mat_gbar_j[t-1]
+ mat_gbar_weight[t] * gg_j[t]
где если g[t] = g_abcd, то gg_a[t] = g_abcd g_a'bcd (нотация Эйнштейна)
Правило обновления:
w[t+1] = w[t] - learning_rate[t] * Prod_j mat_gbar_j[t]^(-alpha/n) gbar[t] Опять же, mat_gbar_j[t]^(-alpha) gbar[t] — это тензорное сокращение по j-му измерению gbar[t] с первым измерением mat_gbar_j[t]^(-alpha/n), где alpha — гиперпараметр, а n — ранг переменной. Prod_j представляет собой выполнение этого сокращения для всех j от 0 до n-1.
Как правило, learning_rate является константой, но может зависеть от времени, передавая лямбда-функцию, зависящую от шага.
| Аргументы | |
|---|---|
global_step | Переменная TensorFlow, указывающая шаг. |
max_matrix_size | Мы не выполняем SVD для матриц, размер которых превышает это значение. |
gbar_decay | |
gbar_weight | Используется для обновления gbar: gbar[t] = gbar_decay[t] * gbar[t-1] + gbar_weight[t] * g[t] |
mat_gbar_decay | |
mat_gbar_weight | Используется для обновления mat_gbar: mat_gbar_j[t] = mat_gbar_decay[t] * mat_gbar_j[t-1]
|
learning_rate | Аналогично SGD |
svd_interval | Мы должны выполнить SVD после этого количества шагов. По умолчанию = 1, т.е. на каждом шаге. Обычно 20 приводит к отсутствию потери точности, а 50 или 100 тоже нормально. Возможно, захотите чаще в начале и реже в конце — задайте в вызывающей функции, например: "svd_interval = lambda(T): tf.cond( T < 2000, lambda: 20.0, lambda: 1000.0)" |
precond_update_interval | Мы должны обновить предварительные кондиционеры после этого количества шагов. По умолчанию = 1. Обычно меньше, чем svd_interval. |
epsilon | epsilon * I_n добавляется к каждой mat_gbar_j для обеспечения устойчивости для недиагональной версии shampoo. |
alpha | общая степень предварительных кондиционеров. |
use_iterative_root | должен ли оптимизатор использовать SVD (быстрее) или итеративный метод корней (для TPU) для поиска корней PSD-матриц. |
use_locking | |
name | имя оптимизатора. |
Методы
apply_gradients
apply_gradients(
grads_and_vars, global_step=None, name=None
)
Применить градиенты к переменным.
Это вторая часть minimize(). Она возвращает Operation, который применяет градиенты.
| Аргументы | |
|---|---|
grads_and_vars | Список пар (градиент, переменная), возвращаемых compute_gradients(). |
global_step | Необязательный Variable для увеличения на единицу после обновления переменных. |
name | Необязательное имя возвращаемой операции. По умолчанию — имя, переданное конструктору Optimizer. |
| Возвращаемое значение | |
|---|---|
Operation для применения заданных градиентов. Если global_step не равно None, эта операция также увеличивает global_step. |
| Исключения | |
|---|---|
TypeError | Если grads_and_vars имеет неправильный формат. |
ValueError | Если у ни одной из переменных нет градиента. |
RuntimeError | Если следует использовать _distributed_apply() вместо этого. |
compute_gradients
compute_gradients(
loss, var_list=None, gate_gradients=GATE_OP, aggregation_method=None,
colocate_gradients_with_ops=False, grad_loss=None
)
Вычислить градиенты loss для переменных в var_list.
Это первая часть minimize(). Она возвращает список пар (градиент, переменная), где «градиент» — градиент для «переменной». Обратите внимание, что «градиент» может быть Tensor, IndexedSlices, или None если для данной переменной нет градиента.
| Аргументы | |
|---|---|
loss | Тензор, содержащий значение для минимизации, или вызываемая функция без аргументов, возвращающая значение для минимизации. При включённом режиме выполнения eager он должен быть вызываемой функцией. |
var_list | Необязательный список или кортеж tf.Variable для обновления для минимизации loss. По умолчанию — список переменных, собранных в графе под ключом GraphKeys.TRAINABLE_VARIABLES. |
gate_gradients | Как управлять вычислением градиентов. Может быть GATE_NONE, GATE_OP, или GATE_GRAPH. |
aggregation_method | Указывает метод комбинирования градиентных терминов. Допустимые значения определены в классе AggregationMethod. |
colocate_gradients_with_ops | Если True, попытаться разместить градиенты вместе с соответствующей операцией. |
grad_loss | Необязательно. Tensor, содержащий градиент, вычисленный для loss. |
| Возвращаемое значение | |
|---|---|
Список пар (градиент, переменная). Переменная всегда присутствует, но градиент может быть None. |
| Исключения | |
|---|---|
TypeError | Если var_list содержит что-либо кроме объектов Variable. |
ValueError | Если некоторые аргументы недопустимы. |
RuntimeError | Если вызвана при включённом eager-режиме и loss не является вызываемой функцией. |
Совместимость с eager-режимом
Когда eager-режим включён, gate_gradients, aggregation_method, и colocate_gradients_with_ops игнорируются.
get_name
get_name()
get_slot
get_slot(
var, name
)
Возвращает слот с именем name, созданный для var оптимизатором.
Некоторые подклассы Optimizer используют дополнительные переменные. Например, Momentum и Adagrad используют переменные для накопления обновлений. Этот метод предоставляет доступ к этим объектам Variable в случае необходимости.
Используйте get_slot_names() для получения списка имён слотов, созданных оптимизатором Optimizer.
| Аргументы | |
|---|---|
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() явно вместо использования этой функции.
| Аргументы | |
|---|---|
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 выполнении loss должен быть Python-функцией без аргументов, вычисляющей значение для минимизации. Минимизация (и вычисление градиента) выполняется относительно элементов var_list, если оно не None, иначе относительно любых обучаемых переменных, созданных во время выполнения функции loss. gate_gradients, aggregation_method, colocate_gradients_with_ops и grad_loss игнорируются при включенном eager выполнении.
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/opt/ShampooOptimizer