Колебания потерь во время обучения для двоичной классификации текста

#python #machine-learning #pytorch #huggingface-transformers #allennlp

#python #машинное обучение #pytorch #huggingface-трансформеры #allennlp

Вопрос:

Я выполняю точную настройку Longformer в задаче двоичной классификации текста документа, используя класс Huggingface Trainer, и я отслеживаю показатели некоторых контрольных точек с помощью Tensorboard.

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

Я читал онлайн, причиной этого может быть:

  • слишком высокая скорость обучения, но я попробовал с 3 значениями (1e-4, 1e-5 и 1e-6), и все они дали одинаковый эффект
  • небольшой размер пакета. Я использую ноутбук Sagemaker p2.8xlarge, который имеет графические процессоры 8xK80. Размер пакета для каждого графического процессора, который я могу использовать, чтобы избежать ошибки CUDA из памяти, равен 1. Таким образом, общий размер пакета составляет 8. Моя интуиция заключается в том, что bs из 8 слишком мал для набора данных, содержащего 57 Тыс. примеров (7 Тыс. шагов за эпоху). К сожалению, это самое высокое значение, которое я могу использовать.

Здесь я сообщил о тенденции F1, точности, потерях и сглаженных потерях. Серая линия соответствует 1e-6 скорости обучения, а розовая — 1e-5.




Я повторно использую всю информацию о моем обучении:

  • размер пакета: 1 x 8GPU = 8
  • скорость обучения: 1e-4, 1e-5, 1e-6 (все они протестированы без улучшения потерь)
  • модель: Longformer
  • набор данных:
    • обучающий набор: 57 Тыс. примеров
    • набор разработчиков: 12 ТЫСЯЧ примеров
    • тестовый набор: 12 ТЫСЯЧ примеров

Что может быть причиной? Можно ли считать это проблемой, несмотря на довольно хорошие результаты F1 и accuracy?

Комментарии:

1. Это вызвано малым размером пакета.

2. Можно ли считать это проблемой для предсказаний модели? Вы думаете, что с более высоким уровнем bs также может улучшиться f1?

3. Оценки F1 зависят как от точности, так и от отзыва объявлений. Вы могли бы получить плавную loss кривую, если увеличите batch_size. Но оценка F1 зависит от того, насколько хорошо ваша модель работает во всех классах. Таким образом, количество примеров в каждом классе также влияет на оценку f1.

4. Так что, возможно, сохраняя фиксированную bs, может ли уменьшение размера обучающего набора быть улучшением?

5. Уменьшение размера обучающего набора не должно помочь. Вероятно, это не является серьезной проблемой, если ваши показатели / результаты оценки выглядят хорошо. Причина, по которой вы видите это с небольшими партиями, заключается в том, что вы можете получить «легкую» партию, где, скажем, 5/8 примеров довольно просты, а 3/8 — это своего рода сложно. Если вы хотите попробовать увеличить размеры пакета, вы, вероятно, можете попробовать накопление градиента и / или контрольную точку градиента, оба из которых могут позволить вам выполнять больше обработки за один шаг за счет замедления

Ответ №1:

Сначала я расскажу вам о причине колебаний, а затем о возможном способе ее решения.

Причина

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

Поэтому мы используем small batch_size в качестве приближения! Идея заключается в том, что вместо рассмотрения всех выборок мы говорим, что я вычисляю градиент на основе некоторого небольшого набора выборок, но в качестве компромисса я теряю информацию о градиенте.

Эмпирическое правило: меньшие размеры пакета дают зашумленные градиенты, но они сходятся быстрее, потому что за эпоху у вас больше обновлений. Если размер вашего пакета равен 1, у вас будет N обновлений за эпоху. Если это N, у вас будет только 1 обновление за эпоху. С другой стороны, большие размеры пакета дают более информативный градиент, но они сходятся медленнее и увеличивают сложность вычислений.

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

РЕШЕНИЕ: накопленные градиенты

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

На этой странице из документации вы можете найти, как это применить:https://huggingface.co/transformers/v1.2.0/examples.html