Ложка супа и тяжёлый шар

После этого урока ты посчитаешь число обновлений за эпоху, значение learning rate по любому расписанию и первый шаг Adam — и объяснишь, чем schedule отличается от optimizer.

Повар сварил суп на 50 000 порций и хочет понять, досолить ли. Всю кастрюлю он, понятно, не съедает: размешивает и пробует ложку. Вопрос на интуицию: если взять вместо ложки черпак в 100 раз больше, во сколько раз надёжнее станет вердикт?

Не в 100. В 10. А супа на пробу уйдёт в 100 раз больше.

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

Вся кастрюля, одна капля или ложка

В уроке 13 шаг спуска выглядел просто: посчитать градиент ошибки и сдвинуть веса против него. Только ошибка сети — это среднее по всем примерам training set:

\[ E(\vb{w}) = \frac{1}{N}\sum_{n=1}^{N} E(\vb{x}_n, \vb{w}) \]
\(N\)
число примеров в training set
\(E(\vb{x}_n, \vb{w})\)
ошибка на одном примере, например \((t_n - g(\vb{x}_n|\vb{w}))^2\)

Значит, и градиент — среднее \(N\) градиентов. Один честный шаг требует прогнать через сеть все примеры: при \(N = 50\,000\) это пятьдесят тысяч forward и backward pass ради одного маленького сдвига весов. Профессор говорит об этом коротко (лекция 2, слайд 27): считать по всем точкам — "unpractical".

Попробовать суп можно тремя способами. Они отличаются только тем, по скольким примерам усредняют градиент перед каждым шагом.

Batch gradient descent — вся кастрюля. Градиент точный, но на каждый шаг уходит весь датасет.

\[ \pd{E(\vb{w})}{\vb{w}} = \frac{1}{N}\sum_{n=1}^{N} \pd{E(\vb{x}_n, \vb{w})}{\vb{w}} \]

Stochastic gradient descent (SGD) — одна капля: шаг по одному случайно выбранному примеру. Ключевые слова профессора (лекция 2, слайд 28): unbiased, но high variance.

\[ \pd{E(\vb{w})}{\vb{w}} \approx \pd{E(\vb{x}_n, \vb{w})}{\vb{w}} \]

Mini-batch gradient descent — ложка: среднее по \(M\) случайным примерам, \(M \lt N\). На том же слайде про него сказано: "good trade off variance-computation".

\[ \pd{E(\vb{w})}{\vb{w}} \approx \frac{1}{M}\sum_{n \in \text{mini-batch}} \pd{E(\vb{x}_n, \vb{w})}{\vb{w}} \]

Что значат unbiased и variance, разберём в следующем разделе. Сначала — сколько шагов даёт каждый способ. Для этого нужны два слова.

Iteration — одно обновление весов. Epoch (эпоха) — один полный проход по training set. В одной эпохе \(\lceil N / M \rceil\) iterations.

Три способа на одном датасете: \(N = 50\,000\) примеров.
СпособПримеров на шагОбновлений за эпохуОценка градиента
Batch50 0001точная
SGD150 000unbiased, high variance
Mini-batch, \(M = 32\)321563unbiased, variance в 32 раза меньше
Mini-batch, \(M = 256\)256196unbiased, variance в 256 раз меньше

Откуда 1563: \(50\,000 / 32 = 1562.5\). Это 1562 полных mini-batch и один «хвост» из 16 примеров. Хвост — тоже обновление, поэтому округляют вверх.

1 2 3 4 5 6 7 8 9 10 11 12 N = 12 shuffle 7 2 11 5 9 1 12 4 3 8 6 10 M = 4 ∇E по B₁ ∇E по B₂ ∇E по B₃ w₀ w₁ w₂ w₃ шаг 1 шаг 2 шаг 3 одна эпоха, три шага
Рис. 1. Одна эпоха при \(N = 12\), \(M = 4\): перемешать, нарезать на mini-batch, по каждому сделать одно обновление. Перед следующей эпохой примеры перемешивают заново.

Рисунок 1 — это весь алгоритм из листинга 9 конспекта. В начале каждой эпохи датасет перемешивают, режут на куски по \(M\) примеров и для каждого куска делают одно обновление: веса сдвигаются против градиента, посчитанного только по этому куску.

Перемешивание — то самое «размешать суп». Если примеры лежат по порядку (сначала все кошки, потом все собаки), ложка из верхнего слоя расскажет только про кошек.

«SGD — это всегда один пример на шаг». У профессора (лекция 2, слайд 28) и в конспекте — да. Но в Keras, PyTorch и почти во всех статьях словом SGD называют mini-batch SGD, а batch size там — это размер mini-batch. На экзамене держись определений слайда, в коде — читай документацию.

И ещё один термин из конспекта. Среднюю ошибку по датасету \(E(\vb{w})\) там называют empirical risk. Она стоит на месте величины, которую хочется минимизировать на самом деле, — true risk, ожидаемой ошибки на любом примере из распределения данных \(D\):

\[ \E_{(\vb{x},\,t) \sim D}\bigl[E(\vb{x}, \vb{w})\bigr] \]

Посчитать true risk нельзя: \(D\) неизвестно, есть только \(N\) примеров из него. Поэтому математическое ожидание заменяют средним по этим примерам — и минимизируют его.

Почему ложке можно верить

Градиент по mini-batch — это среднее по случайной выборке. Про такие средние ты всё знаешь из Applied Statistics: выборочное среднее в среднем попадает в истинное, а его стандартная ошибка равна \(\sigma / \sqrt{n}\). Перенесём это на градиент за четыре шага.

  1. Оценка по mini-batch — среднее \(M\) градиентов отдельных примеров. Обозначим её \(\vb{g}_{MB}\) (буква \(g\) здесь от слова gradient, это не выход сети):

    \[ \vb{g}_{MB} = \frac{1}{M}\sum_{n \in \text{mini-batch}} \nabla E(\vb{x}_n, \vb{w}) \]
  2. Примеры в mini-batch выбраны случайно. Поэтому каждое слагаемое в среднем равно среднему по всему датасету, то есть полному градиенту:

    \[ \E\bigl[\vb{g}_{MB}\bigr] = \nabla E(\vb{w}) \]

    Оценка несмещённая (unbiased): она ошибается, но не систематически.

  3. Градиенты отдельных примеров разбросаны вокруг полного. Пусть дисперсия одной их компоненты равна \(\sigma^2\). У среднего \(M\) независимых слагаемых дисперсия в \(M\) раз меньше:

    \[ \operatorname{Var}\bigl[g_{MB}\bigr] = \frac{\sigma^2}{M} \]
  4. Типичная ошибка оценки — корень из дисперсии:

    \[ \text{шум оценки} = \frac{\sigma}{\sqrt{M}} \]

    Это та самая стандартная ошибка среднего. Mini-batch в 100 раз больше стоит в 100 раз дороже, а шум уменьшает в \(\sqrt{100} = 10\) раз.

В разделе конспекта про mini-batch слов unbiased и variance нет: там градиент просто «noisy». На слайде они есть (лекция 2, слайд 28), и на экзамене отвечать нужно именно ими.

Ложка, черпак и вся кастрюля

