Повышение производительности моделей глубокого обучения и глубокая настройка сети (часть 6)

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

Серия из 6 частей «Как начать проект глубокого обучения?» состоит из:

· Часть 1: Начать проект Deep Learning.
· Часть 2: Создание набора данных Deep Learning.
· Часть 3: Проекты Deep Learning.
· Часть 4 : Визуализируйте модели и показатели глубокой сети .
· Часть 5: Отладка сети глубокого обучения .
· Часть 6: Улучшение производительности моделей глубокого обучения и настройка сети .

Увеличьте емкость модели

Чтобы увеличить пропускную способность, мы постепенно добавляем уровни и узлы в глубокую сеть (DN). Более глубокие слои позволяют создавать более сложные модели. Мы также уменьшаем размеры фильтров. Фильтры меньшего размера (3x3 или 5x5) обычно работают лучше, чем фильтры большего размера.

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

Однако графические процессоры не выгружают память. По состоянию на начало 2018 года высокопроизводительная NVIDIA GeForce GTX 1080 TI имеет 11 ГБ памяти. Максимальное количество скрытых узлов между двумя аффинными слоями ограничено размером памяти.

Для очень глубоких сетей проблема уменьшения градиента является серьезной. Мы добавляем схему пропуска соединений (например, остаточные соединения в ResNet), чтобы смягчить проблему.

Изменения в конструкции модели и набора данных

Вот контрольный список для повышения производительности:

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

Мы должны следить за гистограммой активации, прежде чем активация начнется внимательно. Если они имеют совсем другой масштаб, градиентный спуск будет неэффективным. Примените нормализацию. Если DN имеет огромное количество мертвых узлов, мы должны проследить проблему дальше. Это может быть вызвано ошибками, инициализацией веса или уменьшением градиентов. Если ни один из них не верен, поэкспериментируйте с некоторыми продвинутыми функциями ReLU, такими как дырявый ReLU.

Сбор и очистка наборов данных

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

Увеличение объема данных

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

Полу-контролируемое обучение

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

Настройка

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

Давайте сделаем краткий обзор настройки скорости обучения. На ранней стадии разработки мы отключаем или устанавливаем на ноль все некритические гиперпараметры, включая регуляризации. С оптимизатором Adam обычно хорошо работает скорость обучения по умолчанию. Если мы уверены в коде, но потери не уменьшаются, начните настраивать скорость обучения. Типичная скорость обучения - от 1 до 1e-7. Уменьшайте частоту каждый раз в 10 раз. Протестируйте его короткими итерациями. Внимательно следите за потерей. Если он постоянно растет, скорость обучения слишком высока. Если он не снижается, скорость обучения слишком низкая. Увеличивайте его до тех пор, пока потеря не сгладится.

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

В менее часто используемой практике люди отслеживают обновления отношения W:

  • Если соотношение составляет ›1e-3, подумайте о снижении скорости обучения.
  • Если соотношение

Настройка гиперпараметров

После того, как дизайн модели стабилизируется, мы можем продолжить настройку модели. Наиболее настраиваемые гиперпараметры:

  • Размер мини-партии
  • Скорость обучения
  • Факторы регуляризации
  • Гиперпараметры, зависящие от слоя (например, выпадение)

Размер мини-партии

Типичный размер пакета - 8, 16, 32 или 64. Если размер пакета слишком мал, градиентный спуск не будет плавным. Модель медленно обучается, и потери могут колебаться. Если размер пакета слишком велик, время для выполнения одной итерации обучения (одного цикла обновления) будет долгим с относительно небольшими доходами. В нашем проекте мы уменьшаем размер пакета, потому что каждая итерация обучения занимает слишком много времени. Мы внимательно следим за общей скоростью обучения и потерями. Если он слишком сильно колеблется, мы знаем, что заходим слишком далеко. Размер пакета влияет на гиперпараметры, такие как факторы регуляризации. Как только мы определяем размер пакета, мы обычно фиксируем значение.

Скорость обучения и факторы регуляризации

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

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

Прекращение обучения

Уровень отсева обычно составляет от 20% до 50%. Можно начать с 20%. Если модель переоборудована, мы увеличиваем стоимость.

Другой тюнинг

  • Разреженность
  • Функции активации

Редкость параметров модели упрощает оптимизацию вычислений и снижает энергопотребление, что важно для мобильных устройств. При необходимости мы можем заменить L2-регуляризацию L1-регуляризацией. ReLU - самая популярная функция активации. На некоторых соревнованиях по глубокому обучению люди экспериментируют с более продвинутыми вариантами ReLU, чтобы немного поднять планку. Это также уменьшает мертвые узлы в некоторых сценариях.

Предварительная настройка

Есть более продвинутые тонкие настройки.

  • График снижения скорости обучения
  • Импульс
  • Ранняя остановка

