momentum

алгоритм

Это 6-й день, я участвую в вызове августа, подробности о событии представление:Испытание августовского обновления

Концепция импульса пришла из физики и может быть понята как инерция, так как же она помогает нам найти оптимальное решение?

Если метод градиентного спуска сравнить с процессом спуска маленького шарика со склона холма в долину, то его конкретный процесс выглядит следующим образом: стартуя из начальной точки А, вычислить текущий уклон А, скользить по дороге в направлении наибольшего уклона, остановитесь. Спуститесь к B, снова посмотрите на окружающий склон от B, скользите в другую сторону в направлении наибольшего уклона, снова остановитесь и повторяйте эту операцию, пока не достигнете долины. Но так ли движется настоящий мяч? Когда настоящий мяч катится из точки А в точку Б, мяч имеет определенное ускорение, обычно он не останавливается, и мяч будет катиться все быстрее и быстрее ко дну долины. Momentum имитирует этот процесс, чтобы ускорить оптимизацию нейронной сети. Следующий рисунок интуитивно объясняет все содержание импульса

Основная формула глубокого обучения:

wk+1=wkαf(wk)w^{k+1}=w^{k}-\alpha\nabla f(w^k)

Теперь определим выражение

zk+1=βzk+αf(wk)z^{k+1}=\beta z^k+\alpha \nabla f(w^k)

zkz^kпредставляет собой сумму импульса, накопленного за все предыдущие шаги,β\betaэто коэффициент, который делает градиент затухать.Этот подход может сделать ранний градиент все меньше и меньше влияет на текущий градиент.Если нет значения затухания, модель имеет тенденцию к колебаниям, и трудно сходиться или даже расходиться, поэтому новый формула обновления параметра становится

wk+1=wkzk+1w^{k+1}=w^{k}-z^{k+1}

Расширение есть

wk+1=wkαf(wk)βzkw^{k+1}=w^k - \alpha \nabla f(w^k) - \beta z^k

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

Возьмем более практический пример

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

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

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

optimizer = torch.optim.SGD(model.parameters(), args.lr, # learning_rate
                            momentum=args.momentum, # momentum
                            weight_decay=args.weight_decayt_decay) # L2-regularization

Но следует отметить, что для оптимизатора Adam у него нет параметра импульса, потому что он имеет встроенный механизм импульса, только SGD требует дополнительных настроек