Дифференциальное и матричное исчисление
Матричное дифференцирование
Четыре формулы, которые нужны постоянно, и соглашение о layout, которое портит половину выкладок
Сначала про соглашение
Прежде чем считать, нужно договориться, как располагать результат. Есть два соглашения, и они дают транспонированные друг другу ответы.
- Numerator layout (он же якобианов): индекс выхода нумерует строки. Тогда для , имеет форму — это якобиан из прошлого урока.
- Denominator layout (он же градиентный): индекс входа нумерует строки. Та же производная получает форму .
Практическое правило: в машинном обучении почти всегда denominator layout, потому что градиент должен иметь ту же форму, что параметр — иначе шаг не записать. В учебниках по анализу и в теоретических статьях чаще numerator.
Как жить с этим: не запоминать соглашение, а проверять формы. Если в вашей выкладке градиент по имеет форму — вы в denominator layout и всё сойдётся с кодом. Дальше в этом уроке используется он.
Формула первая: линейное отображение
Проверяется по элементам: , значит . В denominator layout строки нумеруются входом , поэтому на месте стоит — это и есть .
Это тот же факт, что «якобиан линейного отображения равен самому отображению», записанный в другом соглашении.
Формула вторая: квадратичная форма
Для симметричной это — прямой аналог . Гессианы и ковариационные матрицы симметричны, поэтому на практике встречается почти всегда эта форма.
Вывод стоит проделать один раз по индексам: , и при дифференцировании по переменная встречается дважды — в роли и в роли . Отсюда и сумма двух слагаемых. Это ровно та «сумма по путям» из урока про правило цепочки.
Формула третья: наименьшие квадраты
Самая используемая формула блока. Вывод — цепочка из двух звеньев: внешнее даёт , внутреннее даёт (первая формула).
Приравняв нулю, получаем — нормальное уравнение из практики блока 1. Тогда мы вывели его геометрически, через ортогональность остатка; теперь он же получается дифференцированием. Два разных пути к одному ответу — хороший признак, что вы поняли оба.
Формула четвёртая: производная по матрице
Для слоя и скалярного лосса :
Внешнее произведение вектора градиента на вектор входа. Проверка форм: если это , а это , произведение даёт — форму самой , как и требуется.
И симметрично, для передачи градиента ниже по сети:
Эти две строки — целиком backward для линейного слоя. Всё, что делает
nn.Linear.backward, здесь написано.
Как проверять выкладки
Три приёма, которые ловят почти все ошибки:
- Формы. Каждый промежуточный результат должен иметь осмысленную форму, а финальный градиент — форму параметра. Транспонирование, поставленное не туда, почти всегда ломает размерности.
- Скалярный случай. Подставьте : матрицы станут числами, и формула должна превратиться в знакомое одномерное правило. становится — верно.
- Численная проверка. Сравните с центральной разностью. Это то, что делают в реальности, и то, чем мы закроем блок.
Из этих трёх второй недооценивают чаще всего, а он самый быстрый: скалярный случай проверяется в голове.
Источники
- Petersen, Pedersen — The Matrix Cookbook — Справочник матричных производных
- Deisenroth, Faisal, Ong — Mathematics for Machine Learning, гл. 5.4–5.5 — Градиенты по векторам и матрицам
Проверки
0 из 2Формы и соглашения
Слой , где имеет форму , лосс скалярный. Используется denominator layout. Отметьте все верные утверждения.
Градиент квадрата невязки
Реализуйте
lsq_gradient(a, x, b)— градиент по :a— матрица списком строк,xиb— списки. Верните список длины, равной длинеx.Порядок действий тот же, что в формуле: посчитайте невязку , затем умножьте на и на 2. Транспонировать матрицу целиком не обязательно — достаточно просуммировать
a[i][j] * r[i]по строкам.Проверьте формы: если
aимеет размер , то длины , а результат — длины .Загрузка редактора…
Ctrl/⌘ + Enter