Вместо фиксированной скорости обучения мы можем регулярно снижать скорость обучения. Гиперпараметры включают в себя, как часто и насколько он падает. Например, вы можете иметь скорость затухания 0,95 на каждые 100 000 итераций. Чтобы настроить эти параметры, мы отслеживаем стоимость, чтобы убедиться, что она снижается быстрее, но не преждевременно выравнивается. Некоторые тренировки могут проходить по определенному расписанию. Например, уменьшите скорость обучения в 10 раз после 1 миллиона итераций и еще в 10 раз после 1,2 миллиона итераций.

Расширенные оптимизаторы используют импульс, чтобы сгладить градиентный спуск. В оптимизаторе Adam есть две настройки импульса, управляющие импульсом первого порядка (по умолчанию 0,9) и второго порядка (по умолчанию 0,999). Для проблемных областей с крутыми градиентами, таких как NLP, мы можем немного увеличить значение.

Переобучение можно уменьшить, остановив обучение, когда ошибки проверки постоянно увеличиваются.

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

Поиск гиперпараметров в сетке

Некоторые гиперпараметры сильно связаны. Мы должны настроить их вместе с сеткой возможных комбинаций в логарифмическом масштабе. Например, для двух гиперпараметров λ и γ мы начинаем с соответствующего начального значения и уменьшаем его в 10 раз на каждом шаге:

  • (e-1, e-2,… и e-8) и,
  • (e-3, e-4,… и e-6).

Соответствующая сетка будет [(e-1, e-3), (e-1, e-4),…, (e-8, e-5) и (e-8, e-6)].

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

Поиск по сетке требует больших вычислений. Для небольших проектов это используется время от времени. Мы начинаем настройку параметров крупно с меньшим количеством итераций. Для точной настройки результата мы используем более длинные итерации и уменьшаем значения в 3 раза (или даже меньше).

Модельные ансамбли

В машинном обучении мы можем принимать голоса из нескольких деревьев решений, чтобы делать прогнозы. Это работает, потому что ошибки часто локализуются: вероятность того, что две модели совершат одни и те же ошибки, меньше. В DL мы начинаем обучение со случайных предположений (при условии, что случайные начальные числа не заданы явно), а оптимизированные модели не уникальны. Мы выбираем лучшие модели после многих прогонов, используя набор данных проверки. Мы принимаем голоса этих моделей, чтобы сделать окончательные прогнозы. Этот метод требует запуска нескольких сеансов и может быть чрезмерно дорогим. В качестве альтернативы мы запускаем обучение один раз и проверяем несколько моделей. Подбираем лучшие модели с пунктов пропуска. С ансамблевыми моделями прогнозы могут основываться на:

  • один голос за модель,
  • взвешенные голоса, основанные на уровне достоверности его прогноза.

Модельные ансамбли очень эффективны в повышении точности на несколько процентов в некоторых задачах и очень часто встречаются в некоторых соревнованиях по DL.

Улучшение модели

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

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

Точная настройка и улучшение модели

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

Kaggle

У вас может возникнуть простой вопрос, например, следует ли мне использовать Leak ReLU. Звучит так просто, но прямого ответа нигде не получишь. Некоторые исследовательские работы показывают эмпирические данные о том, что дырявый ReLU лучше, но все же некоторые проекты не видят улучшений. Слишком много переменных, и у многих проектов нет ресурсов для сравнительного анализа даже части возможностей. Kaggle - это онлайн-платформа для соревнований по науке о данных, включая глубокое обучение. Покопайтесь в некоторых соревнованиях, и вы сможете найти наиболее распространенные показатели эффективности. Некоторые команды также публикуют свой код (так называемые ядра). Приложив немного терпения, это отличный источник информации.

Схема эксперимента

DL требует множества экспериментов, а настройка гиперпараметров утомительна. Создание схемы эксперимента может ускорить процесс. Например, некоторые люди разрабатывают код для преобразования определений модели в строку для упрощения модификации. Эти усилия обычно контрпродуктивны для небольшой команды. Я лично считаю, что снижение простоты кода и отслеживаемости намного хуже, чем выгода. Такое кодирование усложняет простую модификацию, чем должно быть. Легко читаемый код имеет меньше ошибок и более гибкий. Вместо этого многие облачные предложения AI начинают предоставлять автоматическую настройку гиперпараметров. Он все еще находится в зачаточном состоянии, но общей тенденцией должно быть то, что мы сами не кодируем фреймворк. Следите за развитием событий!

Заключение

Теперь ваша модель настроена и готова к развертыванию. Если у вас есть еще советы по настройке, не стесняйтесь делиться с нами в комментариях. Я надеюсь, что вы считаете эту серию из 6 частей полезной.

Есть много проблем, которые можно решить с помощью глубокого обучения: гораздо больше, чем вы можете себе представить. Может ли дизайнер передать вам визуальный макет, а вы можете автоматически сгенерировать HTML с помощью глубокого обучения? Невозможно? Сделайте поиск в Google по pix2code или sketch2code!