Обзор на обзор Understanding Optimization of Deep Learning
Данный пост будет в необычном формате.
Обзор на обзор, он же обзор 2-го порядка.
На днях в ряде тг каналов упоминался обзор Understanding Optimization of Deep Learning.
В целом, неплохой обзор с множеством практических рекомендаций, довольно полезный для начинающих и продолжающих. Более опытный же DL-практик вряд ли найдет себя много нового, хотя есть ряд неожиданных фактов и знаний.
В качестве мерила сложности оптимизации конкретной архитектуры сети выступает константа Липшица для производных от функции, вычисляемой сетью, по входам. С одной стороны, данная величина довольно репрезентативна и что-то да значит, но все же аспекты оптимизации значительно более многогранны и зависят еще от множества других факторов, деталей геометрии лосс-поверхности и прочего. Скажем, первообразная функции Вейерштрасса может иметь хорошую константу Липшица, но быть совершенно паршивой с точки зрения оптимизации градиентными методами.
- Нормализационные слои помогают оптимизации. BatchNorm стабильнее LayerNorm, но у последнего шире область применения.
- Skip connections помогают оптимизации
- Self-attention - выразительная операция, однако не Липшицева, что значительно затрудняет оптимизацию в трансформерах. Поэтому обучение имеет свойство расходиться без аккуратной подстройки learning_rate, warmup, weight_decay.
- Затухающие активации (а-ля сигмоида) приводят к затуханию градиентов, ReLU отключает половину градиентов, GeLU, Swish и им подобные не имеют подобных проблем.
- Инициализация принципиальна для сходимости. Инициализация из распределения с нулевым средним и стандартным отклонением порядка
1 / \sqrt{d}
(d
- размерность входного слоя) необходима для стабильного обучения. Для глубоких сетей еще можно добавлять фактор1 / \sqrt{L}
(L - число слоев) для большей стабильности. - Drop Path (отбрасывание Residual части) эффективно снижает постоянную Липшица.
- Adam и другие адаптивные оптимизаторы более устойчивы в большом значению константы Липшица по сравнению с обычным SGD (из-за preconditioning). Потому предпочтительны (и почти необходимы) для обучения трансформеров.
- Weight decay эффективно понижает константу Липшица. В своем роде он выступает в качестве сжимающего отображения.
Из интересного и не столь на слуху:
1) Стандартный attention имеет бесконечную постоянную Липшица, затрудняя обучение, альтернативные варианты - L2 attention и Scaled Cosine Similarity (SCS) имеет конечную константу, потому ожидается, что должны приводить к более стабильному обучению.
2) Параметры Adam по умолчанию (\beta_1
, \beta_2
) = (0.9
, 0.999
) не оптимальны при шумной оптимизации. Рекомендуемые значения \beta_2
= (0.95
, 0.98
). С подобным сам столкнулся при обучении T5 на WMT14, когда только понижение \beta_2
позволило стабилизировать обучение.
3) У Adam максимальное значение изменения весов ограничено сверху в отличие от SGD.
Далее графики симуляции констант Липшица. Без residual у ResNet они быстро растут с глубиной, а для трансформеров residual не так важен, как выбор attention.
Без слоев нормализации в трансформерах все совсем плохо, но для ResNet будто бы константа Липшица даже меньше.
Итого, в целом добротный перечень хороших практик и знаний по оптимизации. Про саму оптимизацию можно говорить бесконечно долго, и человечество еще далеко от сходимости в понимания всех аспектов оптимизации нейронных сетей.