Оптимизация

Расписания и клипование

Warmup, косинус, обрезка градиента — почему шаг меняют по ходу обучения

Шаг 69 из 117 · ~28 мин

Зачем менять шаг

Из урока 060: шумовой шар пропорционален α\alpha. Значит, чтобы сойтись точнее, шаг нужно уменьшать — но не сразу, иначе обучение будет ползти.

Отсюда естественная форма: сначала крупные шаги, чтобы дойти, потом мелкие, чтобы осесть. Все расписания — варианты этой мысли.

шаг обучения → ↑ learning rate

постоянноеступенчатоекосинусобратное времялинейное
базовый шаг 0.1
warmup, шагов 50
всего шагов 1000
пик
1.00e-1
в конце
1.00e-1
средний
9.73e-2
Простейший вариант, и он не сходится в точку: шумовой шар остаётся постоянным. Годится как база для сравнения.

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

Warmup

Первые шаги обучения — особые, и linear warmup (шаг растёт от нуля до базового за WW итераций) стал стандартом по нескольким независимым причинам.

αk=αbasemin ⁣(1,kW)decay(k)\alpha_k = \alpha_{\text{base}} \cdot \htmlData{k=ramp}{\min\!\left(1, \frac{k}{W}\right)} \cdot \text{decay}(k)

Причины, по которым нужен:

  • у Adam в начале нет статистики. Оценка v^\hat v на первых шагах строится по единицам наблюдений и потому очень шумна. Коррекция смещения исправляет масштаб, но не дисперсию: v^\hat v по одному сэмплу остаётся случайной величиной с большим разбросом;
  • кривизна в начале обучения велика. LL у случайно инициализированной сети обычно больше, чем в дальнейшем, поэтому порог 2/L2/L на старте ниже;
  • большие батчи требуют больших шагов (урок 060), а большой шаг на первых итерациях особенно опасен.

Практический эффект прямой: без warmup обучение больших трансформеров часто расходится на первых сотнях шагов, с ним — нет. Это одна из тех деталей, которые выглядят как суеверие, пока не увидишь расхождение.

Клипование градиента

Другая проблема, другое средство. Иногда градиент оказывается огромным — на одном неудачном батче, на редкой последовательности, при взрыве через рекуррентные связи.

ggmin ⁣(1,cg)g \leftarrow g \cdot \min\!\left(1, \frac{c}{\|g\|}\right)

То есть: если норма превысила cc, укоротить вектор до cc, не меняя направление. Ключевое слово — норма всего градиента, а не каждой координаты (это clip_grad_norm_, и покомпонентный clip_grad_value_ — другая, более грубая операция, меняющая направление).

Зачем это работает, объясняет урок 030. Оценки сходимости требуют LL-гладкости, то есть ограниченной кривизны. Если LL фактически неограничена — а у рекуррентных сетей и трансформеров на редких примерах это так, — то никакого безопасного шага не существует. Клипование создаёт ограниченность искусственно: шаг теперь не превышает αc\alpha c по норме, каким бы ни был градиент.

Отсюда же связь с блоком 3, урок 160: усреднение помогает только при конечной дисперсии. У распределения нормы градиента бывают тяжёлые хвосты, и тогда деление на BB не спасает. Клипование заменяет неограниченную величину ограниченной — то есть возвращает те условия, при которых усреднение вообще работает.

Цена: клипованный градиент смещён. Это уже не несмещённая оценка полного градиента, так что все рассуждения из урока 060 про несмещённость перестают применяться. На практике смещение считают приемлемой платой за то, что обучение не разваливается.

Что выбирают на практике

задачарасписаниеклипование
трансформеры, LLMlinear warmup + косинус или линейноепочти всегда, c=1.0c = 1.0
свёрточные сетиступенчатое или косинусредко
рекуррентные сетилюбоеобязательно
дообучениепостоянное или короткий косинусобычно да

Значение c=1.0c = 1.0 в первой строке — не универсальная константа, а следствие того, что норму градиента в этих моделях обычно нормируют. Правильный способ выбрать cc — посмотреть на распределение g\|g\| в первых сотнях шагов и взять что-то около его медианы: тогда обрезаться будут только выбросы, а типичный шаг останется нетронутым.

Одна оговорка

Расписание — не средство от плохой обусловленности. Оно управляет компромиссом между скоростью и точностью на уже заданной задаче. Если из урока 050 следует, что вам нужен миллион итераций, никакое расписание этого не изменит; поможет только уменьшение κ\kappa — стандартизация, нормализация, архитектура. Об этом следующий урок.

Источники

Проверки

0 из 2
  1. Зачем расписания и клипование

    Отметьте все верные утверждения о расписаниях learning rate и клиповании градиента.

  2. Расписание с разгоном и обрезка

    Реализуйте schedule_and_clip(base, warmup, total, step, grad_norm, clip) — верните [lr, clip_scale, clipped_norm, effective_step]:

    • lr — шаг на итерации step: линейный разгон, умноженный на косинусное затухание,

      αk=basemin ⁣(1,kW)разгон1+cos ⁣(πmin(k/T,1))2косинус\alpha_k = \texttt{base} \cdot \underbrace{\min\!\left(1, \frac{k}{W}\right)}_{\text{разгон}} \cdot \underbrace{\frac{1 + \cos\!\big(\pi \min(k/T, 1)\big)}{2}}_{\text{косинус}}

      при W=0W = 0 разгона нет (множитель равен 11);

    • clip_scale = min ⁣(1, cg)\min\!\left(1,\ \dfrac{c}{\lVert g \rVert}\right), а при g=0\lVert g \rVert = 0 равен 11;

    • clipped_norm = gclip_scale\lVert g \rVert \cdot \texttt{clip\_scale};

    • effective_step = lr * clipped_norm — длина фактического перемещения.

    Две проверки, которые обязаны выполняться при любых входах: clipped_norm никогда не превосходит clip, и clip_scale лежит в [0,1][0, 1].

    функция schedule_and_clip

    Загрузка редактора…

    Ctrl/⌘ + Enter