Модель — прямая \(g(x|\vb{w}) = w_1 x + w_0\), датасет — 4096 точек, ошибка — средний квадрат. Первый график: 200 оценок градиента в точке старта, каждая по своему случайному mini-batch. Второй: спуск за одну эпоху. Главное, что должно стать видно: оценка по mini-batch в среднем верна, а её разброс падает как \(1/\sqrt{M}\).

  1. Сейчас \(M = 1\): каждая синяя точка — градиент по одному примеру. До того как трогать ползунок: во сколько раз сожмётся облако при \(M = 4\)? А при \(M = 16\)?
    Что должно получиться

    Вдвое и вчетверо: разброс 8.43 → 4.22 → 2.21. Чтобы уполовинить шум, mini-batch надо учетверить — это и есть \(1/\sqrt{M}\). При \(M = 256\) остаётся 0.51, а при \(M = N\) разброса нет: градиент точный.

  2. Вернись к \(M = 1\). Синие точки разбросаны на весь график, некоторые показывают совсем не туда, куда охристая стрелка. Где при этом окажется их среднее — чёрное кольцо?
    Что должно получиться

    Почти на кончике стрелки, то есть на истинном градиенте. Это и значит unbiased: каждая оценка ошибается, но в среднем они правы. С ростом \(M\) кольцо садится на ромб всё точнее.

  3. Поставь \(M = N\) и нажми «Запустить эпоху». Сколько шагов сделает спуск? Потом поставь \(M = 64\): эпоха та же, примеров обработано столько же.
    Что должно получиться

    Full batch: одно обновление за всю эпоху, расстояние до минимума сократилось с 4.22 до 3.50. При \(M = 64\) обновлений 64: уже через четверть эпохи вес в 0.16 от минимума, к концу — в 0.07. Та же кастрюля, но разлитая по ложкам.

  4. Теперь \(M = 1\) и эпоха до конца. Приходит ли вес в минимум? Что нужно изменить, чтобы клубок сжался, не трогая \(M\)?
    Что должно получиться

    Приходит за первые два десятка шагов — и дальше всю эпоху мечется вокруг, в среднем в 0.42 от минимума. Полный градиент там равен нулю, а градиент одного примера — нет. Уменьши \(\eta\) до 0.02: клубок сжимается до 0.14. Запомни это наблюдение, из него вырастут расписания.

Что из этого следует

Большой mini-batch покупает точность по невыгодному курсу: от \(M = 32\) к \(M = 3200\) шаг дорожает в 100 раз, а шум падает только в 10. Слишком маленький тоже плох: простаивает GPU, а статистики batch normalization из урока 26 считаются по горстке примеров и шумят. Поэтому обычно начинают с \(M\) = 32, 64 или 128.

Шум не исчезает у минимума. Полный градиент там равен нулю, а градиенты отдельных примеров — нет: каждому примеру хочется сдвинуть веса в свою сторону. Поэтому спуск с постоянным \(\eta\) не останавливается, а дрожит в «шумовом шаре». Шар тем больше, чем больше \(\eta\) и чем меньше \(M\).

Отсюда связь двух ручек: размах дрожания определяется отношением \(\eta / M\). Увеличив mini-batch в \(k\) раз, обычно увеличивают в \(k\) раз и \(\eta\) — это называют linear scaling rule.

Маленький и большой mini-batch: таблица со стр. 195 конспекта.
СвойствоМаленький, \(1 \le M \le 32\)Большой, \(256 \le M \le 8192\)
Стоимость шагаочень низкаяочень высокая
Обновлений за эпохуочень многоочень мало
Шум градиентавысокийнизкий
Сходимостьбыстрая, но шумнаягладкая, но медленнее в расчёте на пример
Параллелизм GPUиспользуется плохоиспользуется хорошо

У шума есть и польза — о ней стр. 196 конспекта. Случайные толчки помогают спуску выбраться из мелкого локального минимума и не застрять на плато, где точный градиент почти нулевой. И они мешают сети подогнать веса под каждый пример в отдельности: шум работает как regularizer.

«Маленький mini-batch обобщает лучше — это закон». На стр. 196 конспекта цепочка «большой mini-batch → sharp minima → плохая generalization» подана как факт. Это часто наблюдаемый эффект и популярное объяснение, но не теорема: если заново подобрать \(\eta\) и добавить warm-up, разница во многом исчезает. На экзамене пиши осторожно: «is often observed», «acts as a regularizer».

Расписание: длинные шаги в начале, короткие в конце

В виджете клубок у минимума сжимался, стоило уменьшить \(\eta\). Но маленький \(\eta\) с самого начала — это медленный спуск, который легко вязнет на плато. А слишком большой, как в уроке 13, качается или расходится. Выход напрашивается: менять \(\eta\) по ходу обучения. Сначала идти широким шагом, чтобы быстро спуститься со склона, потом укорачивать шаг, чтобы перестать прыгать через ручей на дне.

Learning rate schedule (расписание шага обучения) — заранее заданная функция \(\eta_t\) от номера эпохи \(t\). Она не смотрит на градиенты и одна для всех весов.

В конспекте четыре расписания, формулы (81)–(84). Везде \(\eta_0\) — стартовое значение, \(t\) — номер эпохи.

Step decay — лестница: каждые \(s\) эпох шаг умножается на число \(\mathrm{drop}\), например на 0.5.

\[ \eta_t = \eta_0 \cdot \mathrm{drop}^{\lfloor t / s \rfloor} \]

Exponential decay — плавное убывание: за каждую эпоху шаг уменьшается в одно и то же число раз.

\[ \eta_t = \eta_0\, e^{-\lambda t} \]

1/t decay — убывание медленнее экспоненты; классическое правило из теории stochastic approximation. Его смысл: шаги убывают достаточно медленно, чтобы в сумме пройти любое расстояние до минимума, и достаточно быстро, чтобы шум к концу затих.

\[ \eta_t = \frac{\eta_0}{1 + \lambda t} \]

Cosine annealing — половинка косинуса: медленно в начале, быстро в середине, снова медленно к концу, и ровно ноль на последней эпохе \(T\).

\[ \eta_t = \frac{\eta_0}{2}\left(1 + \cos\frac{\pi t}{T}\right) \]
step decay exponential 1/t decay cosine η₀ η₀ η₀ η₀ 0 100 0 100 0 100 0 100
Рис. 2. Четыре расписания на одинаковых осях: по горизонтали эпохи от 0 до \(T = 100\), по вертикали \(\eta_t\). Step decay — \(\mathrm{drop} = 0.5\), \(s = 20\); у exponential и 1/t одна и та же \(\lambda = 0.05\). На последних эпохах от \(\eta_0\) остаётся 6 % у step decay, меньше 1 % у exponential и 17 % у 1/t; cosine доходит ровно до нуля.
Проверь калькулятором: везде \(\eta_0 = 0.1\).
РасписаниеПараметрыЭпоха \(t\)\(\eta_t\)
step decay\(\mathrm{drop} = 0.5\), \(s = 10\)25\(0.1 \cdot 0.5^2 = 0.025\)
exponential\(\lambda = 0.05\)20\(0.1 \cdot e^{-1} \approx 0.0368\)
1/t\(\lambda = 0.1\)20\(0.1 / 3 \approx 0.0333\)
cosine\(T = 100\)250.0854
cosine\(T = 100\)500.05
cosine\(T = 100\)750.0146

Warm-up — обратная идея для самого начала: первые \(T_w\) эпох шаг не убывает, а линейно растёт от нуля до значения из расписания.

\[ \eta_t^{\text{warm}} = \frac{t}{T_w}\,\eta_t, \qquad t \lt T_w \]

Зачем: в первые шаги веса случайные, градиенты большие, а у Adam (о нём ниже) ещё не накоплена статистика. Широкий шаг в этот момент может забросить сеть туда, откуда она долго выбирается. В коде warm-up нередко считают не в эпохах, а в iterations: формула та же, только \(t\) — номер обновления. В конспекте warm-up не разобран; на стр. 199 упомянуты только warm restarts, а это другое.

«Шаг уменьшают, потому что к концу обучения градиенты маленькие». Наоборот: маленький градиент сам укорачивает сдвиг \(\eta\,\nabla E\). Причина в шуме: с постоянным \(\eta\) спуск по mini-batch не сходится, а дрожит в шаре, который растёт вместе с \(\eta\). Уменьшаешь \(\eta\) — сжимаешь шар.

Конструктор расписания

