Это на данный момент не столько рассказ, сколько сборник ссылок, которые мне хочется прочитать в подробностях, но пока руки не дошли:
"The Road Less Scheduled "
https://neurips.cc/virtual/2024/poster/96925"Adam with model exponential moving average is effective for nonconvex optimization"
https://neurips.cc/virtual/2024/poster/93230"Remove that Square Root: A New Efficient Scale-Invariant Version of AdaGrad"
https://neurips.cc/virtual/2024/poster/96023"Unraveling the Gradient Descent Dynamics of Transformers"
https://neurips.cc/virtual/2024/poster/94737"Deep Learning Through A Telescoping Lens: A Simple Model Provides Empirical Insights On Grokking, Gradient Boosting & Beyond"
https://neurips.cc/virtual/2024/poster/95420"On Convergence of Adam for Stochastic Optimization under Relaxed Assumptions"
https://neurips.cc/virtual/2024/poster/93100"SGD vs GD: Rank Deficiency in Linear Networks"
https://neurips.cc/virtual/2024/poster/95034"A Continuous-time Stochastic Gradient Descent Method for Continuous Data"
https://neurips.cc/virtual/2024/poster/98309"How Diffusion Models Learn to Factorize and Compose"
https://neurips.cc/virtual/2024/poster/95399"Where Do Large Learning Rates Lead Us?"
https://neurips.cc/virtual/2024/poster/95929"Don't Compress Gradients in Random Reshuffling: Compress Gradient Differences "
https://neurips.cc/virtual/2024/poster/96110"The Implicit Bias of Adam on Separable Data"
https://neurips.cc/virtual/2024/poster/93086Ну и про наше, где тоже есть такой аспект (в приложении, поскольку он не основной), краткий пересказ простыми словами, и там же ссылка на собственно статью:
https://babkin-cep.blogspot.com/2024/12/triceps-and-realseudo-at-neurips.htmlhttps://babkin-cep.blogspot.com/2024/12/lasso-ista-fista.htmlhttps://babkin-cep.blogspot.com/2024/12/realseudo-and-evaluation-of-activation.htmlс дополнительными подробностями в
https://babkin-cep.blogspot.com/2023/02/arrested-bouncing-in-floatneuralnet.htmlhttps://babkin-cep.blogspot.com/2023/10/comparing-floatneuralnet-options.htmlВкратце что меня заинтересовало:
Есть проблема того, как выбрать скорость тренировки нейросетей (т.е. шаг, с которым прилагать градиент при backpropagation). Если выбрать слишком маленький шаг, процесс идет очень медленно, да к тому же и застревает в локальных оптимумах, если выбрать слишком большой, то начинается расхождение и все погибает. Более того, оказывается, что его выгодно менять в процессе обучения - начинать с большого, и потом уменьшать. По какому именно принципу уменьшать - называется scheduling, и для него есть варианты алгоритмов от фиксированного закона до адаптивных. И люди это активно исследуют.
Во многом оно соответствует тому, что я видел в своих экспериментах: говоря по-простому, причина для уменьшения шага в том, что по мере прослеживания градиентов назад по слоям, они уменьшаются, и в начале тренировки давление градиентов должно быть настолько сильным, чтобы активно двигать самый нижний слой. А потом он более-менее устаканивается и для более верхних слоев надо меньше давление, потому что до них доходят более крупные градиенты. У меня раньше возникала идея попробовать разные шаги по слоям, но я до ее опробования так пока и не добрался, и вроде ничего аналогичного тут не видел.
В чем собственно сложность с движением слоев: по мере того как веса двигаются, иногда они меняют знак. Так вот, фокус в том, что эффект градиента на вес попорционален модулю веса, то есть чем ближе вес к нулю, тем медленнее он двигается (и если попадет в ноль, то там застрянет навсегда). Поэтому единственный способ поменять знак - сделать достаточно большой шаг, чтобы перепрыгнуть область, слишком близкую к нулю.
Но, как ни странно, люди исследуют еще и непрерывное (а не дискретное) движение по градиентам - я не понимаю, в чем выгода такого подхода, возможно он математически красивее. Это значит, что у них спуск будет гарантированно застревать в нулях. И таки да, подтверждают, что застревает. Преодолевают это двумя способами - моментный спуск, где сохраняется инерция и ноль проскакивается на ней, и добавление малых случайных флюктуаций. И таки да, я тоже пробовал делать и то и другое даже на дискретном спуске. Еще я сейчас вспомнил, что пробовал туннелирование, когда при попадании в малую зону вокруг нуля значение выскакивает из этой зоны наружу, продолжая движение в ту же сторону - это тоже работает, но спросить настоящих ученых, пользуются ли они таким, я забыл.
У меня была проблема в том, что момент сочетался только с нестохастическим спуском. И по сравнению с нестохастическим спуском мой алгоритм для момента и шедулинга работает очень хорошо, однако при стохастическом спуске можно брать шаг в сотню раз больше и он оказывается еще лучше (хотя на первой паре сотен шагов мой вариант и его побеждает). Однако, посмотрев на что люди делают, наверное можно тупо брать для производства момента средний градиент от стохастического шага. Надо будет попробовать. И/или другой вариант - если скорость моментного нестохастического спуска падает, пробовать сделать пару сотен шагов стохастически и потом опять моментом.