English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

гость
1 / ?
назад к урокам

Обычный SGD не может обучить ANDREA

Стохастический градиентный спуск, отправная точка

Backprop вычисляет градиент g для каждого параметра. Обычный стохастический градиентный спуск (SGD) обновляет каждый параметр как p -= lr * g. Одна скорость обучения, одно направление на шаг, без памяти прошлых градиентов.


Обычный SGD ломается при масштабировании по двум причинам:


1. Градиенты имеют сильно различающиеся величины среди параметров. Встраивание для редкого токена получает крошечный градиент большинство шагов; масштаб layernorm получает большой. Одна скорость обучения не подходит для обоих.

2. Градиенты колеблются. Шумный мини-батч из корпуса из 16 источников толкает параметр влево, затем вправо, затем влево. Обычный SGD тратит шаги, борясь сам с собой.


Adam (Kingma & Ba, 2015) исправляет оба проблемы с помощью двух скользящих средних на параметр.

Первое Скользящее Среднее & Второе Скользящее Среднее

m: Сглаженное Направление

Первое скользящее среднее m экспоненциально усредняет недавние градиенты:


m = beta1 m + (1 - beta1) g


с beta1 = 0.9. После нескольких шагов m несёт усредненное направление; один плохой батч едва сдвигает его.


v: Усредненная величина

Второй момент v усредняет недавние квадраты градиентов:


v = beta2 v + (1 - beta2) g^2


с beta2 = 0.999. v отслеживает, насколько большим обычно бывает градиент каждого параметра. Параметры с большими градиентами получают большой v; параметры с крошечными градиентами получают малый v.


Адаптивная скорость обучения для каждого параметра

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


adam_step = m / sqrt(v + eps)


Маленькие градиентные эмбеддинги масштабируются вверх; большие градиентные layernorm'ы масштабируются вниз. Теперь один глобальный lr подходит для каждого параметра.

Чтение моментов

Два параметра получают одинаковый градиент `g = 0.1` на этом шаге. Параметр A накопил `v = 0.0001` за многие шаги; параметр B имеет `v = 1.0`. Используя `adam_step = g / sqrt(v + eps)`, какой параметр получает большее обновление на этом шаге, & почему Adam хочет именно так?

Почему ранние шаги требуют коррекции смещения

Смещение холодного старта

m и v начинаются с нуля. После шага 1: m = 0.1 g_1 и v = 0.001 g_1^2. Обе оценки сильно недооценивают долгосрочное среднее. Без коррекции оптимизатор начинает осторожно и медленно разгоняется, тратя драгоценные ранние шаги, когда формируются представления.


Коррекция

Adam масштабирует каждую оценку на 1 / (1 - beta^t), где t — номер шага:


m_hat = m / (1 - beta1^t)


v_hat = v / (1 - beta2^t)


На шаге 1 при beta1 = 0.9 делитель (1 - 0.9) = 0.1, поэтому m_hat = m / 0.1 = 10 * m. Исправленная оценка соответствует тому, что предсказывает долгосрочное среднее. По мере роста t beta^t приближается к 0, исправление приближается к 1, и исправленные и неисправленные значения сходятся.

Раздельное затухание весов (инновация AdamW)

L2-регуляризация против затухания весов

Классическая L2-регуляризация добавляет штраф к функции потерь: L_total = L_data + (lambda / 2) sum(p^2). Обратное распространение видит этот штраф как часть градиента: g_total = g_data + lambda p. Член L2 проходит через обновления m и v в Adam, сглаживаясь и перемасштабируясь в зависимости от величин параметров.


Loshchilov & Hutter (2019) доказали, что сглаживание регуляризатора через Adam искажает оба. Адаптивное масштабирование Adam уменьшает затухание весов для параметров с большими градиентами (где затухание должно наиболее сильно бороться с переобучением) и усиливает его для параметров с малыми градиентами.


AdamW: Применение затухания напрямую

AdamW отделяет затухание весов от градиента. Затухание применяется напрямую к каждому параметру во время обновления параметра, не затрагивая m или v:


p -= lr (m_hat / (sqrt(v_hat) + eps) + weight_decay p)


Теперь два члена управляют каждым шагом:


1. Член Адама: m_hat / (sqrt(v_hat) + eps) перенормирует направление градиента с учетом истории масштабов по параметрам.

2. Член затухания: weight_decay * p уменьшает каждый параметр к нулю равномерно, без сглаживания Адама.


