Из статьи из предыдущего поста вы могли узнать, что один из главных способов борьбы с неустойчивой оптимизацией нейросетей — грамотная инициализация весов перед обучением. Есть несколько best practices инициализации весов: например, He initialization, Xavier normal/uniform и другие. Подробно про He/Xavier можно прочитать тут.



Конечно, на 100% такая инициализация от проблем в обучении сети не спасает. Но тут вот ребята из Гугла придумали, как сделать инициализацию весов сети еще эффективнее. Они придумали новый трюк — GradInit, который сильно улучшает стабильность градиентного спуска и позволяет избежать долгого перебора гиперпараметров оптимизатора и использования warmup.



Идея GradInit — суперпростая: перед началом обучения умножаем все веса слоев на константы: для каждого слоя константа своя. Константы инициализируем единицами. Далее проводим несколько итераций обучения, обновляя с помощью град. спуска только эти константы: остальные параметры сети при этом заморожены. После этого фиксируем константы и обучаем сеть как обычно.



Такая вот идея, с некоторой стороны похожая на warmup, а с другой — на урезанный BatchNorm. И это удивительно простой и универсальный метод: его можно применять на любой архитектуре сети и любым количеством слоев. И практически для всех видов нейросетей GradInit улучшает сходимость. Так, GradInit еще сильнее повышает стабильность обучения сетей с BatchNorm, сетей с residual connections (ResNet) и даже Transformer! Причем были протестированы сети ResNet разной глубины: и у ResNet-50, и у ResNet-102 были заметны улучшения.



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



Теоретические обоснования, детали экспериментов и детали применения GradInit в зависимости от оптимизатора (SGD и Adam) читайте в оригинальной статье.



P.S. Изначально пост про GradInit увидела в канале AbstractDL, но захотела сама разботать и написать пост. И видео тоже оттуда взяла =)

#paper