Верхний график — \(\eta_t\) по эпохам, всего \(T = 100\) эпох, \(\eta_0 = 0.1\). Нижний — что это расписание делает со спуском: один вес на параболе \(E = w^2/2\), градиент с шумом, как от mini-batch, десять обновлений за эпоху. Серая линия — тот же спуск с постоянным \(\eta_0\) и тем же шумом. Главное, что должно стать видно: расписание сжимает дрожание у минимума, не замедляя начало.

  1. Оставь «постоянный \(\eta\)». Если подождать ещё тысячу эпох, вес успокоится в минимуме?
    Что должно получиться

    Нет. Спуск добегает до минимума за пару эпох и дальше болтается в полосе примерно ±2 сколько угодно долго: разброс (стандартное отклонение) за эпохи 80–100 равен 0.95, отдельные выбросы доходят до −2.9. Шум в градиенте не убывает, шаг тоже — убывать нечему.

  2. Выбери step decay с \(s = 10\), \(\mathrm{drop} = 0.5\). Посчитай в уме \(\eta\) на эпохе 25, потом сверься с числом под графиком. Что происходит с полосой на каждой ступеньке?
    Что должно получиться

    \(0.1 \cdot 0.5^{\lfloor 25/10 \rfloor} = 0.1 \cdot 0.25 = 0.025\). На каждой ступеньке полоса сужается, и к концу разброс 0.01 против 0.95. При этом первые десять эпох оба спуска идут одинаково быстро.

  3. Теперь cosine annealing. На какой эпохе \(\eta\) ровно вдвое меньше стартового? Начнёт ли расписание после эпохи 100 новый цикл само?
    Что должно получиться

    На эпохе 50: \(\cos(\pi/2) = 0\), остаётся \(\eta_0 / 2 = 0.05\). К эпохе 100 шаг плавно доходит до нуля, вес замирает. Никакого подъёма в формуле нет: рестарт — отдельное действие.

  4. Добавь warm-up на 10 эпох. Что изменилось в начале нижнего графика? Зачем тогда его делают?
    Что должно получиться

    Спуск стартует заметно позже: первые эпохи шаг почти нулевой. На этой параболе warm-up — чистая потеря времени. Его польза видна только в настоящих сетях, где первый широкий шаг по случайным весам может всё испортить.

Насколько сужается полоса, если уменьшить шаг вдвое?

В \(\sqrt{2}\) раз, а не в два. В нижнем графике вес обновляется так: \(w \leftarrow (1 - \eta)\,w - \eta\,\sigma\,\xi\), где \(\xi\) — случайный шум с единичной дисперсией. Когда дрожание установилось, дисперсия \(V\) веса после шага равна дисперсии до шага:

\[ V = (1 - \eta)^2\,V + \eta^2 \sigma^2 \] \[ V = \frac{\eta\,\sigma^2}{2 - \eta} \approx \frac{\eta\,\sigma^2}{2} \]

Дисперсия пропорциональна \(\eta\), значит, ширина полосы — \(\sqrt{\eta}\). Чтобы сжать дрожание в 10 раз, шаг нужно уменьшить в 100.

Тяжёлый шар: momentum

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

Возьмём самый простой овраг — вытянутую чашу:

\[ E(w_1, w_2) = \tfrac{1}{2}\left(0.2\,w_1^2 + 10\,w_2^2\right) \]

Поперёк оврага, по \(w_2\), кривизна равна 10; вдоль, по \(w_1\), — всего 0.2. На параболе с кривизной \(c\) спуск расходится при \(\eta \gt 2/c\) (так было в уроке 13), поэтому предел \(\eta \lt 0.2\) диктует крутая стенка. А вдоль дна один шаг проходит долю \(0.2\,\eta\) оставшегося пути: даже при \(\eta = 0.18\) это меньше 4 %.

Получается вилка. Большой \(\eta\) — зигзаг от стенки к стенке. Маленький \(\eta\) — зигзага нет, но вдоль дна спуск ползёт. Один общий шаг не подходит обоим направлениям.

Momentum даёт весам инерцию. Вместо шага по текущему градиенту заводят скорость \(\vb{v}\), которая помнит прошлые шаги:

\[ \vb{v}_k = \alpha\,\vb{v}_{k-1} - \eta\,\nabla E(\vb{w}_k) \] \[ \vb{w}_{k+1} = \vb{w}_k + \vb{v}_k \]
\(\vb{v}_k\)
скорость (velocity), в начале \(\vb{v}_0 = 0\)
\(\alpha\)
momentum coefficient, \(0 \le \alpha \lt 1\), обычно 0.9
\(k\)
номер обновления (iteration)
\(\nabla E(\vb{w}_k)\)
градиент в точке \(\vb{w}_k\); на слайдах он записан как \(\pd{E(w)}{w}\big|_{w^{k}}\)

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

\[ \vb{v}_k = -\eta \sum_{j \ge 0} \alpha^{j}\,\nabla E(\vb{w}_{k-j}) \]

Вдоль дна оврага все градиенты смотрят в одну сторону и складываются. При постоянном градиенте \(g\) с \(\eta\,g = 0.01\) и \(\alpha = 0.9\) сдвиги растут: 0.010, 0.019, 0.027, …, 0.065 на десятом шаге — и стремятся к пределу

\[ \abs{v_\infty} = \frac{\eta\,\abs{g}}{1 - \alpha} = \frac{0.01}{0.1} = 0.1 , \]

в десять раз больше обычного шага. Поперёк оврага шар перелетает дно, градиент меняет знак, и его вклады в скорость гасят друг друга: качания затухают.

старт минимум 25 шагов: ползёт

Без momentum: \(\alpha = 0\)

старт минимум 25 шагов: докатился

С momentum: \(\alpha = 0.9\)

Рис. 3. Один и тот же овраг, один и тот же \(\eta = 0.05\), одни и те же 25 шагов. Слева спуск быстро падает на дно и ползёт вдоль него. Справа шар раскачивается от стенки к стенке, зато вдоль дна разгоняется и уже у минимума (охристый ромб).

Шар не идеален: он тяжёлый и не умеет тормозить. Он раскачивается и может проскочить минимум. Поэтому с momentum берут \(\eta\) поменьше — скорость всё равно накопится.

У профессора momentum записан иначе, чем в конспекте. Формула стоит на двух слайдах: лекция 2, слайд 24, и лекция 3, слайд 38 (в углу напечатано 39). Второй называется "Recall about Backpropagation" и повторяет первый. Ошибка \(E(w)\) на обоих записана суммой квадратов без \(1/N\): постоянный множитель просто уходит в \(\eta\). Сравни:

\[ \begin{aligned} w^{k+1} = w^{k} &- \eta\,\pd{E(w)}{w}\Big|_{w^{k}} \\ &- \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \end{aligned} \]

К текущему градиенту добавлен один предыдущий, с коэффициентом \(\alpha\). Цель по слайду — "To avoid local minima can use momentum": инерция перекатывает через мелкую ямку.

\[ \begin{aligned} \vb{v}_k &= \alpha\,\vb{v}_{k-1} - \eta\,\nabla E(\vb{w}_k) \\ \vb{w}_{k+1} &= \vb{w}_k + \vb{v}_k \end{aligned} \]

Скорость помнит все прошлые градиенты с весами \(\eta,\ \eta\alpha,\ \eta\alpha^2, \dots\) Цель по конспекту — не вязнуть в овраге.

Это две записи одной идеи, а не ошибка: слайд 38 лекции 3 оставляет от суммы первые два слагаемых, а множитель \(\eta\alpha\) при втором называет просто \(\alpha\). Если на экзамене просят формулу «as seen in class», пиши вариант слайда; объяснять удобнее через скорость. Обе цели — и локальные минимумы, и овраг — верны.

Nesterov accelerated gradient: сначала прыжок, потом поправка

Слайд 38 лекции 3 заканчивается репликой в облачке:"Several variations exists beside these two ...". These two — обычный шаг спуска и momentum. Первая вариация стоит на следующем слайде (лекция 3, слайд 39; в углу напечатано 40): "Nesterov Accelerated gradient: make a jump as momentum, then adjust".

Тяжёлый шар решает, куда катиться, глядя под ноги на старте: градиент он меряет в точке \(w^k\), и к этому шагу прибавляется инерция. Nesterov accelerated gradient (NAG) меняет порядок. Сначала шар делает прыжок, который инерция всё равно заставит его сделать. Потом смотрит под ноги уже на новом месте и поправляет шаг.

\[ w^{k+\frac{1}{2}} = w^{k} - \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \] \[ w^{k+1} = w^{k} - \eta\,\pd{E(w)}{w}\Big|_{w^{k+\frac{1}{2}}} \]
\(w^{k+\frac{1}{2}}\)
точка после прыжка; \(k + \frac{1}{2}\) — метка «между шагами \(k\) и \(k + 1\)», а не степень
\(\alpha\)
тот же momentum coefficient: он задаёт длину прыжка
\(\eta\)
learning rate: он задаёт длину поправки

