Настройка скорости обучения

Скорость обучения (learning rate) — один из ключевых гиперпараметров при обучении нейронных сетей. Она определяет величину шага, с которым обновляются веса модели при каждом проходе обратного распространения ошибки. Неправильный выбор скорости обучения может привести к медленной сходимости или нестабильному обучению, включая расходимость градиентов.

Основные понятия

Скорость обучения (learning rate) обозначается обычно как lr и является положительным числом. В контексте TensorFlow.js она указывается при создании оптимизатора. Например:

const optimizer = tf.train.sgd(0.01); // Стохастический градиентный спуск с lr=0.01

При слишком большом значении lr модель может «перепрыгивать» через минимумы функции потерь. При слишком маленьком — обучение будет крайне медленным, и модель может застрять в локальном минимуме.

Настройка в различных оптимизаторах

TensorFlow.js предоставляет широкий спектр оптимизаторов, каждый из которых использует скорость обучения по-своему:

  • SGD (Stochastic Gradient Descent) Простейший оптимизатор, обновляет веса напрямую по градиенту:

    const optimizer = tf.train.sgd(0.05);

    Здесь скорость обучения задаёт коэффициент масштабирования градиента.

  • Adam (Adaptive Moment Estimation) Более сложный оптимизатор, автоматически адаптирующий шаги на основе моментов градиентов. Начальная скорость обучения всё ещё важна:

    const optimizer = tf.train.adam(0.001);

    Adam чаще позволяет использовать большие скорости обучения по сравнению с SGD.

  • RMSProp Применяет экспоненциальное скользящее среднее к градиентам для стабилизации обновлений:

    const optimizer = tf.train.rmsprop(0.001);

Динамическое изменение скорости обучения

Жёстко заданная константа не всегда оптимальна. В TensorFlow.js можно реализовать динамическое снижение lr во время обучения, чтобы ускорить сходимость на начальном этапе и улучшить финальную точность.

Простейший метод — экспоненциальное уменьшение:

let initialLearningRate = 0.01;
let decayRate = 0.96;
let globalStep = 0;

function getLearningRate() {
  return initialLearningRate * Math.pow(decayRate, globalStep);
}

// Внутри цикла обучения
const optimizer = tf.train.sgd(getLearningRate());
globalStep++;

Альтернативный подход — learning rate schedule, позволяющий менять скорость обучения по эпохам или по величине функции потерь. В TensorFlow.js это реализуется вручную через обновление оптимизатора.

Практические рекомендации

  • Начинать с небольшого значения, особенно при использовании сложных моделей, чтобы избежать расходимости.
  • Использовать адаптивные оптимизаторы (Adam, RMSProp) для ускорения обучения и уменьшения влияния выбора lr.
  • Для больших датасетов и глубоких сетей полезно применять постепенное снижение скорости обучения.
  • Визуализировать динамику функции потерь и точности на валидации для оценки адекватности выбранного lr.

Примеры использования в модели

const model = tf.sequential();
model.add(tf.layers.dense({units: 128, activation: 'relu', inputShape: [784]}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

const optimizer = tf.train.adam(0.001);
model.compile({
  optimizer: optimizer,
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

await model.fit(trainData, trainLabels, {
  epochs: 20,
  batchSize: 64,
  validationSplit: 0.2,
  callbacks: {
    onEpochEnd: (epoch, logs) => {
      console.log(`Эпоха ${epoch + 1}: loss=${logs.loss.toFixed(4)}, accuracy=${(logs.acc*100).toFixed(2)}%`);
    }
  }
});

Влияние скорости обучения на обучение

  • Слишком высокая: модель может не сойтись, функция потерь будет «скакать» или стремиться к бесконечности.
  • Слишком низкая: обучение будет крайне медленным, возможен застой в локальном минимуме.
  • Адаптивное управление: позволяет сочетать преимущества обеих стратегий, сохраняя стабильность и ускоряя сходимость.

Правильная настройка скорости обучения в TensorFlow.js — это баланс между скоростью и стабильностью обучения, ключевой фактор для достижения высокой точности моделей.