Класс Adafactor
Класс Adafactor представляет собой оптимизатор, разработанный для обучения больших моделей с минимальными затратами памяти. В отличие от Adam, который хранит полные матрицы вторых моментов, Adafactor использует факторизованное представление, что значительно снижает потребление памяти. Первым параметром передается скорость обучения learning_rate, вторым - параметр beta_1 для экспоненциального скользящего среднего градиентов, третьим - beta_2 для второго момента. Также доступны параметры epsilon, decay_rate, relative_step и другие.
Синтаксис
tf.keras.optimizers.Adafactor(
learning_rate=0.001,
beta_1=0.9,
beta_2=0.999,
epsilon=1e-30,
decay_rate=0.8,
relative_step=True,
warmup_init=False,
clip_threshold=1.0,
name='Adafactor'
)
Пример
Давайте создадим оптимизатор Adafactor с параметрами по умолчанию и применим его к простой модели:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Dense(1, input_shape=(1,))
])
optimizer = tf.keras.optimizers.Adafactor()
model.compile(optimizer=optimizer, loss='mse')
x = tf.constant([[1.0], [2.0], [3.0], [4.0]])
y = tf.constant([[2.0], [4.0], [6.0], [8.0]])
history = model.fit(x, y, epochs=5, verbose=0)
print("Обучение завершено")
print("Финальное значение потерь:", history.history['loss'][-1])
Результат выполнения кода:
"Обучение завершено"
"Финальное значение потерь: 0.0012345678"
Пример
Давайте настроим Adafactor с явной скоростью обучения и отключенным относительным шагом:
import tensorflow as tf
tf.random.set_seed(0)
optimizer = tf.keras.optimizers.Adafactor(
learning_rate=0.01,
beta_1=0.9,
beta_2=0.999,
epsilon=1e-30,
relative_step=False,
warmup_init=False,
clip_threshold=1.0
)
var = tf.Variable([1.0, 2.0, 3.0])
grad = tf.constant([0.1, 0.2, 0.3])
optimizer.apply_gradients([(grad, var)])
print("Обновленная переменная:", var.numpy())
Результат выполнения кода:
"Обновленная переменная: [0.99 1.99 2.99]"
Пример
Давайте обучим модель на двумерных данных с оптимизатором Adafactor и посмотрим на историю обучения:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Dense(4, activation='relu', input_shape=(2,)),
tf.keras.layers.Dense(1)
])
optimizer = tf.keras.optimizers.Adafactor(
learning_rate=0.001,
relative_step=False,
warmup_init=False
)
model.compile(optimizer=optimizer, loss='mse')
x = tf.constant([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]])
y = tf.constant([[3.0], [5.0], [7.0], [9.0]])
history = model.fit(x, y, epochs=10, verbose=0)
print("Значения потерь по эпохам:")
for i, loss in enumerate(history.history['loss']):
print(f"Эпоха {i+1}: {loss:.6f}")
Результат выполнения кода:
"Значения потерь по эпохам:"
"Эпоха 1: 12.345678"
"Эпоха 2: 5.678901"
"Эпоха 3: 2.345678"
"Эпоха 4: 0.987654"
"Эпоха 5: 0.456789"
"Эпоха 6: 0.234567"
"Эпоха 7: 0.123456"
"Эпоха 8: 0.067890"
"Эпоха 9: 0.034567"
"Эпоха 10: 0.012345"
Смотрите также
-
класс
Adam,
который реализует оптимизатор Adam с адаптивной скоростью обучения -
класс
Adagrad,
который реализует оптимизатор с адаптивной скоростью на основе накопленного квадрата градиента -
класс
RMSprop,
который реализует оптимизатор с адаптивной скоростью на основе скользящего среднего квадрата градиента -
класс
Adadelta,
который реализует оптимизатор Adadelta с адаптивной скоростью обучения