Первая строка — прыжок (jump): то самое слагаемое с \(\alpha\) из формулы momentum, только сделанное отдельным ходом. Вторая — поправка (adjust): обычный шаг по градиенту, но градиент взят не в \(w^k\), а в точке после прыжка.

старт прыжок −η∇E градиент тут

Momentum: градиент взят на старте

старт прыжок −η∇E градиент тут

Nesterov: градиент взят после прыжка

Рис. 4. Один шаг в долине \(E = w^2/2\) при \(\eta = 0.5\). В обеих панелях одно и то же: старт \(w^k = -1\) и прыжок по инерции на \(+1.6\) (пунктир). Слева градиент взят на старте (жёлтая метка). Там склон ведёт вправо, шаг \(-\eta\nabla E = +0.5\) продолжает прыжок, и шар взлетает до \(w^{k+1} = 1.1\) — выше, чем стартовал. Справа градиент взят в точке после прыжка, \(w^{k+\frac{1}{2}} = 0.6\). Там склон уже ведёт назад, поправка \(-0.3\) возвращает шар ближе ко дну: \(w^{k+1} = 0.3\). Охристый ромб — минимум.

На рис. 4 видно, что это даёт. Прыжок вынес шар на противоположный склон. Градиент, взятый на старте, про этот склон ничего не знает и толкает шар дальше. Градиент, взятый после прыжка, уже смотрит назад и тормозит шар на этом же шаге, а не на следующем. Поэтому Nesterov меньше раскачивается и реже проскакивает минимум.

На слайде 39 лекции 3 вторая строка начинается с \(w^k\). Если прочитать её буквально, прыжок нужен только чтобы выбрать точку для градиента, а сами веса его не делают. Но слайд говорит "make a jump as momentum, then adjust", и на его картинке красная стрелка поправки начинается там, где кончается коричневый прыжок. Значит, поправку прибавляют к точке после прыжка:

\[ w^{k+1} = w^{k+\frac{1}{2}} - \eta\,\pd{E(w)}{w}\Big|_{w^{k+\frac{1}{2}}} \]

На экзамене пиши обе строки как на слайде и добавь одну фразу: the correction is applied after the jump.

Теперь оба метода можно поставить рядом. Собери две строки Nesterov в одну и сравни с momentum:

\[ \begin{aligned} w^{k+1} = w^{k} &- \eta\,\pd{E(w)}{w}\Big|_{w^{k}} \\ &- \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \end{aligned} \]

Оба градиента взяты там, где веса уже были: в \(w^k\) и в \(w^{k-1}\).

\[ \begin{aligned} w^{k+1} = w^{k} &- \eta\,\pd{E(w)}{w}\Big|_{w^{k+\frac{1}{2}}} \\ &- \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \end{aligned} \]

Свежий градиент взят там, куда веса только что прыгнули: в \(w^{k+\frac{1}{2}}\).

Отличие в одном месте: в точке, где взят градиент при \(\eta\). У momentum порядок слагаемых не важен, оба посчитаны до того, как веса сдвинулись. У Nesterov важен: пока прыжок не сделан, нет точки для второго градиента.

В учебниках Nesterov записывают через скорость, как momentum в (85)–(86). Меняется одно: аргумент градиента.

\[ \vb{v}_k = \alpha\,\vb{v}_{k-1} - \eta\,\nabla E(\vb{w}_k + \alpha\,\vb{v}_{k-1}) \] \[ \vb{w}_{k+1} = \vb{w}_k + \vb{v}_k \]
Одни и те же три вектора на слайде 39 лекции 3 и в учебнике.
Что этоСлайд 39 лекции 3Через скорость
прыжок, jump\(-\alpha\,\pd{E(w)}{w}\big|_{w^{k-1}}\)\(\alpha\,\vb{v}_{k-1}\)
точка после прыжка\(w^{k+\frac{1}{2}}\)\(\vb{w}_k + \alpha\,\vb{v}_{k-1}\)
поправка, correction\(-\eta\,\pd{E(w)}{w}\big|_{w^{k+\frac{1}{2}}}\)\(-\eta\,\nabla E(\vb{w}_k + \alpha\,\vb{v}_{k-1})\)
весь шаг, accumulated gradientпрыжок + поправка\(\vb{v}_k\)

Разница между столбцами та же, что у momentum: слайд берёт в прыжок один последний градиент, учебник — всю накопленную скорость. Слова в первом столбце взяты из подписи к картинке на слайде: "brown vector = jump, red vector = correction, green vector = accumulated gradient". Синие стрелки там — "standard momentum": короткий шаг по градиенту в текущей точке и за ним длинный прыжок.

На овраге с рис. 3 разница заметна сразу, если посчитать оба метода в записи через скорость. При тех же \(\eta = 0.05\) и \(\alpha = 0.9\) momentum перелетает дно до \(w_2 = -0.84\), Nesterov — только до \(-0.20\). Ошибка уходит ниже 0.01 насовсем на шаге 60 у momentum и на шаге 47 у Nesterov.

Свой шаг каждому весу: adaptive learning rates

Momentum и Nesterov оставляют один \(\eta\) на все веса. Вторая идея — дать каждому весу свой масштаб шага. Зачем это сети, видно из урока 24: градиенты в первых слоях бывают на порядки меньше, чем в последних, и \(\eta\), подходящий одним, не подходит другим.

У профессора этому отведён слайд "Adaptive Learning Rates" (лекция 3, слайд 40; в углу напечатано 41). Довод занимает четыре строки:

Ниже на слайде список "Several algorithm proposed" из пяти имён: Rprop, AdaGrad, RMSprop, AdaDelta, Adam. Конспект разбирает только два из них — RMSprop (там он пишется RMSProp) и Adam. Пройдём все пять по порядку: каждый следующий чинит слабое место предыдущего.

Обозначим градиент по mini-batch на шаге \(k\) буквой \(\vb{g}_k\) (в конспекте \(g_t\); с выходом сети \(g(\vb{x}_n|\vb{w})\) не путать). Квадрат, корень и деление ниже выполняются отдельно для каждого веса.

Rprop (resilient propagation; Riedmiller и Braun, 1993) берёт от градиента только знак. У каждого веса свой размер шага \(\Delta\): вес сдвигается на \(\Delta\) против знака своего градиента. Если знак тот же, что на прошлом шаге, \(\Delta\) растёт (обычно в 1.2 раза). Если знак сменился — уменьшается вдвое.

Оврага Rprop не боится: величина градиента ему безразлична. Но ему нужен точный градиент по всему датасету. Представь вес, у которого девять mini-batch подряд дают градиент \(+0.1\), а десятый даёт \(-0.9\). В сумме ноль: вес должен стоять на месте. Rprop же девять раз сдвинет его в одну сторону, с каждым разом дальше: знак не меняется, и \(\Delta\) растёт. Десятый шаг вернёт лишь малую часть пути. Вес уедет.

AdaGrad (adaptive gradient; Duchi, Hazan и Singer, 2011) с mini-batch работает. Он копит для каждого веса сумму квадратов всех его прошлых градиентов и делит шаг на корень из этой суммы:

\[ \vb{G}_k = \vb{G}_{k-1} + \vb{g}_k^2 \] \[ \vb{w}_{k+1} = \vb{w}_k - \frac{\eta}{\sqrt{\vb{G}_k} + \varepsilon}\,\vb{g}_k \]

Вес с крупными градиентами получает маленький шаг, вес с мелкими — большой. Слабое место: сумма только растёт. При постоянном градиенте шаги идут так: \(\eta,\ \eta/\sqrt{2},\ \eta/\sqrt{3},\ \dots\) На сотом шаге остаётся десятая часть. Рано или поздно обучение замирает.

RMSprop (Tieleman и Hinton, 2012) заменяет сумму скользящим средним: старые квадраты понемногу забываются, и знаменатель перестаёт расти. Для каждого веса он помнит скользящее среднее квадратов его градиента и делит шаг на корень из этого среднего:

