Статья основана на моем докладе в PyCon Nove 2018 (Флоренция, IT). 👉🏼 Слайды

В предыдущей статье я объяснил, как повысить точность модели глубокого обучения (используя методы настройки гиперпараметров, в частности, для скорости обучения и размера пакета), но это очень важно при обучении нейронных сетей, мониторинг как точность обучения, так и точность проверки.

Мы увидели очень высокую точность тренировок и очень обрадовались!

Но если мы не уделим достаточно внимания точности обучения и проверки… мы можем понести…

ПЕРЕФИТИНГ

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

Вам не нужна лучшая модель для тренировочных данных, вам нужна лучшая модель для реального мира.

Ранняя остановка

Ранняя остановка - это наиболее часто используемая форма регуляризации в глубоком обучении. Его популярность объясняется как эффективностью, так и простотой. В основном это относится к концепции остановки тренировки перед схождением во избежание переобучения.

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

Правило ранней остановки простое: вы останавливаете обучение , как только ошибка в наборе проверки становится выше, чем это было при последней проверке.

Вы будете использовать веса, которые сеть имела на предыдущем шаге в результате обучения.

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

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

Пороговый критерий

Итак, первый критерий остановки - это то, что я назвал пороговым критерием, потому что вы прекращаете тренировку своей чистой , как только потеря обобщения превысит определенный порог.

Однако мы могли бы не останавливаться, если тренировка все еще идет очень быстро. Авторы статьи Остановка на раннем этапе - но когда? предполагают, что переобучение не начинается до тех пор, пока ошибка не будет уменьшаться очень медленно.

Факторный критерий

Итак, это второй критерий остановки, представленный в этой статье. Если мы определим обучающую полосу длины k как последовательность из k эпох; вы вычисляете, сколько было средней ошибки обучения во время полосы, а затем делите это число на минимальную ошибку обучения во время полосы. Результат называется прогресс тренировки. После этого вы берете потерю обобщения и делите ее на прогресс обучения.

Этот критерий говорит нам прекратить обучение, когда этот коэффициент превышает пороговое значение.

Критерий последовательных полос

Третий критерий остановки, представленный в статье, полагается только на знак изменений в потерях обобщения.

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

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

Сборка моделей

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

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

Есть несколько подходов к построению ансамбля.

  1. Та же модель, разные инициализации параметров. Опасность такого подхода заключается в том, что разнообразие возникает только из-за случайной инициализации.
  2. Текущее среднее значение параметров во время тренировки. Это дешевый способ получить пару процентов дополнительной производительности, и вы можете сделать это с помощью Average Layer of Keras.
  3. Самые популярные модели, обнаруженные в ходе перекрестной проверки. Используйте перекрестную проверку, чтобы определить лучшие гиперпараметры, затем выберите несколько лучших моделей (например, 10), чтобы сформировать ансамбль. Это улучшает разнообразие ансамбля, но может включать неоптимальные модели.
  4. Различные КПП одной модели. Если обучение очень дорогое, вы можете получить разные контрольные точки одной сети с течением времени (например, после каждой эпохи) и использовать их для формирования ансамбля. Это страдает недостатком разнообразия, но преимущество этого подхода в том, что он очень дешевый.

4. Различные КПП одной модели.

Этот подход представлен в статье Ансамбли моментальных снимков: поезд 1, получите M бесплатно Хуанг и др.

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

Вместо того, чтобы обучать M нейронные сети независимо с нуля, мы позволяем SGD сходиться M раз к локальным минимумам. Каждый раз, когда модель сходится, мы сохраняем веса (снимок) и добавляем соответствующую сеть в наш ансамбль. Затем мы перезапускаем оптимизацию с большим LR, чтобы выйти за пределы текущего локального минимума.

Они используют график циклического косинусного отжига, в котором LR повышается, а затем быстро понижается в соответствии с функцией косинуса.

На этом графике красным вы можете увидеть LR, используемый в этом подходе, который повышается, а затем быстро опускается на каждом снимке. Во время тестирования мы в основном делаем все снимки и усредняем прогнозы.

В отличие от традиционных ансамблей, после этой процедуры общее время обучения для ансамбля идентично времени, необходимому для обучения одной традиционной модели.

В этом фрагменте кода вы можете увидеть выполнение этого расписания. Это происходит от keras-contrib.

Выбывать

Отсев - простой способ предотвратить переоснащение нейронных сетей. Прежде чем углубляться в детали, закройте глаза и представьте себе этот сеттинг. У вас есть «маленькая» нейронная сеть, всего два слоя, два входных нейрона, а именно 1 и 2, которые подаются на нейрон 3. Нейрон номер 1 дает правильные прогнозы в 80% случаев. Нейрон номер 2 всегда дает случайные предсказания. Итак, лучшее, что может сделать нейрон номер 3, - это взять только выходной сигнал нейрона 1 и подавить выходной сигнал нейрона 2. Представьте, что два оранжевых нейрона действительно друзья, они полагаются друг на друга. Нейрон 2 уверен, что нейрон 1 исправит свои ошибки. Мы этого не хотим. Мы хотим, чтобы каждый нейрон мог выполнять задачу самостоятельно. Затем мы вводим отсев в нашей сети, чтобы время от времени убивать нейроны нашей сети.

Это создаст ненулевые градиенты для нейрона 2, и постепенно он начнет работать лучше, чем случайное предположение. Затем нейрон 3 также обновит свою функцию, чтобы иметь нетривиальную линейную комбинацию нейронов 1 и 2, и общая производительность, вероятно, будет выше 80%.

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

Используя это масштабирование, 2ⁿ разные сети с общими весами могут быть объединены в единую нейронную сеть, которая будет использоваться во время тестирования. Таким образом, отсев можно рассматривать как форму ансамбля различных моделей.

Поскольку производительность во время тестирования очень важна, на практике Keras (из-за своих внутренних компонентов) реализует то, что называется Inverted Dropout. Здесь вы в основном делите на p веса некоторых случайных единиц во время обучения и не изменяете веса во время тестирования. Показано, что это еще один способ достичь того же эффекта, что и традиционное выпадение.

Выводы

Обобщить:

Если вам понравилась эта статья, порекомендуйте и поделитесь.

Ресурсы:

Справочные документы: