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

Для удобства и систематизации я условно разделяю все способы ускорения обучения на три большие группы:

  1. Улучшение алгоритмов оптимизации. К этой группе способов относится применение адаптивных алгоритмов обучения, различных вариаций стохастического градиентного спуска, применение различных вариантов динамического изменения параметров оптимизатора и т.д.
  2. Улучшение самих моделей машинного обучения. Некоторые модели обучаются не только лучше, но и быстрее других моделей.
  3. Оптимизация применения алгоритмов оптимизации. Сюда относятся различные вариации применения алгоритмов оптимизации к модели: последовательное обучение различных частей модели, применение нескольких алгоритмов оптимизации, инициализация параметров модели до применения оптимизации и т.д.

Рассмотрим работы в каждом из направлений.

Улучшение алгоритмов оптимизации

Исследования 2016-2018 годов в данной области рассматривают в основном способы улучшения алгоритма стохастического градиентного спуска и адаптивных алгоритмов.

Например, предложен метод нормализованного градиента с адаптивным размером шага [1]. Метод включает в себя применение двух последовательных шагов: вычисление и нормализация градиента и выбор адаптивного шага для обновления параметров. Этот метод может применятся к алгоритму стохастического градиентного спуска, алгоритму ADAM, AdaGrad и другим. Авторы провели несколько экспериментов, включая обучение перцептрона, сверточной и рекурентной нейронной сети, и выяснили, что данный метод может значительно ускорять оптимизацию глубоких нейронных сетей от 18 слоев или рекурентных сетей развернутых от 40 до 1000 шагов.

Предложен алгоритм неустойчивого стохастического градиентного спуска (Inconsistent Stochastic Gradient Descent – ISGD) [2]. Основная идея алгоритма – различное отношение к различным батчам данных. Когда алгоритм идентифицирует, что модель недообучена для текущего батча данных, тогда размер шага обучения увеличивается, но при этом добавляется дополнительное ограничение, которое позволяет избежать радикального изменения текущих весов модели. Эксперименты показывают, что ISGD сходится быстрее, чем классический SGD. Например, при обучении нейронной сети AlexNet, ISGD на 21,05% быстрее чем SGD при достижении точности в 56%.

Предложено использовать стохастический градиентный спуск с предварительным условием (Preconditioned Stochastic Gradient Descent), который использует особый вид предобуславлевателя (preconditioner) [3]. В некоторых случаях это позволяет обучить модель примерно в два раза быстрее.

Предложен алгоритм разреженного обратного распространения ошибки (Sparsified Back Propagation) [4]. Суть алгоритма в том, что при обратном распространении ошибки вычисляется только небольшое подмножество элементов полного градиента для обновления параметров модели. Эксперименты авторов показывают, что можно обновлять только 1-4% от всех весов модели за каждую итерацию и при этом получить даже более высокую точность! Это и не удивительно. Применение таких техник, как pruning, показывает, что можно удалить до 90% весов обученной нейронной сети и потерять лишь процентик точности. Так зачем мы тратим ресурсы на вычисление градиента для такого огромного количества бесполезных в результате весов?

Улучшение моделей машинного обучения

В этой области не так много исследований. Не исключено, что я недостаточно качественно искал.

Как правило, чем проще модель, тем быстрее она обучается и тем менее точно решает задачу. Однако, существуют техники, которые способны ускорить обучения без потери точности. Одним из самых известных примеров является batch normalization [5]. Эта техника предложена в 2015 году и применена в нейронной сети Inception. Суть техники заключается в применении нормализации к входным значениям различных слоев/блоков нейронной сети. Применение этой техники позволяет Inception обучаться на данных ImageNet в 14 раз быстрее.

Оптимизация применения алгоритмов оптимизации

В этом направлении очень широкое поле для творчества. Из предложенных в 2017 году и уже применяемых на практике техник, самые известные – Snapshot Ensembles и FreezeOut.

Подход Snapshot Ensembles [6] позволяет за один цикл обучения вместо одной модели получить целый ансамбль моделей. Использование ансамблей – это популярная техника увеличения точности. Обычно она требует больших вычислительных ресурсов для обучения нескольких вариантов модели. Snapshot Ensembles делает снэпшоты модели в различных локальных минимумах на протяжении одного цикла обучения. Авторы опираются на то, что в различных локальных минимумах модель совершает, как правило, различные ошибки. Таким образом, если агрегировать результаты моделей из различных локальных минимумов, можно получить лучшую итоговую точность.

Метод FreezeOut позволяет увеличить скорость обучения путем последовательного “замораживания” весов сети по слоям [7] . Авторы экспериментировали с последовательными заморозками слоев сети и показали, что это позволяет увеличить скорость обучения без потери точности. Этот подход довольно быстро можно реализовать самостоятельно на любом фреймворке глубокого обучения.

Заключение

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

Ссылки:

  1. Normalized Gradient with Adaptive Stepsize Method for Deep Neural Network Training (arXiv:1707.04822)
  2. Accelerating Deep Neural Network Training with Inconsistent Stochastic Gradient Descent (arXiv:1603.05544)
  3. Preconditioned Stochastic Gradient Descent (arXiv:1512.04202)
  4. meProp: Sparsified Back Propagation for Accelerated Deep Learning with Reduced Overfitting
  5. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (arXiv:1502.03167)
  6. Snapshot Ensembles: Train 1, get M for free (arXiv:1704.00109)
  7. FreezeOut: Accelerate Training by Progressively Freezing Layers (arXiv:1706.04983)