\[ \vb{s}_k = \rho\,\vb{s}_{k-1} + (1 - \rho)\,\vb{g}_k^2 \] \[ \vb{w}_{k+1} = \vb{w}_k - \frac{\eta}{\sqrt{\vb{s}_k + \varepsilon}}\,\vb{g}_k \]
\(\rho\)
decay rate, обычно 0.9
\(\varepsilon\)
малая константа, чтобы не делить на ноль

Вес с крупными градиентами делится на большое число, вес с мелкими — на маленькое. В итоге оба шагают примерно на \(\eta\).

На слайде про RMSprop сказано коротко: "SGD + Rprop". Это идея Rprop, переделанная под mini-batch. Rprop делит градиент на его собственный модуль, и остаётся знак. RMSprop делит на корень из среднего квадрата за последние шаги (root mean square — отсюда название), поэтому у соседних mini-batch делитель почти один и тот же. Проверь на примере с девятью \(+0.1\) и одним \(-0.9\). Корень из среднего квадрата за эти десять шагов:

\[ \sqrt{\frac{9 \cdot 0.1^2 + 0.9^2}{10}} = \sqrt{0.09} = 0.3 \]

Делим на него каждый градиент и складываем десять сдвигов:

\[ \begin{aligned} 9 \cdot \Bigl(-\eta\,\frac{0.1}{0.3}\Bigr) + \eta\,\frac{0.9}{0.3} &= -3\eta + 3\eta \\ &= 0 \end{aligned} \]

Девять маленьких шагов и один большой гасят друг друга. Вес остаётся на месте, как и должен.

AdaDelta (Zeiler, 2012) появился в том же году и лечит AdaGrad тем же способом — скользящим средним квадратов градиента. И идёт на шаг дальше: вместо общего \(\eta\) он ставит корень из скользящего среднего квадратов прошлых сдвигов того же веса. Подбирать \(\eta\) руками не нужно.

Adam (adaptive moment estimation; Kingma и Ba, 2014) складывает обе идеи урока: скользящее среднее самих градиентов \(\vb{m}\) — как скорость в momentum — и скользящее среднее их квадратов \(\vb{v}\) — как \(\vb{s}\) в RMSprop. Коротко: Adam — это RMSprop плюс momentum.

\[ \vb{m}_k = \beta_1 \vb{m}_{k-1} + (1 - \beta_1)\,\vb{g}_k \] \[ \vb{v}_k = \beta_2 \vb{v}_{k-1} + (1 - \beta_2)\,\vb{g}_k^2 \] \[ \hat{\vb{m}}_k = \frac{\vb{m}_k}{1 - \beta_1^{\,k}}, \qquad \hat{\vb{v}}_k = \frac{\vb{v}_k}{1 - \beta_2^{\,k}} \] \[ \vb{w}_{k+1} = \vb{w}_k - \eta\,\frac{\hat{\vb{m}}_k}{\sqrt{\hat{\vb{v}}_k} + \varepsilon} \]
\(\vb{m}_k\)
first moment: среднее градиентов, \(\vb{m}_0 = 0\)
\(\vb{v}_k\)
second moment: среднее квадратов градиентов, \(\vb{v}_0 = 0\)
\(\beta_1, \beta_2\)
decay rates, обычно 0.9 и 0.999; \(\beta^{\,k}\) — степень
\(\hat{\vb{m}}_k, \hat{\vb{v}}_k\)
те же средние после bias correction
\(\varepsilon\)
около \(10^{-8}\)

Зачем шляпки, конспект не объясняет. Причина в старте с нуля: \(\vb{m}\) и \(\vb{v}\) начинают с нулевых значений, и первые средние занижены. Посмотрим на самый первый шаг для одного веса.

  1. Приходит первый градиент \(g_1\). Средние стартовали с нуля, поэтому от него остаётся малая доля:

    \[ m_1 = 0.1\,g_1, \qquad v_1 = 0.001\,g_1^2 \]
  2. Обе величины занижены: настоящее «среднее» по единственному градиенту равно \(g_1\), а не десятой его части. Делим на \(1 - \beta^{1}\) — поправка возвращает правильный масштаб:

    \[ \hat m_1 = \frac{0.1\,g_1}{1 - 0.9} = g_1 \] \[ \hat v_1 = \frac{0.001\,g_1^2}{1 - 0.999} = g_1^2 \]
  3. Подставляем в шаг. Корень из квадрата — модуль:

    \[ \Delta w = -\eta\,\frac{g_1}{\abs{g_1} + \varepsilon} \approx -\eta \cdot \sign(g_1) \]

    Длина первого шага равна \(\eta\) и от величины градиента не зависит: при \(\eta = 0.001\) шаг будет 0.001 и для \(g_1 = 10\), и для \(g_1 = 0.001\).

  4. Без поправки отношение получилось бы другим:

    \[ \frac{m_1}{\sqrt{v_1}} = \frac{0.1\,\abs{g_1}}{\sqrt{0.001}\,\abs{g_1}} \approx 3.16 \]

    Первый шаг был бы втрое длиннее задуманного. Дальше знаменатель \(1 - \beta^{\,k}\) стремится к единице, и поправка сама выключается. Для \(v\) с \(\beta_2 = 0.999\) на это уходит порядка тысячи шагов.

Первый шаг Adam по каждому весу равен \(\eta\) — каким бы ни был градиент.

Теперь вся семья в одной таблице. Читай её сверху вниз как цепочку: Rprop и AdaGrad — два предка, RMSprop берёт у первого идею и чинит второй, AdaDelta убирает \(\eta\), Adam добавляет momentum.

Пять алгоритмов со слайда 40 лекции 3: что каждый делает с шагом веса.
МетодЧто делает с шагом веса
Rprop, 1993берёт только знак градиента; размер шага у каждого веса свой: растёт, пока знак держится, и падает, когда знак меняется
AdaGrad, 2011делит \(\eta\) на корень из суммы всех прошлых квадратов градиента; шаг только убывает
RMSprop, 2012делит \(\eta\) на корень из скользящего среднего квадратов градиента; это Rprop для mini-batch
AdaDelta, 2012то же скользящее среднее, а вместо \(\eta\) — корень из среднего квадрата прошлых сдвигов
Adam, 2014RMSprop плюс momentum, с bias correction

А вот как тот же список напечатан на слайде, дословно:

«Имена и годы можно списать со слайда 40 лекции 3 как есть». В списке три неточности. Фамилия пишется Tieleman, а не "Teileman". Статья про AdaGrad вышла в журнале в 2011 году; 2010 — год её первой версии. Adam появился в декабре 2014 года и опубликован на конференции ICLR в 2015-м, а не в 2012-м. Плюс опечатка "et at.": у статьи про AdaDelta один автор. На экзамене хватит названий и авторов. Годы безопаснее не писать вовсе, чем спорить со слайдом.

Гонка в овраге