ANDREA-120M v2 устанавливает weight_decay = 0.01. На каждом шаге каждый параметр уменьшается на 1% к нулю, в дополнение к тому, что делает член Адама.


AdamW Optimizer Step

Почему разделение важно

ANDREA-120M v1 использовала vanilla Adam (без weight decay) и скатилась в циклы повторений к шагу 110K. v2 использовала AdamW с `weight_decay = 0.01` и генерировала связный текст из нескольких абзацев. Объясните (a) какой конкретный член добавляется в AdamW, которого нет в vanilla Adam, и (b) почему размещение этого члена ВНУТРИ градиента (классический L2) хуже, чем decoupled размещение AdamW СНАРУЖИ.

Эмпирические доказательства

Коллапс v1 (без weight decay)

ANDREA-120M v1 обучалась 165K шагов с vanilla Adam. Примеры выходов:


- Шаг 80K: region region region region region region region

- Шаг 110K: ''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '

- Шаг 140K: games, games, games, games, games, games, games

- Шаг 165K: Budy Budy Budy Budy Budy Budy Budy Budy Budy


Значения потерь оставались разумными (минимум EMA 3.23 на шаге 110K, против случайного шанса 9.04). Потери сами по себе скрывают коллапс повторений: модель, которая навсегда запоминает один токен, достигает низкой кросс-энтропии на каждом шаге, где появляется этот токен.


Стабильность v2 (weight_decay = 0.01)

v2 добавила AdamW (плюс обрезку градиента, разогрев LR, мониторинг сэмплов). На шаге ~112K сэмплы, произведённые:


- Кариолинский попугай был объявлен вымершим в 1939 году (фактически верно)

- Преобразование Фурье разлагает сигналы на частотные компоненты (учебное определение)

- Ритмичный рефрен дождя, Ручьи на окне, Передышка от боли жизни (ограничения хайку соблюдены)


Внешняя оценка поставила сэмплам v2 9.5/10, назвав их "впечатляющей связностью и сохранением знаний на этом масштабе."


12M выжили без AdamW. Почему?

ANDREA-12M обучалась на vanilla Adam без коллапса. При 12M параметров матрицы весов остаются достаточно маленькими, чтобы адаптивное масштабирование Adam не могло толкнуть отдельные веса в runaway magnitudes, вызывающие повторение. При масштабе 120M magnitudes весов дрейфуют дальше за шаг и накапливаются; uniform decay применяет постоянную восстанавливающую силу к нулю. Decoupled weight decay имеет большее значение по мере масштабирования модели.

Выбор weight_decay = 0.01

Почему `weight_decay = 0.01` может работать для модели с 120M параметров, но значение в 100 раз больше (`weight_decay = 1.0`) уничтожит обучение? Размышляйте об update rule `p -= lr * (adam_term + weight_decay * p)`. Выберите representative `p`, подставьте `weight_decay = 1.0` на один шаг и опишите, что происходит с `p` после нескольких шагов.

Смежные активности

AdamW пересекается с тремя сестринскими активностями в этом курсе:


- Активность 11: Разогрев LR + косинусное затухание. AdamW сам по себе не может спасти модель от мгновенной пиковой скорости обучения на свежесинициализированных весах. Разогрев постепенно повышает lr за 2000 шагов, чтобы коррекция смещения AdamW и затухание весов успели стабилизировать представления.

- Активность 12: Обрезка градиентов. AdamW предполагает, что градиенты имеют ограниченную величину. Переходы источника каждые 7–42 шага в бандите ANDREA вызывают редкие всплески градиентов; обрезка ограничивает их L2-нормой 1.0 ДО того, как AdamW коснется m, v или p.

- Активность 13: Точность FP32 / FP16 / FP8. AdamW хранит m и v для каждого параметра, удваивая объем памяти только для весов. FP16 сокращает этот объем вдвое; FP8 сокращает его еще раз. Выбор точности взаимодействует со стабильностью оптимизатора.


AdamW, warmup, clipping и precision образуют четырёхлистный клевер. Уберите один листок — и ANDREA рухнет.

Рефлексия об оптимизаторе

Выберите один сэмпл ANDREA-120M v1 (например, `region region region region`) и опишите, как термин `weight_decay * p` в AdamW, применяемый на каждом шаге начиная со шага 0, предотвратил бы именно этот режим сбоя. Один абзац.