TensorFlow.js предоставляет мощные средства для обучения нейронных сетей непосредственно в браузере или в Node.js. Одним из ключевых компонентов эффективного обучения являются оптимизаторы, отвечающие за корректировку весов модели на основе градиентов функции потерь. Рассмотрим наиболее используемые оптимизаторы: Adam, AdaMax, AdaGrad и AdaDelta.
Adam сочетает преимущества двух других методов: AdaGrad (адаптивная скорость обучения для каждого параметра) и RMSProp (скользящее среднее квадратов градиентов). Его ключевая идея — поддерживать экспоненциально взвешенные средние первых моментов градиентов (скорость изменения) и вторых моментов (квадрат градиентов).
Формулы обновления весов:
Вычисление скользящих средних градиентов: [ m_t = 1 m{t-1} + (1 - _1) g_t]
Вычисление скользящих средних квадратов градиентов: [ v_t = 2 v{t-1} + (1 - _2) g_t^2]
Коррекция смещения: [ _t = , _t = ]
Обновление весов: [ t = {t-1} - ]
Параметры:
learningRate (η) — базовая скорость обучения.beta1 — коэффициент экспоненциального сглаживания
первого момента (обычно 0.9).beta2 — коэффициент сглаживания второго момента (обычно
0.999).epsilon — малое число для предотвращения деления на
ноль (обычно 1e-8).В TensorFlow.js создается через:
const optimizer = tf.train.adam(0.001, 0.9, 0.999, 1e-8);
Adam подходит для большинства задач глубокого обучения, особенно при работе с большим количеством параметров и шумными градиентами.
AdaMax — модификация Adam, которая использует бесконечную норму для второго момента градиентов вместо квадратичной нормы. Это делает оптимизатор более стабильным при больших градиентах.
Формулы обновления:
Скользящее среднее первого момента аналогично Adam: [ m_t = 1 m{t-1} + (1 - _1) g_t]
Использование бесконечной нормы для второго момента: [ u_t = (2 u{t-1}, |g_t|)]
Обновление весов: [ t = {t-1} - ]
Параметры: аналогичны Adam
(learningRate, beta1, beta2,
epsilon).
TensorFlow.js пример:
const optimizer = tf.train.adamax(0.002, 0.9, 0.999, 1e-8);
AdaMax лучше работает при экстремально больших градиентах, обеспечивая стабильность обучения.
AdaGrad адаптирует скорость обучения для каждого параметра, уменьшая шаги для часто обновляемых весов и увеличивая для редких. Основная идея — делить скорость обучения на квадратный корень суммы квадратов прошлых градиентов.
Формула:
[ _{t+1} = _t - g_t]
где (G_t) — суммарная квадратура градиентов для каждого параметра до момента t:
[ G_t = _{i=1}^{t} g_i^2]
Особенности:
TensorFlow.js использование:
const optimizer = tf.train.adagrad(0.01, 1e-8);
AdaDelta устраняет проблему убывающей скорости обучения AdaGrad, используя скользящее среднее квадратов градиентов вместо накопления всех предыдущих градиентов. Это позволяет сохранять адаптивность скорости обучения без явного задания начальной learning rate.
Формулы:
Скользящее среднее квадратов градиентов: [ E[g^2]t = E[g^2]{t-1} + (1-) g_t^2]
Вычисление шага обновления с учетом скользящего среднего предыдущих шагов: [ _t = - g_t]
Обновление весов: [ _{t+1} = _t + _t]
Параметры:
rho — коэффициент сглаживания (обычно 0.95).epsilon — для стабильности вычислений.TensorFlow.js пример:
const optimizer = tf.train.adadelta(1.0, 0.95, 1e-8);
AdaDelta подходит для обучения сетей без точной настройки начальной скорости обучения и хорошо справляется с задачами, где градиенты имеют разные масштабы.
Оптимизаторы в TensorFlow.js интегрированы с
tf.Model.fit и позволяют изменять параметры без
необходимости переписывать код модели, что делает работу с нейронными
сетями гибкой и эффективной.