Овраг из прошлого раздела: \(E = \tfrac{1}{2}(0.2\,w_1^2 + 10\,w_2^2)\), старт в точке \((-4,\ 1)\), минимум в нуле. Градиент здесь точный, без шума, чтобы видеть только геометрию. Главное, что должно стать видно: один общий \(\eta\) не подходит сразу крутому и пологому направлению, и momentum с адаптивными методами обходят это по-разному.

  1. Сейчас работает обычный спуск (GD) с \(\eta = 0.18\). Градиент в точке старта равен \((-0.8,\ 10)\). Куда пойдёт первый шаг — вдоль оврага или поперёк? Запусти, потом уменьши \(\eta\) до 0.05.
    Что должно получиться

    Почти строго поперёк: \(w_2\) прыгает с 1 на −0.8, а \(w_1\) сдвигается с −4 всего до −3.86 (смотри строку «точка»). Дальше зигзаг, и ошибка опускается ниже 0.01 на шаге 70. При \(\eta = 0.05\) зигзага нет, но спуск ползёт: за 150 шагов ошибка только 0.08, до 0.01 нужно 253 шага. А при \(\eta = 0.21\) спуск расходится: предел \(2/10 = 0.2\) задаёт крутая стенка.

  2. Оставь \(\eta = 0.05\) и выбери «GD + momentum» с \(\alpha = 0.9\). Во сколько раз быстрее шар доберётся до ошибки 0.01? Что он сделает, докатившись до минимума?
    Что должно получиться

    Примерно вчетверо: 60 шагов против 253. По дороге шар раскачивается от стенки к стенке, а минимум проскакивает вдоль дна до \(w_1 \approx 0.6\) и возвращается. Поставь \(\alpha = 0.95\): проскочит до 1.8 и успокоится только к 125-му шагу. Инерции бывает слишком много.

  3. Выбери Adam и верни \(\eta = 0.18\). Градиент по \(w_2\) в старте в 12.5 раза больше, чем по \(w_1\). Под каким углом пойдут первые шаги?
    Что должно получиться

    Под 45°: «Один шаг» три раза даёт точки (−3.82, 0.82), (−3.64, 0.64), (−3.46, 0.47). По обеим осям сдвиг равен \(\eta = 0.18\): Adam делит каждую компоненту градиента на её собственный масштаб, и крутая стенка больше не диктует шаг. Дальше видна его momentum-половина: \(w_2\) проскакивает дно до −0.39, \(w_1\) — минимум до 0.44, и к шагу 55 всё успокаивается.

  4. Теперь RMSprop с тем же \(\eta = 0.18\). К шагу 50 ошибка практически ноль. Останется ли она там?
    Что должно получиться

    Нет. На шаге 57 ошибка подскакивает до 0.6, потом ещё пару раз поменьше, и к шагу 150 застывает около 0.04: оба веса прыгают примерно между −0.09 и +0.09, то есть на \(\eta/2\) в каждую сторону от минимума. У RMSprop сдвиг около \(\eta\) при любом градиенте — и у самого минимума, где нужен сдвиг поменьше. Лекарство то же, что в прошлом виджете: расписание. Заодно посмотри на первый шаг: 0.57, а не 0.18. Множитель \(1/\sqrt{1 - \rho} \approx 3.16\) — цена старта с \(s_0 = 0\): у RMSprop нет bias correction.

Слайд "Learning Rate Matters": шесть методов на двух картах

Лекция 3 заканчивается картинкой (лекция 3, слайд 41; в углу напечатано 42). На ней два кадра с одной и той же легендой из шести строк: SGD, Momentum, NAG, Adagrad, Adadelta, Rmsprop. NAG — это Nesterov accelerated gradient. Adam в легенде нет.

Слева — карта линий уровня ошибки, как в виджете выше, только рельеф сложнее: узкие долины с поворотом. Чёрная точка — общий старт, звезда — минимум. Справа — седло, saddle point из урока 13: вдоль одного направления поверхность поднимается, вдоль другого падает. Красная точка — старт, выше перевала.

В PDF оба кадра неподвижны: все шесть методов ещё стоят на старте. На странице CS231n из списка в конце урока те же две картинки движутся. Происходит на них вот что.

В долине Momentum и NAG разгоняются и проскакивают мимо, как шар на рис. 3. NAG возвращается на курс раньше: он берёт градиент после прыжка. Adagrad, Adadelta и RMSprop почти сразу поворачивают к минимуму, потому что каждый вес у них идёт своим шагом. SGD идёт в верную сторону, но медленнее всех.

На седле дорога от старта ведёт вниз, прямо к перевалу. SGD доходит до него и застревает надолго: градиент там почти нулевой, а шаг SGD пропорционален градиенту. Momentum и NAG тоже задерживаются, но в итоге скатываются. Adagrad, Adadelta и RMSprop уходят вниз быстро: маленький градиент они делят на его же маленький масштаб, и сдвиг получается обычного размера. Рис. 5 повторяет этот кадр на самом простом седле.

старт перевал в гору под уклон 25 шагов: застрял

Обычный спуск: сдвиг пропорционален градиенту

старт перевал в гору под уклон 14 шагов: ушёл

RMSprop: сдвиг порядка \(\eta\) при любом градиенте

Рис. 5. Седло \(E = w_1^2 - w_2^2\), вид сверху: по горизонтали \(w_1\), по вертикали \(w_2\). Вдоль \(w_1\) поверхность поднимается, вдоль \(w_2\) падает. Старт в точке \((1,\ 0.001)\) — почти точно на гребне, который спускается к перевалу; \(\eta = 0.05\). Градиент по \(w_2\) на старте равен всего 0.002. Обычный спуск (в легенде слайда это SGD) сдвигается по \(w_2\) на 0.0001, сползает к перевалу и вязнет: чтобы уйти вниз на единицу, ему нужно 73 шага. RMSprop (\(\rho = 0.9\)) делит градиент на его масштаб: первый же сдвиг по \(w_2\) равен 0.16, и на единицу он уходит за 8 шагов.

Название слайда — его вывод. От того, как метод распоряжается шагом, зависит, выберется ли он из трудного места и как быстро. Один \(\eta\) на все веса — слабое место обычного спуска. Momentum и NAG правят направление шага, adaptive learning rates — его масштаб у каждого веса. Левый кадр можно повторить в виджете выше: там тот же сюжет на овраге и ещё Adam, которого на слайде нет.

Schedule — не optimizer

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

Три ручки и что каждая из них крутит.
РучкаЧто меняетСмотрит на градиенты?Одна на все веса?
Schedule: step, exponential, 1/t, cosine, warm-upобщий \(\eta\) как функцию временинетда
Momentum, Nesterovнаправление шага: копит прошлые градиенты в скоростьдада
Adaptive learning rates: Rprop, AdaGrad, RMSprop, AdaDelta, Adamмасштаб шага каждого весаданет

Ручки комбинируют. Adam сам содержит momentum, а поверх него обычно ставят ещё и расписание: Adam делит шаг между весами, расписание управляет общим \(\eta\). Так и написано на стр. 199 конспекта.

С чего начинать на практике? Стр. 199 конспекта советует Adam: он быстро приспосабливается, спокойно переносит шумные градиенты и хорошо работает с mini-batch. Обычное стартовое значение для него — \(\eta = 0.001\).

«Adam обобщает хуже, поэтому в конце надо переключаться на SGD с momentum». На стр. 199 это подано как обычная практика. На деле это одна из опубликованных эвристик, а «generalizes worse» — наблюдение, которое зависит от настройки. На экзамене формулируй мягко: «sometimes», «may».

Карта главы 3 и весь рецепт

Вернёмся к кастрюле. Черпак в 100 раз больше ложки надёжнее только в 10 раз, потому что ошибка среднего падает как \(1/\sqrt{M}\). Поэтому сети учат ложками: много дешёвых, слегка неточных шагов вместо одного дорогого точного. Неточность лечат расписанием: к концу шаг укорачивают, и дрожание затихает. А тяжёлый шар — это momentum: в овраге, где обычный спуск мечется или ползёт, шар копит скорость вдоль дна.

Это был последний инструмент главы 3. Вся глава отвечает на три вопроса — посмотри, как по ним раскладываются одиннадцать уроков.

Как честно измерить? Как не переучиться? Как заставить учиться? 17 bias–variance 18 hold-out 19 K-fold, LOOCV 20 early stopping 21 grid, random 22 weight decay 23 dropout 24 ReLU 25 Xavier, He 26 batch norm 27 mini-batch ты здесь
Рис. 6. Глава 3 на одной странице: три вопроса и номера уроков. Урок 27 закрывает третий вопрос: mini-batch, расписания, momentum с Nesterov и adaptive learning rates от Rprop до Adam. Вступление главы — universal approximation theorem — было раньше, в уроке 12.

