Этот пост призван помочь вам разобраться в обратных вызовах и их использовании. Также, чтобы подготовить вас к погружению в сложные системы обратного вызова, используя обратные вызовы fast.ai или keras.

Базовый цикл обучения для моделей глубокого обучения в Pytorch состоит из пяти шагов:

  1. Рассчитывайте прогнозы.
  2. Рассчитайте убыток.
  3. Обратный проход.
  4. Обновите параметры.
  5. Обнулите градиенты.

Эти пять шагов можно просто записать в следующие строки кода:

Пояснения

  • Данные в обучающие нейронные сети всегда передаются мини-пакетами, каждый из которых содержит функции и метки (данные и цели). Мы передаем функции в архитектуру нейронной сети для расчета прогнозов. Это часто называют прямым проходом.
  • Используя прогнозы прямого прохода и фактические цели, мы вычисляем потери, которые говорят нам, как далеко мы от цели. Это делается с помощью функции потерь.
  • После получения потерь мы распространяем градиенты потерь относительно параметров модели в обратном направлении по сетевой архитектуре. Здесь вступает в силу алгоритм обратного распространения.
  • Затем мы обновляем / корректируем параметры модели, которые оптимизируются после обратного прохода.
  • Наконец, мы не хотели бы накапливать градиенты между мини-пакетами, поэтому мы обнуляем градиенты параметров модели.

Что может пойти не так?

Вышеупомянутый цикл обучения работает отлично, но он очень ограничен. Представьте себе ситуацию, когда вы хотите: -

  • Контроль скорости обучения на тренировке
  • Контрольный градиент во время тренировки
  • Отслеживайте показатели во время обучения
  • Добавить технику регуляризации

Это точка создания настраиваемого цикла обучения, с помощью которого мы можем добавить все, что мы только можем придумать, при обучении нейронных сетей.

Обратные вызовы

На данный момент единственное, что может позволить нам настроить наш цикл обучения, - это использовать обратные вызовы . «Ты ненавидишь дорогу, только когда скучаешь по дому». это обратный вызов. В программировании воспринимайте обратный вызов как функцию / метод, вызываемый только при определенных условиях.

Если мы все начинаем с этой темы, прежде чем переходить к сложным системам обратного вызова, вот простой код для демонстрации того, как работает обратный вызов.

С помощью обратного вызова мы теперь можем выбрать что-то в нашем цикле обучения в начале обучения или в конце, в начале или в конце эпохи, в начале или в конце пакета. Мы даже можем следить за показателями обучения и проверки.

Пример №1. Учитывая, что мы хотим избежать переобучения обучающих данных, мы можем использовать обратный вызов, чтобы решить, следует ли нам продолжать обучение или нет после каждой эпохи. Это просто означает, что мы хотим реализовать раннюю остановку в конце эпохи.

Пример № 2. Предполагается, что мы хотим улучшить стабильность обучения нашей нейронной сети, борясь с проблемой взрывающегося градиента, используя метод отсечения градиента. Мы можем использовать обратный вызов после каждого обратного прохода для обрезки значений градиента параметров модели, превышающих предпочтительный диапазон.

Вы можете найти демонстрацию рабочего кода, сопровождающую этот пост, на моем Github.

Благодарности

Спасибо, что прочитали этот пост, но особая благодарность Jade Abbott и Frederick Apina, которые нашли время, чтобы просмотреть этот пост.