Дифференциальное и матричное исчисление
Backprop и vector-Jacobian product
Почему автодифференцирование считает произведение на якобиан, а не сам якобиан
Backprop — это правило цепочки и ничего больше
Сеть — это композиция: . По правилу цепочки якобиан композиции есть произведение якобианов:
Всё. Никакой отдельной «теории обратного распространения» не существует — есть правило цепочки и вопрос, в каком порядке перемножать эту цепочку. Ответ на него и есть весь backprop.
Порядок умножения решает всё
Матричное произведение ассоциативно, поэтому считать можно с любого конца. Но стоимость разная, и разница катастрофическая.
Пусть сеть отображает параметров в один скаляр лосса, а промежуточные слои имеют ширину около .
Слева направо (от входа) — это forward mode. Первое произведение имеет форму , и все промежуточные результаты — матрицы такого размера. Чтобы получить все производные, нужно проходов: по одному на каждый входной параметр.
Справа налево (от лосса) — это reverse mode, он же backprop. Первый множитель это — строка, а не матрица. Умножение строки на матрицу даёт строку, и так до конца: все промежуточные результаты остаются векторами.
Отсюда правило: если выходов мало, а входов много — считайте с конца. В обучении выход один (скалярный лосс), входов миллиарды, поэтому reverse mode выигрывает в раз. Если бы функция потерь была векторной той же размерности, что параметры, преимущества не было бы.
VJP: то, что действительно вычисляется
Ключевой момент: якобиан никогда не собирается. Вместо него вычисляется произведение вектора на якобиан:
Каждая операция обязана уметь ровно одно: получив
Примеры, где выигрыш очевиден:
- линейный слой : якобиан по равен , и VJP это — одно матрично-векторное умножение;
- поэлементная функция : якобиан диагонален, и VJP это поэлементное умножение. Собрать диагональную матрицу было бы чистым расточительством;
- softmax: якобиан , но после кросс-энтропии он сократился в — предыдущий урок целиком про этот случай.
Стоимость и память
Обратный проход стоит примерно столько же, сколько прямой — константа порядка 2–3. Но платить приходится памятью: локальные производные зависят от значений с прямого прохода, а значит их надо сохранить.
Отсюда две вещи, знакомые всякому, кто обучал большие модели:
- память растёт с глубиной, а не только с шириной. Активации всех слоёв живут до конца обратного прохода;
- gradient checkpointing — сознательный обмен: часть активаций не хранят, а пересчитывают. Плата — примерно один дополнительный прямой проход, выигрыш — память как корень из глубины.
Проход по шагам
Граф двухслойной сети с одним скрытым нейроном. Обратите внимание на порядок обхода: градиент по становится известен последним, потому что до него нужно пройти всю цепочку.
Forward mode тоже нужен
Reverse mode выигрывает при «много входов, один выход». В обратной ситуации — один вход, много выходов — выигрывает forward mode, и он вычисляет Jacobian-vector product, , а не .
Где это встречается на практике: произведение гессиана на вектор. считается как forward-режим, применённый к обратному проходу, — двумя проходами, без сборки гессиана. Так работают методы, которым нужна кривизна, но не вся матрица.
Что стоит унести
Три утверждения, которые вместе объясняют, почему обучение больших моделей вообще возможно:
- Backprop — правило цепочки, посчитанное справа налево.
- Якобианы не собираются: каждая операция реализует VJP.
- Обратный проход стоит как прямой по времени и как глубина по памяти.
Ни одно из них не про нейросети. Всё это свойства композиции функций, и в этом смысле блок 2 закончен — осталось собрать своими руками.
Источники
- Karpathy — Neural Networks Zero to Hero, лекция 1 — micrograd, обратный проход по графу
- Baydin, Pearlmutter, Radul, Siskind — Automatic Differentiation in Machine Learning, a Survey — Прямой и обратный режимы, стоимость каждого
Проверки
0 из 2Почему обратный режим
Сеть отображает параметров в скалярный лосс. Отметьте все верные утверждения.
Backward линейного слоя
Реализуйте
linear_backward(w, x, grad_y)— обратный проход слоя .Верните список из двух элементов:
[grad_x, grad_w], гдеw— матрица списком строк размера ,x— список длины ,grad_y— список длины . Тогдаgrad_xимеет длину , аgrad_w— форму , как самаw.Это ровно то, что делает
nn.Linear.backward, и весь VJP слоя. Заметьте, что ни один якобиан здесь не строится: первая формула — матрично-векторное умножение, вторая — внешнее произведение.Проверка форм важнее, чем кажется: если вы перепутаете формулы местами, у прямоугольной матрицы размерности не сойдутся — именно поэтому среди случаев есть неквадратные.
Загрузка редактора…
Ctrl/⌘ + Enter