И тот же материал в том порядке, в котором им пользуются. Это рецепт обучения сети целиком:

  1. Раздели данные на training, validation и test set (урок 18); если данных мало — cross-validation (урок 19).
  2. Выбери архитектуру и выходной слой под задачу (урок 11); в скрытых слоях — ReLU (урок 24).
  3. Задай начальные веса: He для ReLU, Xavier для tanh (урок 25); между линейным слоем и активацией поставь batch normalization (урок 26).
  4. Возьми error function из maximum likelihood (урок 15) и добавь регуляризацию: weight decay (урок 22), dropout (урок 23).
  5. Обучай по mini-batch: градиент считает backpropagation (урок 14), шаг делает Adam или SGD с momentum, \(\eta\) идёт по расписанию (этот урок).
  6. Следи за ошибкой на validation set и остановись вовремя: early stopping (урок 20).
  7. Подбери hyperparameters — \(\eta\), \(M\), силу регуляризации — по validation, а не по test (урок 21).
  8. Один раз, в самом конце, измерь ошибку на test set. Это и есть честная оценка generalization (уроки 17 и 18).

Каждая строка — готовый вопрос вида «why do we…?». Если на любой из них получается ответить двумя-тремя предложениями по-английски, глава 3 у тебя в руках.

В формате экзамена

Compare batch gradient descent, stochastic gradient descent (SGD) and mini-batch gradient descent. For each of them write the gradient used for one weight update, and explain the trade-off.

Show model answer

Batch gradient descent uses all \(N\) samples:

\[ \pd{E(w)}{w} = \frac{1}{N}\sum_{n=1}^{N} \pd{E(x_n, w)}{w} \]

SGD uses a single sample:

\[ \pd{E(w)}{w} \approx \pd{E(x_n, w)}{w} \]

Mini-batch gradient descent uses a subset of \(M \lt N\) samples:

\[ \pd{E(w)}{w} \approx \frac{1}{M}\sum_{n \in \text{mini-batch}} \pd{E(x_n, w)}{w} \]

Batch: the gradient is exact, but every update costs a pass over the whole dataset (one update per epoch), which is impractical for large \(N\). SGD: \(N\) cheap updates per epoch; the estimate is unbiased but has high variance, so the trajectory is noisy. Mini-batch: still unbiased, with variance reduced by a factor \(M\) (noise \(\propto 1/\sqrt{M}\)); it is a good trade-off between variance and computation and exploits GPU parallelism. Because of the \(1/\sqrt{M}\) law, larger batches give diminishing returns.

Проверяют три вещи: три формулы, слова unbiased / high variance и то, что mini-batch — компромисс между дисперсией и вычислениями. Закон \(1/\sqrt{M}\) — то, что отличает отличный ответ от хорошего.

A training set contains \(N = 50\,000\) samples and the mini-batch size is \(M = 32\). How many weight updates (iterations) are performed in one epoch?

Show model answer
\[ \left\lceil \frac{50\,000}{32} \right\rceil = \lceil 1562.5 \rceil = 1563 \]

There are 1562 full mini-batches and one last mini-batch with the remaining 16 samples.

Ловушка в округлении: 1562 — это без последнего неполного mini-batch. Если в задаче спросят число обновлений за 10 эпох, умножь на 10.

A step-decay schedule starts from \(\eta_0 = 0.1\) and halves the learning rate every 10 epochs. What is the learning rate at epoch \(t = 25\)?

Show model answer
\[ \eta_{25} = \eta_0 \cdot \mathrm{drop}^{\lfloor 25/10 \rfloor} = 0.1 \cdot 0.5^{2} = 0.025 \]

Показатель степени — целая часть \(t/s\), то есть 2, а не 2.5. С показателем 2.5 получится 0.0177 — это уже не step decay.

Adam is run with \(\beta_1 = 0.9\), \(\beta_2 = 0.999\), \(\eta = 0.001\), \(m_0 = v_0 = 0\) and a negligible \(\varepsilon\). The first gradient of a weight is \(g_1 = 10\). Compute the first update \(\Delta w\) of that weight.

Show model answer
\[ m_1 = 0.1 \cdot 10 = 1, \quad v_1 = 0.001 \cdot 10^2 = 0.1 \] \[ \hat m_1 = \frac{1}{1 - 0.9} = 10 \] \[ \hat v_1 = \frac{0.1}{1 - 0.999} = 100 \] \[ \Delta w = -\eta\,\frac{\hat m_1}{\sqrt{\hat v_1}} = -0.001 \cdot \frac{10}{10} = -0.001 \]

The first step equals \(-\eta \cdot \sign(g_1)\), whatever the size of the gradient. The bias correction is needed because \(m\) and \(v\) start from zero, so the first running averages underestimate the true moments; dividing by \(1 - \beta^{k}\) removes this bias.

Если вышло −0.00316, забыта bias correction. Если +0.001 — потерян минус: шаг идёт против градиента.

Which of the following statements are correct? Select all that apply.

  • A learning-rate schedule sets the global \(\eta\) as a function of the epoch, without looking at the gradients. Это определение расписания: функция времени, одна на все веса.
  • Momentum is a learning-rate schedule. В формуле momentum \(\eta\) постоянен. Меняется направление шага: к градиенту добавляется накопленная скорость.
  • Adam rescales the step of every weight using running averages of its gradients. Среднее градиентов в числителе, корень из среднего квадратов в знаменателе — отдельно для каждого веса.
  • Cosine annealing \(\eta_t = \frac{\eta_0}{2}(1 + \cos\frac{\pi t}{T})\) restarts by itself because the cosine is periodic. На отрезке от 0 до \(T\) это монотонное убывание до нуля. Рестарт — отдельное действие: сброс \(t\).
  • With Adam a learning-rate schedule is useless. Adam распределяет шаг между весами, а общий \(\eta\) по-прежнему задаёшь ты. Расписание ставят и поверх Adam.
Show model answer

Statements A and C are correct. A schedule is a function \(\eta_t\) of time; momentum changes the direction of the update by accumulating past gradients; adaptive learning-rate methods (RMSprop, Adam) rescale the step per parameter. The three mechanisms are independent and are usually combined. Cosine annealing as written decreases monotonically from \(\eta_0\) to 0 on \([0, T]\); a restart is a separate reset of \(t\).

Вопрос на различение трёх ручек. Конспект их смешивает (стр. 176 и 197), поэтому заученная оттуда фраза здесь стоит баллов.

Write the gradient-descent update rule with momentum. Explain why momentum helps when the error surface has a narrow valley (a ravine).

Show model answer

As seen in class:

\[ \begin{aligned} w^{k+1} = w^{k} &- \eta\,\pd{E(w)}{w}\Big|_{w^{k}} \\ &- \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \end{aligned} \]

The standard (velocity) form of the same idea accumulates all past gradients, not only the previous one:

\[ \begin{aligned} v_k &= \alpha\,v_{k-1} - \eta\,\nabla E(w_k) \\ w_{k+1} &= w_k + v_k \end{aligned} \]

with \(0 \le \alpha \lt 1\), typically 0.9. In a ravine a single learning rate is limited by the steep direction, so plain gradient descent either zig-zags across the valley or crawls along its flat bottom. The velocity is an exponentially weighted sum of past gradients: components that keep the same sign (along the valley) add up, up to a factor \(1/(1-\alpha)\); components that change sign (across the valley) cancel. The same inertia helps to roll through small local minima and plateaus.

Формула слайда (лекция 2, слайд 24; лекция 3, слайд 38) плюс объяснение через «складываются — гасятся». Число \(1/(1-\alpha) = 10\) при \(\alpha = 0.9\) показывает, что ты понимаешь, откуда ускорение.

Write the Nesterov accelerated gradient update as seen in class and explain how it differs from momentum.

Show model answer

Nesterov accelerated gradient: make a jump as momentum, then adjust.

\[ w^{k+\frac{1}{2}} = w^{k} - \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \] \[ w^{k+1} = w^{k} - \eta\,\pd{E(w)}{w}\Big|_{w^{k+\frac{1}{2}}} \]

The first line is the momentum jump to an intermediate (look-ahead) point \(w^{k+\frac{1}{2}}\). The second line is the correction: a gradient step whose gradient is evaluated at the look-ahead point instead of \(w^k\). The correction is applied after the jump, so the whole update is

\[ \begin{aligned} w^{k+1} = w^{k} &- \alpha\,\pd{E(w)}{w}\Big|_{w^{k-1}} \\ &- \eta\,\pd{E(w)}{w}\Big|_{w^{k+\frac{1}{2}}} \end{aligned} \]

Momentum has the same two terms, but both gradients are computed at points already visited, \(w^k\) and \(w^{k-1}\): it measures the gradient first and then jumps. Nesterov jumps first and measures the gradient where the jump lands. If the jump overshoots, that gradient already points back, so the step is corrected immediately and not one iteration later: fewer oscillations, less overshooting. In the standard notation with a velocity:

\[ \begin{aligned} v_k &= \alpha\,v_{k-1} - \eta\,\nabla E(w_k + \alpha\,v_{k-1}) \\ w_{k+1} &= w_k + v_k \end{aligned} \]

Ждут две строки слайда 39 лекции 3 и мысль the gradient is evaluated after the jump. Вторую строку слайд начинает с \(w^k\): пиши как на слайде, а следующей фразой скажи, что поправка делается из точки после прыжка. Запись через скорость — запасной вариант, если формула слайда не вспомнится.

Why are adaptive learning rates useful when training a deep network? Name three algorithms that implement them and say in one sentence what each of them does.

Show model answer

Neurons in each layer learn differently: gradient magnitudes vary across layers, and early layers get "vanishing gradients". A single learning rate is therefore too large for some weights and too small for others; ideally every weight should have its own learning rate, adapted during training.

Algorithms (any three):

  • Rprop (Riedmiller and Braun): uses only the sign of the gradient and keeps a separate step size for every weight, increased while the sign stays the same and decreased when it flips; it needs full-batch gradients.
  • AdaGrad (Duchi et al.): divides the learning rate of every weight by the square root of the sum of all its past squared gradients, so the step can only shrink.
  • RMSprop (Tieleman and Hinton): "SGD + Rprop" — divides the gradient by the square root of a running average of its squared values, so it works with mini-batches and the step does not shrink to zero.
  • AdaDelta (Zeiler): like RMSprop, and it also replaces the global learning rate with the root of a running average of the squared past updates, so no learning rate has to be set.
  • Adam (Kingma and Ba): RMSprop plus momentum — running averages of the gradient and of its square, with bias correction.

Первая половина ответа — строки слайда 40 лекции 3 почти дословно. Во второй хватит трёх имён, но к каждому нужно действие, а не только название. Годы не обязательны: у AdaGrad и Adam на слайде они неточные.

Проверь себя

В датасете \(N = 1000\) примеров, размер mini-batch \(M = 100\), обучение идёт 5 эпох. Сколько раз обновятся веса?

  • 5 Столько обновлений было бы у full batch: по одному на эпоху.
  • 10 Это число обновлений за одну эпоху: \(1000 / 100\). Эпох пять.
  • 50 В эпохе \(1000 / 100 = 10\) mini-batch, каждый — одно обновление; эпох пять.
  • 5000 Это сколько примеров пройдёт через сеть. При \(M = 1\) столько было бы и обновлений.

Размер mini-batch увеличили с 16 до 64. Что произошло с шумом оценки градиента (со стандартным отклонением)?

  • Уменьшился в 2 раза Шум падает как \(1/\sqrt{M}\): \(\sqrt{64/16} = 2\).
  • Уменьшился в 4 раза В 4 раза упала дисперсия. Стандартное отклонение — корень из неё.
  • Не изменился Среднее по большей выборке точнее: это стандартная ошибка среднего.
  • Вырос в 2 раза Наоборот: чем больше примеров усредняем, тем меньше разброс.

Что верно про градиент, посчитанный по mini-batch?

  • В среднем он равен полному градиенту Это свойство unbiased: примеры в mini-batch выбраны случайно.
  • Он систематически смещён, потому что видит не все данные Он ошибается то в одну сторону, то в другую, но не систематически.
  • В минимуме ошибки он обычно не равен нулю Нулю там равно среднее по всем примерам; у отдельного mini-batch свой градиент. Отсюда дрожание.
  • Его разброс убывает как \(1/\sqrt{M}\) Дисперсия среднего в \(M\) раз меньше дисперсии одного слагаемого.
  • Чем больше \(M\), тем больше обновлений за эпоху Обновлений \(\lceil N/M \rceil\): с ростом \(M\) их меньше.

Картинка для памяти — первый виджет: облако оценок вокруг ромба сжимается вдвое при каждом учетверении \(M\).

Зачем уменьшать \(\eta\) по ходу обучения с mini-batch?

  • Чтобы сжать дрожание вокруг минимума: его размах растёт вместе с \(\eta\) Шум в градиенте не исчезает, и только уменьшение шага заставляет вес успокоиться.
  • Потому что к концу обучения градиенты становятся больше У минимума градиенты, наоборот, малы. Дело в шуме, а не в их величине.
  • Чтобы быстрее спуститься в начале В начале шаг как раз оставляют большим. Уменьшение работает на конец обучения.
  • Чтобы у каждого веса был свой шаг Расписание одно для всех весов. Свой шаг каждому весу дают adaptive learning rates: RMSprop, Adam и их родня.

Cosine annealing, \(\eta_0 = 0.1\), \(T = 100\). Чему равен шаг на эпохах 50 и 100?

  • 0.05 и 0 \(\cos(\pi/2) = 0\) даёт половину, \(\cos\pi = -1\) даёт ноль.
  • 0.05 и 0.1 Так было бы при рестарте. Формула сама его не делает: на эпохе \(T\) шаг равен нулю.
  • 0.0854 и 0 0.0854 — это эпоха 25, там \(\cos(\pi/4) \approx 0.707\).
  • 0 и 0.1 Так вёл бы себя полный период косинуса. В формуле только его половина.

Momentum с \(\alpha = 0.9\), градиент много шагов подряд одинаковый. Во сколько раз установившийся сдвиг за шаг больше, чем \(\eta\,g\) у обычного спуска?

  • В 0.9 раза \(\alpha\) — доля прошлой скорости, которая сохраняется, а не множитель шага.
  • В 1.9 раза Так было бы после двух шагов: \(1 + 0.9\). Дальше сумма продолжает расти.
  • В 10 раз \(1 + \alpha + \alpha^2 + \dots = 1/(1 - \alpha) = 10\).
  • Ни во сколько: momentum меняет только направление Когда градиенты смотрят в одну сторону, они складываются, и скорость растёт.

Adam, \(\eta = 0.001\). Первый градиент по весу A равен 100, по весу B — 0.01. Какими будут первые сдвиги?

  • У A в 10 000 раз больше, чем у B Так было бы у обычного спуска: сдвиг пропорционален градиенту.
  • Оба по модулю равны 0.001 После bias correction \(\hat m_1 / \sqrt{\hat v_1} = g_1 / \abs{g_1}\): остаётся только знак.
  • У B больше, чем у A Adam выравнивает шаги, но не переворачивает порядок.
  • Оба равны нулю, потому что \(m_0 = v_0 = 0\) Нулевой старт занижает средние, и поправка это компенсирует.

Чем Nesterov accelerated gradient отличается от momentum?

  • У каждого веса появляется свой learning rate Это adaptive learning rates: Rprop, AdaGrad, RMSprop, AdaDelta, Adam. У Nesterov \(\eta\) один на все веса.
  • Градиент для поправки берётся в точке после прыжка, а не в текущей Сначала прыжок в \(w^{k+\frac{1}{2}}\), потом градиент в этой точке: "make a jump as momentum, then adjust".
  • Прошлые градиенты больше не используются Используются: прыжок и есть инерция, накопленная на прошлых шагах.
  • \(\eta\) уменьшается по расписанию \(\eta\) постоянный. Меняется только точка, в которой взят градиент.

Градиент веса много шагов подряд одинаковый. У какого метода сдвиг за шаг убывает как \(\eta/\sqrt{k}\)?

  • Rprop Наоборот: пока знак градиента не меняется, его размер шага растёт.
  • AdaGrad В знаменателе корень из суммы всех прошлых квадратов: \(\sqrt{k\,g^2}\). Сумма только растёт, шаг только убывает.
  • RMSprop У него скользящее среднее: старые квадраты забываются, и сдвиг держится около \(\eta\).
  • Adam Оба его средних выходят на постоянный уровень, сдвиг остаётся около \(\eta\).

Унести с собой

Что посмотреть и почитать