Перейти к содержимому
ПереводыMIT, Berkeley, CMU

Matrix Calculus, часть 2: якобианы и градиенты матричных функций

Перевод глав 3, 5 и 7 конспекта MIT «Matrix Calculus»: производная A² как линейный оператор и как якобиан 4×4, векторизация и произведение Кронекера, скалярное произведение Фробениуса и градиенты по матрицам, нормы и банаховы пространства, градиент определителя и производная обратной матрицы.

Это перевод глав 3, 5 и 7 конспекта курса MIT «Matrix Calculus (for Machine Learning and Beyond)». Начало — в части 1, карта курса — в путеводителе. Перевод распространяется под лицензией CC BY-NC-SA 4.0.

Для функций, у которых входы и/или выходы — матрицы, мы уже видели в прошлых лекциях, что производную всё равно можно определить как линейный оператор — формулой для f′f', которая переводит малое изменение входа в соответствующее малое изменение выхода. Однако, когда вы впервые изучали линейную алгебру, большинство линейных операций, вероятно, задавались умножением матриц на векторы, и привыкнуть думать о линейных операциях шире может быть непросто. В этой главе мы обсудим, как всё-таки можно представить f′f' матрицей Якоби даже для матричных входов и выходов и как самый распространённый способ это сделать использует «векторизацию» матриц и новый вид операции над матрицами — произведение Кронекера. Это даёт ещё один, иногда удобный, способ думать о линейных операторах f′f'; но в то же время важно освоиться и с другими способами записи линейных операторов: иногда явный якобиан скрывает ключевую структуру, а часто ещё и вычислительно неэффективен.

В этой части конспекта мы ссылаемся на Pluto-блокнот курса (notes/2x2Jacobians.jl в репозитории) с вычислительными демонстрациями на Julia, где производная квадрата A2A^2 матриц 2×22 \times 2 показана с разных сторон.

3.1. Производные матричных функций: линейные операторы

Заголовок раздела «3.1. Производные матричных функций: линейные операторы»

Как мы уже подчёркивали, производная f′f' — это линейный оператор, переводящий малое изменение входа в малое изменение выхода. Однако эта идея может принять непривычную форму для функций f(A)f(A), переводящих матричные входы AA в матричные выходы. Например, мы уже рассматривали такие функции квадратных матриц m×mm \times m:

  • f(A)=A3f(A) = A^3, для которой df=f′(A)[dA]=dA A2+A dA A+A2 dAdf = f'(A)[dA] = dA\,A^2 + A\,dA\,A + A^2\,dA;
  • f(A)=A−1f(A) = A^{-1}, для которой df=f′(A)[dA]=−A−1 dA A−1df = f'(A)[dA] = -A^{-1}\,dA\,A^{-1}.

Пример. Ещё проще функция «квадрат матрицы»

f(A)=A2,f(A) = A^2,

для которой по правилу произведения

df=f′(A)[dA]=dA A+A dA.df = f'(A)[dA] = dA\,A + A\,dA.

Это можно получить и явно из df=f(A+dA)−f(A)=(A+dA)2−A2df = f(A + dA) - f(A) = (A + dA)^2 - A^2, отбросив член (dA)2(dA)^2.

Во всех этих примерах f′(A)f'(A) описывается простой формулой для f′(A)[dA]f'(A)[dA], которая с точностью до первого порядка связывает произвольное изменение dAdA матрицы AA с изменением df=f(A+dA)−f(A)df = f(A + dA) - f(A) функции ff. Если дифференциал вас смущает, заметьте, что в эту формулу можно подставить любую матрицу XX, а не только «бесконечно малое» изменение dAdA. Например, для квадрата матрицы

f′(A)[X]=XA+AXf'(A)[X] = XA + AX

для произвольной XX (это производная по направлению, см. часть 1). Это выражение линейно по XX: если масштабировать или складывать входы, выходы соответственно масштабируются или складываются:

f′(A)[2X]=2XA+A 2X=2(XA+AX)=2f′(A)[X],f'(A)[2X] = 2XA + A\,2X = 2(XA + AX) = 2f'(A)[X], f′(A)[X+Y]=(X+Y)A+A(X+Y)=XA+YA+AX+AY=XA+AX+YA+AY=f′(A)[X]+f′(A)[Y].\begin{aligned} f'(A)[X + Y] &= (X + Y)A + A(X + Y) = XA + YA + AX + AY = XA + AX + YA + AY \\ &= f'(A)[X] + f'(A)[Y]. \end{aligned}

Это совершенно нормальный способ задать линейную операцию! Мы не записываем её здесь в привычной форме f′(A)[X]=(какая-то матрица?)×(X — вектор?)f'(A)[X] = (\text{какая-то матрица?}) \times (X \text{ — вектор?}), и это нормально! Формулу вроде XA+AXXA + AX легко записать, легко понять и легко с ней вычислять.

Но иногда всё же хочется думать о f′f' как об одной матрице Якоби — на самом привычном языке линейной алгебры, — и это возможно! Если вы прошли достаточно абстрактный курс линейной алгебры, то знаете, что любой линейный оператор можно представить матрицей, выбрав базисы во входном и выходном пространствах. Здесь же мы будем гораздо конкретнее, потому что у матриц AA есть общепринятый «декартов» базис, который называется «векторизацией», и в этом базисе линейные операторы вроде AX+XAAX + XA особенно легко записать матрицей, если ввести новый вид произведения матриц, широко применяемый в «многомерной» линейной алгебре.

Для начала подробнее рассмотрим функцию «квадрат матрицы» f(A)=A2f(A) = A^2 в простом случае матриц 2×22 \times 2: они описываются всего четырьмя числами, так что каждый член производной можно рассмотреть явно.

Пример. Для матрицы 2×22 \times 2

A=(prqs)A = \begin{pmatrix} p & r \\ q & s \end{pmatrix}

функция «квадрат матрицы» равна

f(A)=A2=(prqs)(prqs)=(p2+qrpr+rspq+qsqr+s2).f(A) = A^2 = \begin{pmatrix} p & r \\ q & s \end{pmatrix} \begin{pmatrix} p & r \\ q & s \end{pmatrix} = \begin{pmatrix} p^2 + qr & pr + rs \\ pq + qs & qr + s^2 \end{pmatrix}.

Когда функция выписана через элементы матрицы (p,q,r,s)(p, q, r, s), естественно думать о ней как об отображении 4 скалярных входов в 4 скалярных выхода. То есть ff можно считать равносильной «векторизованной» функции f~:R4→R4\tilde{f}: \mathbb{R}^4 \to \mathbb{R}^4:

f~((pqrs))=(p2+qrpq+qspr+rsqr+s2).\tilde{f}\left(\begin{pmatrix} p \\ q \\ r \\ s \end{pmatrix}\right) = \begin{pmatrix} p^2 + qr \\ pq + qs \\ pr + rs \\ qr + s^2 \end{pmatrix}.

Такое превращение матрицы в вектор-столбец называется векторизацией и обычно обозначается операцией «vec⁡\operatorname{vec}»:

vec⁡A=vec⁡(prqs)=(pqrs)←A1,1←A2,1←A1,2←A2,2,vec⁡f(A)=vec⁡(p2+qrpr+rspq+qsqr+s2)=(p2+qrpq+qspr+rsqr+s2).\operatorname{vec} A = \operatorname{vec} \begin{pmatrix} p & r \\ q & s \end{pmatrix} = \begin{pmatrix} p \\ q \\ r \\ s \end{pmatrix} \begin{matrix} \leftarrow A_{1,1} \\ \leftarrow A_{2,1} \\ \leftarrow A_{1,2} \\ \leftarrow A_{2,2} \end{matrix}, \qquad \operatorname{vec} f(A) = \operatorname{vec} \begin{pmatrix} p^2 + qr & pr + rs \\ pq + qs & qr + s^2 \end{pmatrix} = \begin{pmatrix} p^2 + qr \\ pq + qs \\ pr + rs \\ qr + s^2 \end{pmatrix}.

Через vec⁡\operatorname{vec} наша «векторизованная» функция квадрата f~\tilde{f} определяется так:

f~(vec⁡A)=vec⁡f(A)=vec⁡(A2).\tilde{f}(\operatorname{vec} A) = \operatorname{vec} f(A) = \operatorname{vec}(A^2).

Определение. Векторизация vec⁡A∈Rmn\operatorname{vec} A \in \mathbb{R}^{mn} любой матрицы m×nm \times n A∈Rm×nA \in \mathbb{R}^{m \times n} определяется просто как укладка столбцов AA слева направо в один вектор-столбец vec⁡A\operatorname{vec} A. То есть если обозначить nn столбцов AA векторами из mm компонент a⃗1,a⃗2,…∈Rm\vec{a}_1, \vec{a}_2, \ldots \in \mathbb{R}^m, то

vec⁡(a⃗1a⃗2⋯a⃗n)⏟A∈Rm×n=(a⃗1a⃗2⋮a⃗n)∈Rmn\operatorname{vec} \underbrace{\begin{pmatrix} \vec{a}_1 & \vec{a}_2 & \cdots & \vec{a}_n \end{pmatrix}}_{A \in \mathbb{R}^{m \times n}} = \begin{pmatrix} \vec{a}_1 \\ \vec{a}_2 \\ \vdots \\ \vec{a}_n \end{pmatrix} \in \mathbb{R}^{mn}

— вектор-столбец из mnmn компонент, содержащий все элементы AA.

В компьютере элементы матрицы обычно хранятся подряд в памяти, и это можно считать разновидностью векторизации. Более того, vec⁡A\operatorname{vec} A в точности соответствует так называемому хранению «по столбцам» (column-major), когда подряд хранятся элементы столбца; это формат по умолчанию, например, в Fortran, Matlab и Julia, а почтенное наследие Fortran означает, что хранение по столбцам широко принято в библиотеках линейной алгебры.

Примечание переводчика: NumPy и PyTorch по умолчанию хранят матрицы по строкам (row-major). Поэтому A.flatten() в NumPy — это vec⁡(AT)\operatorname{vec}(A^T), а vec⁡A\operatorname{vec} A получается как A.flatten(order='F') (F — от Fortran).

Задача. Вектор vec⁡A\operatorname{vec} A — это коэффициенты, которые получаются, если разложить матрицу m×nm \times n AA по некоторому базису матриц. Что это за базис?

Векторизация превращает непривычное (матричные функции и их производные) в привычное (векторные функции, их якобианы и градиенты). Этим она очень привлекательна — пожалуй, даже слишком: зачем «матричный анализ», если всё можно свести обратно к обычному анализу многих переменных? Но у векторизации есть недостатки. Концептуально она может скрывать математическую структуру (например, f~\tilde{f} выше совсем не похожа на квадрат матрицы A2A^2), а вычислительно такая потеря структуры иногда ведёт к серьёзной неэффективности (например, к построению огромных якобианов m2×m2m^2 \times m^2, о которых ниже). В целом мы считаем, что основной способ изучать такие матричные функции — видеть у них матричные входы (AA) и матричные выходы (A2A^2) и так же в общем случае считать их производные линейными операторами на матрицах, а не их векторизованными версиями. Тем не менее с векторизацией полезно быть знакомым, чтобы иметь альтернативную точку зрения.

Чтобы понять якобианы функций (из матриц в матрицы), начнём с простого вопроса.

Вопрос. Каков размер якобиана функции «квадрат матрицы»?

Если смотреть на функцию через её векторизованный аналог f~\tilde{f}, отображающий R4→R4\mathbb{R}^4 \to \mathbb{R}^4 (векторы из 4 компонент в векторы из 4 компонент), якобиан будет матрицей 4×44 \times 4 (из производных каждой компоненты выхода по каждой компоненте входа). Теперь возьмём более общую квадратную матрицу AA размера m×mm \times m. Чтобы найти якобиан f(A)=A2f(A) = A^2, можно (символьно) проделать то же самое и получить матрицу m2×m2m^2 \times m^2 (поскольку входов m2m^2 — элементы AA, — и выходов m2m^2 — элементы A2A^2). Явное вычисление этих m4m^4 частных производных утомительно даже при малых mm, но с этим справляются средства символьных вычислений, например в Julia или Mathematica. Как видно в блокноте, Julia выдаёт якобиан без труда. Для случая m=2m = 2, который мы выписали выше, можно либо продифференцировать f~\tilde{f} вручную, либо воспользоваться символьными средствами Julia и получить якобиан:

f~′=(1,1)(2,1)(1,2)(2,2)(1,1)2prq0(2,1)qp+s0q(1,2)r0p+sr(2,2)0rq2s.\tilde{f}' = \begin{array}{c|cccc} & (1,1) & (2,1) & (1,2) & (2,2) \\ \hline (1,1) & 2p & r & q & 0 \\ (2,1) & q & p + s & 0 & q \\ (1,2) & r & 0 & p + s & r \\ (2,2) & 0 & r & q & 2s \end{array}.

Например, первая строка f~′\tilde{f}' состоит из частных производных p2+qrp^2 + qr (первого выхода) по 4 входам pp, qq, rr и ss. Здесь строки подписаны индексами (строка, столбец) (jout,kout)(j_\text{out}, k_\text{out}) элементов «выходной» матрицы d(A2)d(A^2), а столбцы — индексами (jin,kin)(j_\text{in}, k_\text{in}) элементов «входной» матрицы AA. Хотя мы записали якобиан f~′\tilde{f}' как «двумерную» матрицу, его можно представлять и как «четырёхмерную», индексированную jout,kout,jin,kinj_\text{out}, k_\text{out}, j_\text{in}, k_\text{in}.

Однако взгляд матричного анализа, при котором производная f′(A)f'(A) — это линейное преобразование матриц (как мы вывели выше),

f′(A)[X]=XA+AX,f'(A)[X] = XA + AX,

кажется гораздо более информативным, чем явный покомпонентный «векторизованный» якобиан f~′\tilde{f}', и даёт формулу для любой матрицы m×mm \times m, не заставляя нас утомительно брать m4m^4 частных производных одну за другой. Если же мы действительно хотим держаться векторизации, нужен способ вернуть часть структуры, которую скрывает утомительное покомпонентное дифференцирование. Ключевой инструмент, связывающий две точки зрения, — операция над матрицами, с которой вы, возможно, не знакомы: произведение Кронекера (обозначается ⊗\otimes).

Линейную операцию вроде f′(A)[X]=XA+AXf'(A)[X] = XA + AX можно представлять себе как «многомерную матрицу»: обычные «двумерные» матрицы переводят «одномерные» векторы-столбцы в одномерные векторы-столбцы, а чтобы переводить двумерные матрицы в двумерные матрицы, можно представить себе «четырёхмерную» матрицу (её иногда называют тензором). Чтобы превращать двумерные матрицы обратно в одномерные векторы, у нас уже есть векторизация (vec⁡A\operatorname{vec} A). Тесно связанный инструмент, превращающий «многомерные» линейные операции над матрицами обратно в «двумерные» матрицы для векторизованных входов и выходов, — произведение Кронекера A⊗BA \otimes B. Во вводных курсах линейной алгебры оно встречается нечасто, но появляется в самых разных приложениях с многомерными данными: в многомерной статистике и анализе данных, в многомерных научных и инженерных задачах.

Определение. Если AA — матрица m×nm \times n с элементами aija_{ij}, а BB — матрица p×qp \times q, то их произведение Кронекера A⊗BA \otimes B определяется так:

A=(a11⋯a1n⋮⋱⋮am1⋯amn)⟹A⏟m×n⊗B⏟p×q=(a11B⋯a1nB⋮⋱⋮am1B⋯amnB)⏟mp×nq,A = \begin{pmatrix} a_{11} & \cdots & a_{1n} \\ \vdots & \ddots & \vdots \\ a_{m1} & \cdots & a_{mn} \end{pmatrix} \Longrightarrow \underbrace{A}_{m \times n} \otimes \underbrace{B}_{p \times q} = \underbrace{\begin{pmatrix} a_{11} B & \cdots & a_{1n} B \\ \vdots & \ddots & \vdots \\ a_{m1} B & \cdots & a_{mn} B \end{pmatrix}}_{mp \times nq},

так что A⊗BA \otimes B — матрица mp×nqmp \times nq, составленная «вклеиванием» копии BB, умноженной на каждый элемент AA.

Возьмём, например, матрицы 2×22 \times 2

A=(prqs)иB=(acbd).A = \begin{pmatrix} p & r \\ q & s \end{pmatrix} \quad \text{и} \quad B = \begin{pmatrix} a & c \\ b & d \end{pmatrix}.

Тогда A⊗BA \otimes B — матрица 4×44 \times 4, содержащая все возможные произведения элементов AA на элементы BB. Заметьте, что A⊗B≠B⊗AA \otimes B \ne B \otimes A (хотя они отличаются лишь перестановкой элементов):

A⊗B=(pBrBqBsB)=(papcrarcpbpdrbrdqaqcsascqbqdsbsd)≠B⊗A=(aAcAbAdA)=(aparcpcraqascqcsbpbrdpdrbqbsdqds).A \otimes B = \begin{pmatrix} pB & rB \\ qB & sB \end{pmatrix} = \begin{pmatrix} pa & pc & ra & rc \\ pb & pd & rb & rd \\ qa & qc & sa & sc \\ qb & qd & sb & sd \end{pmatrix} \quad \ne \quad B \otimes A = \begin{pmatrix} aA & cA \\ bA & dA \end{pmatrix} = \begin{pmatrix} ap & ar & cp & cr \\ aq & as & cq & cs \\ bp & br & dp & dr \\ bq & bs & dq & ds \end{pmatrix}.

(В оригинале одна копия BB выделена красным: в A⊗BA \otimes B это левый верхний блок pa,pc,pb,pdpa, pc, pb, pd, а в B⊗AB \otimes A те же четыре произведения разбросаны по углам блоков.) Больше примеров произведений Кронекера (в том числе с картинками вместо чисел) — в блокноте.

Выше мы видели, что f(A)=A2f(A) = A^2 при A=(prqs)A = \begin{pmatrix} p & r \\ q & s \end{pmatrix} можно считать равносильной функцией f~(vec⁡A)\tilde{f}(\operatorname{vec} A), переводящей векторы из 4 входов в 4 выхода (R4→R4\mathbb{R}^4 \to \mathbb{R}^4), с якобианом 4×44 \times 4, который мы (или компьютер) с трудом вычислили как 16 поэлементных частных производных. Оказывается, этот результат получается гораздо изящнее, если лучше понимать произведения Кронекера. Мы увидим, что «векторизованный» якобиан 4×44 \times 4 — это просто

f~′=I2⊗A+AT⊗I2,\tilde{f}' = I_2 \otimes A + A^T \otimes I_2,

где I2I_2 — единичная матрица 2×22 \times 2. То есть матричный линейный оператор f′(A)[dA]=dA A+A dAf'(A)[dA] = dA\,A + A\,dA после векторизации равносилен

vec⁡f′(A)[dA]⏟dA A+A dA=(I2⊗A+AT⊗I2)⏟f~′vec⁡dA=(2prq0qp+s0qr0p+sr0rq2s)⏟f~′(dpdqdrds)⏟vec⁡dA.\operatorname{vec} \underbrace{f'(A)[dA]}_{dA\,A + A\,dA} = \underbrace{(I_2 \otimes A + A^T \otimes I_2)}_{\tilde{f}'} \operatorname{vec} dA = \underbrace{\begin{pmatrix} 2p & r & q & 0 \\ q & p + s & 0 & q \\ r & 0 & p + s & r \\ 0 & r & q & 2s \end{pmatrix}}_{\tilde{f}'} \underbrace{\begin{pmatrix} dp \\ dq \\ dr \\ ds \end{pmatrix}}_{\operatorname{vec} dA}.

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

Задача. Из определения произведения Кронекера выведите тождества:

  1. (A⊗B)T=AT⊗BT(A \otimes B)^T = A^T \otimes B^T.
  2. (A⊗B)(C⊗D)=(AC)⊗(BD)(A \otimes B)(C \otimes D) = (AC) \otimes (BD).
  3. (A⊗B)−1=A−1⊗B−1(A \otimes B)^{-1} = A^{-1} \otimes B^{-1}. (Следует из свойства 2.)
  4. A⊗BA \otimes B ортогональна (её транспонированная равна обратной), если AA и BB ортогональны. (Из свойств 1 и 3.)
  5. det⁡(A⊗B)=det⁡(A)mdet⁡(B)n\det(A \otimes B) = \det(A)^m \det(B)^n, где A∈Rn×nA \in \mathbb{R}^{n \times n} и B∈Rm×mB \in \mathbb{R}^{m \times m}.
  6. tr⁡(A⊗B)=(tr⁡A)(tr⁡B)\operatorname{tr}(A \otimes B) = (\operatorname{tr} A)(\operatorname{tr} B).
  7. Если Au=λuAu = \lambda u и Bv=μvBv = \mu v — собственные векторы и числа AA и BB, то λμ\lambda\mu — собственное число A⊗BA \otimes B с собственным вектором u⊗vu \otimes v. (Кроме того, поскольку u⊗v=vec⁡Xu \otimes v = \operatorname{vec} X, где X=vuTX = vu^T, это можно связать через утверждение ниже с тождеством BXAT=Bv(Au)T=λμXBXA^T = Bv(Au)^T = \lambda\mu X.)

3.3.1. Главное тождество для произведения Кронекера

Заголовок раздела «3.3.1. Главное тождество для произведения Кронекера»

Чтобы превращать линейные операции вроде AX+XAAX + XA в произведения Кронекера через векторизацию, нужно главное тождество.

Утверждение. Для матриц AA, BB, CC согласованных размеров

(A⊗B)vec⁡(C)=vec⁡(BCAT).(A \otimes B) \operatorname{vec}(C) = \operatorname{vec}(BCA^T).

Значит, A⊗BA \otimes B можно рассматривать как векторизованный аналог линейной операции C↦BCATC \mapsto BCA^T. Хочется ввести параллельное обозначение (A⊗B)[C]=BCAT(A \otimes B)[C] = BCA^T для «невекторизованной» версии этой операции, хотя такое обозначение и не стандартно.

Можно запомнить так: BB стоит сразу слева от CC, а AA «обходит кругом» направо и транспонируется.

Откуда берётся это тождество? Его можно разбить на более простые части, рассмотрев сначала случаи, когда AA или BB — единичная матрица II (подходящего размера). Начнём с A=IA = I, так что BCAT=BCBCA^T = BC. Чему равно vec⁡(BC)\operatorname{vec}(BC)? Если обозначить через c⃗1,c⃗2,…\vec{c}_1, \vec{c}_2, \ldots столбцы CC, то, напомним, BCBC просто умножает BB слева на каждый столбец CC:

BC=B(c⃗1c⃗2⋯)=(Bc⃗1Bc⃗2⋯)⟹vec⁡(BC)=(Bc⃗1Bc⃗2⋮).BC = B \begin{pmatrix} \vec{c}_1 & \vec{c}_2 & \cdots \end{pmatrix} = \begin{pmatrix} B\vec{c}_1 & B\vec{c}_2 & \cdots \end{pmatrix} \Longrightarrow \operatorname{vec}(BC) = \begin{pmatrix} B\vec{c}_1 \\ B\vec{c}_2 \\ \vdots \end{pmatrix}.

Как получить этот вектор vec⁡(BC)\operatorname{vec}(BC) как что-то, умноженное на vec⁡C\operatorname{vec} C? Сразу видно, что

vec⁡(BC)=(Bc⃗1Bc⃗2⋮)=(BB⋱)⏟I⊗B(c⃗1c⃗2⋮)⏟vec⁡C,\operatorname{vec}(BC) = \begin{pmatrix} B\vec{c}_1 \\ B\vec{c}_2 \\ \vdots \end{pmatrix} = \underbrace{\begin{pmatrix} B & & \\ & B & \\ & & \ddots \end{pmatrix}}_{I \otimes B} \underbrace{\begin{pmatrix} \vec{c}_1 \\ \vec{c}_2 \\ \vdots \end{pmatrix}}_{\operatorname{vec} C},

но эта матрица — в точности произведение Кронекера I⊗BI \otimes B! Итак, мы вывели, что

(I⊗B)vec⁡C=vec⁡(BC).(I \otimes B) \operatorname{vec} C = \operatorname{vec}(BC).

А как быть с ATA^T? Это чуть хитрее, но снова упростим задачу до случая B=IB = I, когда BCAT=CATBCA^T = CA^T. Чтобы векторизовать это, нужно посмотреть на столбцы CATCA^T. Что такое первый столбец CATCA^T? Это линейная комбинация столбцов CC, коэффициенты которой задаёт первый столбец ATA^T (= первая строка AA):

столбец 1 матрицы CAT=∑ja1jc⃗j.\text{столбец 1 матрицы } CA^T = \sum_j a_{1j} \vec{c}_j.

Аналогично для столбца 2 и т. д., а затем мы «укладываем» эти столбцы друг под другом, чтобы получить vec⁡(CAT)\operatorname{vec}(CA^T). Но это в точности формула умножения матрицы AA на вектор, если бы «элементами» вектора были столбцы c⃗j\vec{c}_j. Явно:

vec⁡(CAT)=(∑ja1jc⃗j∑ja2jc⃗j⋮)=(a11Ia12I⋯a21Ia22I⋯⋮⋮⋱)⏟A⊗I(c⃗1c⃗2⋮)⏟vec⁡C,\operatorname{vec}(CA^T) = \begin{pmatrix} \sum_j a_{1j} \vec{c}_j \\ \sum_j a_{2j} \vec{c}_j \\ \vdots \end{pmatrix} = \underbrace{\begin{pmatrix} a_{11} I & a_{12} I & \cdots \\ a_{21} I & a_{22} I & \cdots \\ \vdots & \vdots & \ddots \end{pmatrix}}_{A \otimes I} \underbrace{\begin{pmatrix} \vec{c}_1 \\ \vec{c}_2 \\ \vdots \end{pmatrix}}_{\operatorname{vec} C},

и, значит, мы вывели

(A⊗I)vec⁡C=vec⁡(CAT).(A \otimes I) \operatorname{vec} C = \operatorname{vec}(CA^T).

Полное тождество (A⊗B)vec⁡(C)=vec⁡(BCAT)(A \otimes B) \operatorname{vec}(C) = \operatorname{vec}(BCA^T) получается прямым соединением двух выводов: замените во втором выводе CATCA^T на BCATBCA^T — тогда c⃗j\vec{c}_j заменится на Bc⃗jB\vec{c}_j, а значит, II — на BB.

3.3.2. Якобиан в записи через произведение Кронекера

Заголовок раздела «3.3.2. Якобиан в записи через произведение Кронекера»

Теперь воспользуемся этим утверждением, чтобы выразить якобиан f(A)=A2f(A) = A^2 через произведение Кронекера. Пусть dAdA играет роль CC в утверждении. Сразу видно, что

vec⁡(A dA+dA A)=(I⊗A+AT⊗I)⏟якобиан f~′(vec⁡A)vec⁡(dA),\operatorname{vec}(A\,dA + dA\,A) = \underbrace{(I \otimes A + A^T \otimes I)}_{\text{якобиан } \tilde{f}'(\operatorname{vec} A)} \operatorname{vec}(dA),

где II — единичная матрица того же размера, что AA. Это можно записать и в нашей «невекторизованной» записи линейного оператора:

A dA+dA A=(I⊗A+AT⊗I)[dA].A\,dA + dA\,A = (I \otimes A + A^T \otimes I)[dA].

В примере 2×22 \times 2 эти произведения Кронекера вычисляются явно:

(11)⏟I⊗(prqs)⏟A+(pqrs)⏟AT⊗(11)⏟I=(prqsprqs)⏟I⊗A+(pqpqrsrs)⏟AT⊗I=(2prq0qp+s0qr0p+sr0rq2s)=f~′,\underbrace{\begin{pmatrix} 1 & \\ & 1 \end{pmatrix}}_{I} \otimes \underbrace{\begin{pmatrix} p & r \\ q & s \end{pmatrix}}_{A} + \underbrace{\begin{pmatrix} p & q \\ r & s \end{pmatrix}}_{A^T} \otimes \underbrace{\begin{pmatrix} 1 & \\ & 1 \end{pmatrix}}_{I} = \underbrace{\begin{pmatrix} p & r & & \\ q & s & & \\ & & p & r \\ & & q & s \end{pmatrix}}_{I \otimes A} + \underbrace{\begin{pmatrix} p & & q & \\ & p & & q \\ r & & s & \\ & r & & s \end{pmatrix}}_{A^T \otimes I} = \begin{pmatrix} 2p & r & q & 0 \\ q & p + s & 0 & q \\ r & 0 & p + s & r \\ 0 & r & q & 2s \end{pmatrix} = \tilde{f}',

что в точности совпадает с якобианом f~′\tilde{f}', который мы с трудом вычислили раньше!

Пример. Для функции «куб матрицы» A3A^3, где AA — квадратная матрица m×mm \times m, найдите якобиан m2×m2m^2 \times m^2 векторизованной функции vec⁡(A3)\operatorname{vec}(A^3).

Применим тот же приём к кубу матрицы. Конечно, можно утомительно вычислить якобиан через поэлементные частные производные (в блокноте это изящно делается символьными вычислениями), но с произведениями Кронекера гораздо проще и красивее. Напомним, что наша «невекторизованная» производная — линейный оператор

(A3)′[dA]=dA A2+A dA A+A2 dA,(A^3)'[dA] = dA\,A^2 + A\,dA\,A + A^2\,dA,

который векторизуется тройным применением тождества Кронекера:

vec⁡(dA A2+A dA A+A2 dA)=((A2)T⊗I+AT⊗A+I⊗A2)⏟векторизованный якобианvec⁡(dA).\operatorname{vec}(dA\,A^2 + A\,dA\,A + A^2\,dA) = \underbrace{\left((A^2)^T \otimes I + A^T \otimes A + I \otimes A^2\right)}_{\text{векторизованный якобиан}} \operatorname{vec}(dA).

(Примечание переводчика: в оригинале в конце формулы опечатка — vec⁡(dX)\operatorname{vec}(dX) вместо vec⁡(dA)\operatorname{vec}(dA).)

Можно продолжить и найти якобианы A4A^4, A5A^5 и так далее или любой линейной комбинации степеней матрицы. Можно даже представить, как применить похожий процесс к ряду Тейлора любой (аналитической) матричной функции f(A)f(A), но это становится неуклюжим. Позже (и в домашних заданиях) мы обсудим более изящные способы дифференцировать другие матричные функции — не как векторизованные якобианы, а как линейные операторы на матрицах.

3.3.3. Вычислительная стоимость произведений Кронекера

Заголовок раздела «3.3.3. Вычислительная стоимость произведений Кронекера»

С произведениями Кронекера надо быть осторожными, если использовать их как вычислительный инструмент, а не скорее как концептуальный: они легко раздувают стоимость матричных задач намного сверх необходимого.

Пусть AA, BB и CC — матрицы m×mm \times m. Стоимость умножения двух матриц m×mm \times m (обычными методами) растёт пропорционально ∼m3\sim m^3 — информатики называют это «сложностью» Θ(m3)\Theta(m^3). Значит, стоимость линейной операции C↦BCATC \mapsto BCA^T растёт как ∼m3\sim m^3 (два умножения m×mm \times m). Если же вычислять тот же ответ через vec⁡(BCAT)=(A⊗B)vec⁡C\operatorname{vec}(BCA^T) = (A \otimes B) \operatorname{vec} C, придётся:

  1. Построить матрицу A⊗BA \otimes B размера m2×m2m^2 \times m^2. Это требует m4m^4 умножений (все элементы AA на все элементы BB) и ∼m4\sim m^4 памяти. (Сравните с ∼m2\sim m^2 памяти, чтобы хранить AA или BB. При m=1000m = 1000 это в миллион раз больше памяти — терабайты вместо мегабайт!)
  2. Умножить A⊗BA \otimes B на вектор vec⁡C\operatorname{vec} C из m2m^2 элементов. Умножение матрицы n×nn \times n на вектор требует ∼n2\sim n^2 операций, а здесь n=m2n = m^2, так что это снова ∼m4\sim m^4 арифметических операций.

Итак, вместо ∼m3\sim m^3 операций и ∼m2\sim m^2 памяти для вычисления BCATBCA^T путь через (A⊗B)vec⁡C(A \otimes B) \operatorname{vec} C требует ∼m4\sim m^4 операций и ∼m4\sim m^4 памяти — несравнимо хуже! По сути, это потому, что у A⊗BA \otimes B много структуры, которую мы не используем (это очень особая матрица m2×m2m^2 \times m^2).

Таких примеров много. Ещё один знаменитый — решение линейных матричных уравнений

AX+XB=CAX + XB = C

относительно неизвестной матрицы XX при заданных AA, BB, CC, где все они — матрицы m×mm \times m. Это называется уравнением Сильвестра. Это линейные уравнения относительно неизвестной XX, и их можно превратить в обычную систему из m2m^2 линейных уравнений через произведения Кронекера:

vec⁡(AX+XB)=(I⊗A+BT⊗I)vec⁡X=vec⁡C,\operatorname{vec}(AX + XB) = (I \otimes A + B^T \otimes I) \operatorname{vec} X = \operatorname{vec} C,

которую затем можно решить относительно m2m^2 неизвестных vec⁡X\operatorname{vec} X методом Гаусса. Но решение системы m2×m2m^2 \times m^2 методом Гаусса стоит ∼(m2)3=m6\sim (m^2)^3 = m^6. Оказывается, однако, что есть хитрые алгоритмы, решающие AX+XB=CAX + XB = C всего за ∼m3\sim m^3 операций (с ∼m2\sim m^2 памяти); при m=1000m = 1000 это экономит множитель ∼m3=109\sim m^3 = 10^9 (миллиард) в объёме вычислений.

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

5. Производные в общих векторных пространствах

Заголовок раздела «5. Производные в общих векторных пространствах»

Матричный анализ требует ещё шире обобщить понятия производной и градиента — на функции, у которых входы и/или выходы не просто скаляры или векторы-столбцы. Для этого мы расширим понятие обычного скалярного произведения векторов и обычной евклидовой «длины» вектора до общих скалярных произведений (inner products) и норм на векторных пространствах. Первым примером будут знакомые матрицы, рассмотренные с этой точки зрения.

Вспомним из линейной алгебры: любое множество VV можно назвать «векторным пространством», если его элементы можно складывать/вычитать x±yx \pm y и умножать на скаляры αx\alpha x (с соблюдением некоторых базовых арифметических аксиом, например дистрибутивности). Например, векторное пространство образуют сами матрицы m×nm \times n или даже непрерывные функции u(x)u(x) (из R\mathbb{R} в R\mathbb{R}) — главное, что их можно складывать, вычитать, масштабировать и получать элементы того же множества. Оказывается, необычайно полезно распространить дифференцирование на такие пространства — например, на функции, переводящие матрицы в матрицы или функции в числа. Ключевое условие — чтобы у входного и выходного векторных пространств VV была норма и, желательно, скалярное произведение.

5.1. Простое скалярное произведение и норма для матриц

Заголовок раздела «5.1. Простое скалярное произведение и норма для матриц»

Напомним, что для скалярных функций f(x)∈Rf(x) \in \mathbb{R} с векторными входами x∈Rnx \in \mathbb{R}^n (то есть «векторами-столбцами» из nn компонент)

df=f(x+dx)−f(x)=f′(x)[dx]∈R.df = f(x + dx) - f(x) = f'(x)[dx] \in \mathbb{R}.

Значит, f′(x)f'(x) — линейный оператор, который принимает вектор dxdx и выдаёт скаляр. Иначе говоря, f′(x)f'(x) — вектор-строка1 (∇f)T(\nabla f)^T. С этой точки зрения dfdf — скалярное произведение:

df=∇f⋅dx.df = \nabla f \cdot dx.

1 Понятие «вектора-строки» формализуется как «ковектор», «двойственный вектор» или элемент «двойственного (сопряжённого) пространства» — не путать с дуальными числами, которые используются в автоматическом дифференцировании (часть 3).

Это можно обобщить на любое векторное пространство VV со скалярным произведением! Для x∈Vx \in V и скалярной функции ff получаем линейный оператор f′(x)[dx]∈Rf'(x)[dx] \in \mathbb{R}, который называется «линейной формой». Чтобы определить градиент ∇f\nabla f, нужно скалярное произведение на VV — обобщение привычного скалярного произведения векторов на векторные пространства!

Для x,y∈Vx, y \in V скалярное произведение ⟨x,y⟩\langle x, y \rangle — это отображение, для которого ⟨x,y⟩∈R\langle x, y \rangle \in \mathbb{R}. Его также часто обозначают x⋅yx \cdot y или ⟨x∣y⟩\langle x \mid y \rangle. Технически скалярное произведение — это отображение, которое:

  1. Симметрично: ⟨x,y⟩=⟨y,x⟩\langle x, y \rangle = \langle y, x \rangle (или эрмитово-симметрично2, ⟨x,y⟩=⟨y,x⟩‾\langle x, y \rangle = \overline{\langle y, x \rangle}, если бы мы работали с комплексными числами);
  2. Линейно: ⟨x,αy+βz⟩=α⟨x,y⟩+β⟨x,z⟩\langle x, \alpha y + \beta z \rangle = \alpha \langle x, y \rangle + \beta \langle x, z \rangle;
  3. Неотрицательно: ⟨x,x⟩:=∥x∥2≥0\langle x, x \rangle := \Vert x \Vert^2 \ge 0, и =0= 0 тогда и только тогда, когда x=0x = 0.

2 Некоторые авторы для комплексных векторных пространств отличают «dot product» от «inner product»: у первого нет комплексного сопряжения, x⋅y=y⋅xx \cdot y = y \cdot x (тогда x⋅xx \cdot x не обязано быть вещественным и не равно ∥x∥2\Vert x \Vert^2), а второе обязано быть эрмитово-симметричным: ⟨x,y⟩=xˉ⋅y\langle x, y \rangle = \bar{x} \cdot y. Другой источник путаницы с комплексными пространствами — в некоторых областях математики определяют ⟨x,y⟩=x⋅yˉ\langle x, y \rangle = x \cdot \bar{y}, то есть сопрягают правый аргумент вместо левого (так что произведение линейно по левому аргументу и сопряжённо-линейно по правому). Ну не рады ли вы, что мы остаёмся с вещественными числами?

Заметьте, что из первых двух свойств следует, что произведение линейно и по левому вектору (или сопряжённо-линейно, если бы мы работали с комплексными числами). Ещё одно полезное следствие этих трёх свойств, которое вывести чуть сложнее, — неравенство Коши — Буняковского — Шварца ∣⟨x,y⟩∣≤∥x∥ ∥y∥|\langle x, y \rangle| \le \Vert x \Vert\, \Vert y \Vert.

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

3 Полнота означает, что у любой последовательности Коши в векторном пространстве — любой последовательности точек, которые сближаются всё сильнее, — есть предел, лежащий в этом же пространстве. Для векторных пространств над вещественными или комплексными скалярами это условие на практике обычно выполняется, но с пространствами функций бывает сложнее: например, пределом последовательности непрерывных функций может оказаться разрывная функция.

Имея гильбертово пространство, можно определить градиент скалярной функции. Пусть x∈Vx \in V — гильбертову пространству — и f(x)f(x) — скаляр; тогда у нас есть линейная форма f′(x)[dx]∈Rf'(x)[dx] \in \mathbb{R}. При этих предположениях теорема, известная как теорема Рисса о представлении, утверждает, что любая линейная форма (в том числе f′f') должна быть скалярным произведением с чем-то:

f′(x)[dx]=⟨(некоторый вектор)⏟градиент ∇f∣x,dx⟩=df.f'(x)[dx] = \big\langle \underbrace{\text{(некоторый вектор)}}_{\text{градиент } \nabla f|_x}, dx \big\rangle = df.

То есть градиент ∇f\nabla f определяется как то, на что надо скалярно умножить dxdx, чтобы получить dfdf. Заметьте, что ∇f\nabla f всегда имеет «ту же форму», что и xx.

Первые несколько примеров — обычное гильбертово пространство V=RnV = \mathbb{R}^n с разными скалярными произведениями.

Пример. Для V=RnV = \mathbb{R}^n из векторов-столбцов длины nn есть привычное евклидово скалярное произведение ⟨x,y⟩=xTy\langle x, y \rangle = x^T y. Оно приводит к обычному ∇f\nabla f.

Пример. На Rn\mathbb{R}^n бывают и другие скалярные произведения. Например,

⟨x,y⟩W=w1x1y1+w2x2y2+⋯+wnxnyn=xT(w1⋱wn)⏟Wy\langle x, y \rangle_W = w_1 x_1 y_1 + w_2 x_2 y_2 + \dots + w_n x_n y_n = x^T \underbrace{\begin{pmatrix} w_1 & & \\ & \ddots & \\ & & w_n \end{pmatrix}}_{W} y

с весами w1,…,wn>0w_1, \dots, w_n > 0.

Шире, взвешенное скалярное произведение ⟨x,y⟩W=xTWy\langle x, y \rangle_W = x^T W y можно определить для любой симметричной положительно определённой матрицы WW (W=WTW = W^T и WW положительно определена — этого достаточно, чтобы произведение было корректным).

Если поменять определение скалярного произведения, поменяется и определение градиента! Например, для f(x)=xTAxf(x) = x^T A x мы ранее нашли df=xT(A+AT) dxdf = x^T (A + A^T)\,dx. С обычным евклидовым скалярным произведением это дало градиент ∇f=(A+AT)x\nabla f = (A + A^T)x. Но если взять взвешенное произведение xTWyx^T W y, получится другой «градиент» ∇(W)f=W−1(A+AT)x\nabla^{(W)} f = W^{-1}(A + A^T)x, такой что df=⟨∇(W)f,dx⟩Wdf = \langle \nabla^{(W)} f, dx \rangle_W.

В этом конспекте мы, если не оговорено иное, используем для x∈Rnx \in \mathbb{R}^n евклидово скалярное произведение и, значит, обычный ∇f\nabla f. Однако взвешенные скалярные произведения полезны во многих случаях, особенно когда компоненты xx имеют разные масштабы или единицы измерения.

Комментарий переводчика: именно эта идея стоит за «предобусловленными» оптимизаторами. Adam, по сути, делит градиент покомпонентно на оценку масштаба — это шаг по градиенту в «взвешенной» геометрии (урок 1.4.2).

Можно рассмотреть и пространство матриц m×nm \times n, V=Rm×nV = \mathbb{R}^{m \times n}. Существует, конечно, изоморфизм векторных пространств V∋A→vec⁡(A)∈RmnV \ni A \to \operatorname{vec}(A) \in \mathbb{R}^{mn}. Поэтому в этом пространстве есть аналог привычного евклидова скалярного произведения («фробениусово»), которое удобно переписать через матричные операции с помощью следа.

Определение (скалярное произведение Фробениуса). Скалярное произведение Фробениуса двух матриц m×nm \times n AA и BB:

⟨A,B⟩F=∑ijAijBij=vec⁡(A)Tvec⁡(B)=tr⁡(ATB).\langle A, B \rangle_F = \sum_{ij} A_{ij} B_{ij} = \operatorname{vec}(A)^T \operatorname{vec}(B) = \operatorname{tr}(A^T B).

С ним связана соответствующая норма Фробениуса:

∥A∥F=⟨A,A⟩F=tr⁡(ATA)=∥vec⁡A∥=∑i,j∣Aij∣2.\Vert A \Vert_F = \sqrt{\langle A, A \rangle_F} = \sqrt{\operatorname{tr}(A^T A)} = \Vert \operatorname{vec} A \Vert = \sqrt{\sum_{i,j} |A_{ij}|^2}.

С её помощью мы теперь можем определить градиент скалярных функций с матричными входами! Это будет наше скалярное произведение матриц по умолчанию (а значит, и наш градиент по матрице по умолчанию) в этом конспекте (иногда индекс FF мы опускаем).

Пример. Рассмотрим функцию

f(A)=∥A∥F=tr⁡(ATA).f(A) = \Vert A \Vert_F = \sqrt{\operatorname{tr}(A^T A)}.

Чему равен dfdf?

Во-первых, по привычным правилам цепочки и степени для скаляров

df=12tr⁡(ATA) d(tr⁡ATA).df = \frac{1}{2\sqrt{\operatorname{tr}(A^T A)}}\, d(\operatorname{tr} A^T A).

Далее заметим, что (по линейности следа)

d(tr⁡B)=tr⁡(B+dB)−tr⁡(B)=tr⁡(B)+tr⁡(dB)−tr⁡(B)=tr⁡(dB).d(\operatorname{tr} B) = \operatorname{tr}(B + dB) - \operatorname{tr}(B) = \operatorname{tr}(B) + \operatorname{tr}(dB) - \operatorname{tr}(B) = \operatorname{tr}(dB).

Следовательно,

df=12∥A∥Ftr⁡(d(ATA))=12∥A∥Ftr⁡(dAT A+AT dA)=12∥A∥F(tr⁡(dAT A)+tr⁡(AT dA))=1∥A∥Ftr⁡(AT dA)=⟨A∥A∥F,dA⟩.\begin{aligned} df &= \frac{1}{2\Vert A \Vert_F} \operatorname{tr}(d(A^T A)) \\ &= \frac{1}{2\Vert A \Vert_F} \operatorname{tr}(dA^T\, A + A^T\, dA) \\ &= \frac{1}{2\Vert A \Vert_F} \left(\operatorname{tr}(dA^T\, A) + \operatorname{tr}(A^T\, dA)\right) \\ &= \frac{1}{\Vert A \Vert_F} \operatorname{tr}(A^T\, dA) = \left\langle \frac{A}{\Vert A \Vert_F}, dA \right\rangle. \end{aligned}

Здесь мы воспользовались тем, что tr⁡B=tr⁡BT\operatorname{tr} B = \operatorname{tr} B^T, а на последнем шаге связали dfdf со скалярным произведением Фробениуса. Иными словами,

∇f=∇∥A∥F=A∥A∥F.\nabla f = \nabla \Vert A \Vert_F = \frac{A}{\Vert A \Vert_F}.

Заметьте, что для векторов-столбцов xx получается в точности тот же результат: ∇∥x∥=x/∥x∥\nabla \Vert x \Vert = x / \Vert x \Vert (и это на самом деле одно и то же через x=vec⁡Ax = \operatorname{vec} A).

Рассмотрим ещё один простой пример.

Пример. Зафиксируем постоянные x∈Rmx \in \mathbb{R}^m, y∈Rny \in \mathbb{R}^n и рассмотрим функцию f:Rm×n→Rf: \mathbb{R}^{m \times n} \to \mathbb{R}, заданную формулой

f(A)=xTAy.f(A) = x^T A y.

Чему равен ∇f\nabla f?

Имеем

df=xT dA y=tr⁡(xT dA y)=tr⁡(yxT dA)=⟨xyT⏟∇f,dA⟩.\begin{aligned} df &= x^T\, dA\, y \\ &= \operatorname{tr}(x^T\, dA\, y) \\ &= \operatorname{tr}(y x^T\, dA) \\ &= \big\langle \underbrace{x y^T}_{\nabla f}, dA \big\rangle. \end{aligned}

Комментарий переводчика: это ровно градиент линейного слоя. Если выход слоя z=Whz = Wh, а ошибка (градиент потерь по zz) — вектор δ\delta, то потери меняются на δTdW h\delta^T dW\, h, и по примеру выше ∇WL=δ hT\nabla_W L = \delta\, h^T — внешнее произведение «ошибка × вход», той же формы, что WW. Именно это считает обратный проход в уроке 3.1.2.

Шире, для любой скалярной функции f(A)f(A) из определения скалярного произведения Фробениуса следует:

df=f(A+dA)−f(A)=⟨∇f,dA⟩=∑i,j(∇f)i,j dAi,j,df = f(A + dA) - f(A) = \langle \nabla f, dA \rangle = \sum_{i,j} (\nabla f)_{i,j}\, dA_{i,j},

а значит, компоненты градиента — в точности поэлементные производные

(∇f)i,j=∂f∂Ai,j,(\nabla f)_{i,j} = \frac{\partial f}{\partial A_{i,j}},

как и в покомпонентном определении градиента из анализа многих переменных! Но для нетривиальных функций от матриц f(A)f(A) брать производную по каждому элементу AA по отдельности бывает крайне неудобно. С «целостным» определением через скалярное произведение матриц мы вскоре сможем вычислять ещё более сложные градиенты по матрицам, включая ∇(det⁡A)\nabla(\det A)!

5.2. Производные, нормы и банаховы пространства

Заголовок раздела «5.2. Производные, нормы и банаховы пространства»

Мы весь курс говорим о «норме», но что такое норма технически? Конечно, есть знакомые примеры вроде евклидовой нормы («ℓ2\ell^2») ∥x∥=∑kxk2\Vert x \Vert = \sqrt{\sum_k x_k^2} для x∈Rnx \in \mathbb{R}^n, но полезно понять, как это понятие обобщается на другие векторные пространства. Оказывается, нормы на самом деле необходимы для определения производной!

Для векторного пространства VV норма ∥⋅∥\Vert \cdot \Vert на VV — это отображение ∥⋅∥:V→R\Vert \cdot \Vert: V \to \mathbb{R} с тремя свойствами:

  1. Неотрицательность: ∥v∥≥0\Vert v \Vert \ge 0 и ∥v∥=0  ⟺  v=0\Vert v \Vert = 0 \iff v = 0;
  2. Однородность: ∥αv∥=∣α∣ ∥v∥\Vert \alpha v \Vert = |\alpha|\, \Vert v \Vert для любого α∈R\alpha \in \mathbb{R};
  3. Неравенство треугольника: ∥u+v∥≤∥u∥+∥v∥\Vert u + v \Vert \le \Vert u \Vert + \Vert v \Vert.

Векторное пространство с нормой называется нормированным векторным пространством. Часто математикам технически нужен чуть более точный вид нормированного пространства с менее очевидным названием — банахово пространство.

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

Например, по любому скалярному произведению ⟨u,v⟩\langle u, v \rangle строится соответствующая норма ∥u∥=⟨u,u⟩\Vert u \Vert = \sqrt{\langle u, u \rangle}. (Таким образом, любое гильбертово пространство — ещё и банахово.4)

4 Доказать неравенство треугольника для произвольного скалярного произведения не так просто; для этого используют неравенство Коши — Буняковского — Шварца.

Чтобы определить производные, технически нужно, чтобы банаховыми пространствами были и вход, и выход. Чтобы увидеть это, вспомним наш формализм:

f(x+δx)−f(x)=f′(x)[δx]⏟линейное+o(δx)⏟меньше.f(x + \delta x) - f(x) = \underbrace{f'(x)[\delta x]}_{\text{линейное}} + \underbrace{o(\delta x)}_{\text{меньше}}.

Чтобы точно определить, в каком смысле члены o(δx)o(\delta x) «меньше» или «более высокого порядка», нужны нормы. В частности, обозначение «о-малое» o(δx)o(\delta x) означает любую функцию, для которой

lim⁡δx→0∥o(δx)∥∥δx∥=0,\lim_{\delta x \to 0} \frac{\Vert o(\delta x) \Vert}{\Vert \delta x \Vert} = 0,

то есть которая стремится к нулю быстрее, чем линейно по δx\delta x. Для этого нормы нужны и у входа δx\delta x, и у выхода (функции). Такое распространение дифференцирования на произвольные нормированные (банаховы) пространства иногда называют производной Фреше.

7. Производная определителя и обратной матрицы

Заголовок раздела «7. Производная определителя и обратной матрицы»

Этот раздел конспекта следует Julia-блокноту курса (notes/determinant_and_inverse.jl). Блокнот коротковат, но вычисление важное и полезное.

Теорема. Для квадратной матрицы AA

∇(det⁡A)=cofactor⁡(A)=(det⁡A) A−T:=adj⁡(AT)=adj⁡(A)T,\nabla(\det A) = \operatorname{cofactor}(A) = (\det A)\, A^{-T} := \operatorname{adj}(A^T) = \operatorname{adj}(A)^T,

где adj⁡\operatorname{adj} — «присоединённая» матрица (adjugate). (Возможно, вы не слышали о присоединённой матрице, но эта формула говорит, что это просто adj⁡(A)=det⁡(A)A−1\operatorname{adj}(A) = \det(A) A^{-1}, или cofactor⁡(A)=adj⁡(AT)\operatorname{cofactor}(A) = \operatorname{adj}(A^T).) Кроме того,

d(det⁡A)=tr⁡(det⁡(A)A−1 dA)=tr⁡(adj⁡(A) dA)=tr⁡(cofactor⁡(A)TdA).d(\det A) = \operatorname{tr}(\det(A) A^{-1}\, dA) = \operatorname{tr}(\operatorname{adj}(A)\, dA) = \operatorname{tr}(\operatorname{cofactor}(A)^T dA).

Возможно, вы помните, что каждый элемент (i,j)(i, j) матрицы алгебраических дополнений (cofactor) — это (−1)i+j(-1)^{i+j}, умноженное на определитель, полученный вычёркиванием из AA строки ii и столбца jj. Вот несколько вычислений для 2×22 \times 2, чтобы почувствовать эти функции:

M=(acbd)  ⟹  cofactor⁡(M)=(d−b−ca),adj⁡(M)=(d−c−ba),M−1=1ad−bc(d−c−ba).\begin{aligned} M &= \begin{pmatrix} a & c \\ b & d \end{pmatrix} \\ \implies \operatorname{cofactor}(M) &= \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}, \\ \operatorname{adj}(M) &= \begin{pmatrix} d & -c \\ -b & a \end{pmatrix}, \\ M^{-1} &= \frac{1}{ad - bc} \begin{pmatrix} d & -c \\ -b & a \end{pmatrix}. \end{aligned}

Примечание переводчика: в оригинале у матриц cofactor и adj переставлены внедиагональные элементы (а M−1M^{-1} записана через cofactor вместо adj). Для MM с первой строкой (a,c)(a, c) и второй (b,d)(b, d) дополнение к элементу cc (позиция (1,2)(1,2)) равно −b-b, поэтому верно так, как в переводе; проверка: M⋅adj⁡(M)=(ad−bc)IM \cdot \operatorname{adj}(M) = (ad - bc) I.

Численно, как сделано в блокноте, можно взять случайную матрицу AA размера n×nn \times n (скажем, 9×99 \times 9), положить, например, dA=0,00001 AdA = 0{,}00001\,A и увидеть, что

det⁡(A+dA)−det⁡(A)≈tr⁡(adj⁡(A) dA),\det(A + dA) - \det(A) \approx \operatorname{tr}(\operatorname{adj}(A)\, dA),

что численно подтверждает теорему.

Теперь докажем теорему двумя способами. Во-первых, есть прямое доказательство: продифференцировать скаляр по каждому входу, используя разложение определителя по ii-й строке (разложение Лапласа). Напомним, что

det⁡(A)=Ai1Ci1+Ai2Ci2+⋯+AinCin.\det(A) = A_{i1} C_{i1} + A_{i2} C_{i2} + \dots + A_{in} C_{in}.

Значит,

∂det⁡A∂Aij=Cij  ⟹  ∇(det⁡A)=C\frac{\partial \det A}{\partial A_{ij}} = C_{ij} \implies \nabla(\det A) = C

— матрица алгебраических дополнений. (Вычисляя эти частные производные, важно помнить, что дополнение CijC_{ij} не содержит элементов AA из строки ii и столбца jj. Так что, например, Ai1A_{i1} явно входит только в первый член и не спрятан ни в одном из CC в этом разложении.)

Есть и более изящное доказательство через линеаризацию около единичной матрицы. Во-первых, из свойств определителей легко увидеть, что

det⁡(I+dA)−1=tr⁡(dA),\det(I + dA) - 1 = \operatorname{tr}(dA),

и, значит,

det⁡(A+A(A−1 dA))−det⁡(A)=det⁡(A)(det⁡(I+A−1 dA)−1)=det⁡(A)tr⁡(A−1 dA)=tr⁡(det⁡(A)A−1 dA)=tr⁡(adj⁡(A) dA).\begin{aligned} \det(A + A(A^{-1}\, dA)) - \det(A) &= \det(A)\left(\det(I + A^{-1}\, dA) - 1\right) \\ &= \det(A) \operatorname{tr}(A^{-1}\, dA) = \operatorname{tr}(\det(A) A^{-1}\, dA) \\ &= \operatorname{tr}(\operatorname{adj}(A)\, dA). \end{aligned}

Это тоже доказывает теорему.

Почему det⁡(I+dA)−1=tr⁡(dA)\det(I + dA) - 1 = \operatorname{tr}(dA) (пояснение переводчика): в разложении определителя I+dAI + dA единственное слагаемое без произведений двух малых элементов — произведение диагонали (1+dA11)(1+dA22)⋯(1 + dA_{11})(1 + dA_{22}) \cdots, а оно с точностью до первого порядка равно 1+dA11+dA22+…1 + dA_{11} + dA_{22} + \dots

Применим это, чтобы найти производную характеристического многочлена в точке xx. Пусть p(x)=det⁡(xI−A)p(x) = \det(xI - A) — скалярная функция xx. Напомним, что через разложение на множители p(x)p(x) можно записать через собственные числа λi\lambda_i. Значит, можно спросить: чему равна производная p(x)p(x)? Средствами анализа первого курса можно просто вычислить

ddx∏i(x−λi)=∑i∏j≠i(x−λj)=∏i(x−λi){∑i(x−λi)−1},\frac{d}{dx} \prod_i (x - \lambda_i) = \sum_i \prod_{j \ne i} (x - \lambda_j) = \prod_i (x - \lambda_i) \left\{ \sum_i (x - \lambda_i)^{-1} \right\},

если x≠λix \ne \lambda_i.

Это вполне хорошее простое доказательство, но с нашей новой техникой есть другое:

d(det⁡(xI−A))=det⁡(xI−A)tr⁡((xI−A)−1 d(xI−A))=det⁡(xI−A)tr⁡((xI−A)−1)dx.\begin{aligned} d(\det(xI - A)) &= \det(xI - A) \operatorname{tr}\left((xI - A)^{-1}\, d(xI - A)\right) \\ &= \det(xI - A) \operatorname{tr}\left((xI - A)^{-1}\right) dx. \end{aligned}

Здесь мы воспользовались тем, что d(xI−A)=dx Id(xI - A) = dx\, I, когда AA постоянна, и tr⁡(A dx)=tr⁡(A) dx\operatorname{tr}(A\, dx) = \operatorname{tr}(A)\, dx, поскольку dxdx — скаляр.

Это снова можно проверить численно, как в блокноте.

Аналогично по правилу цепочки

d(log⁡(det⁡A))=d(det⁡A)det⁡A=det⁡(A−1) d(det⁡A)=tr⁡(A−1 dA).d(\log(\det A)) = \frac{d(\det A)}{\det A} = \det(A^{-1})\, d(\det A) = \operatorname{tr}(A^{-1}\, dA).

Логарифмическая производная часто встречается в прикладной математике. Заметьте: здесь мы воспользовались тем, что 1det⁡A=det⁡(A−1)\frac{1}{\det A} = \det(A^{-1}), поскольку 1=det⁡(I)=det⁡(AA−1)=det⁡(A)det⁡(A−1)1 = \det(I) = \det(AA^{-1}) = \det(A)\det(A^{-1}).

Например, вспомним метод Ньютона для поиска корней f(x)=0f(x) = 0 вещественных функций одной переменной f(x)f(x): делаем последовательность шагов x→x+δxx \to x + \delta x. Ключевая формула метода Ньютона — δx=−f′(x)−1f(x)\delta x = -f'(x)^{-1} f(x), а это то же самое, что −1(log⁡f(x))′-\frac{1}{(\log f(x))'}. Поэтому производные логарифма определителя появляются при поиске корней определителей, то есть для f(x)=det⁡M(x)f(x) = \det M(x). Когда M(x)=A−xIM(x) = A - xI, корни определителя — собственные числа AA. Для более общих функций M(x)M(x) решение det⁡M(x)=0\det M(x) = 0 поэтому называют нелинейной задачей на собственные значения.

Примечание переводчика: в оригинале в формуле шага Ньютона потерян знак минус.

Комментарий переводчика: ∇log⁡det⁡A=A−T\nabla \log\det A = A^{-T} встречается и в машинном обучении — например, в логарифме правдоподобия многомерного нормального распределения (там стоит log⁡det⁡\log\det матрицы ковариаций) и в нормализующих потоках.

Наконец, вычислим производную обратной матрицы (и как линейный оператор, и как явную матрицу Якоби). Есть изящный приём, позволяющий получить эту производную просто из свойства обратной A−1A=IA^{-1}A = I. По правилу произведения отсюда следует

d(A−1A)=d(I)=0=d(A−1)A+A−1 dA  ⟹  d(A−1)=(A−1)′[dA]=−A−1 dA A−1.\begin{aligned} d(A^{-1}A) &= d(I) = 0 = d(A^{-1})A + A^{-1}\, dA \\ &\implies \boxed{d(A^{-1}) = (A^{-1})'[dA] = -A^{-1}\, dA\, A^{-1}}. \end{aligned}

Вторая строка задаёт вполне хороший линейный оператор для производной (A−1)′(A^{-1})', но при желании его можно переписать явной матрицей Якоби, используя произведения Кронекера, действующие на «векторизованные» матрицы, как в главе 3:

vec⁡(d(A−1))=vec⁡(−A−1(dA)A−1)=−(A−T⊗A−1)⏟якобианvec⁡(dA),\operatorname{vec}\left(d(A^{-1})\right) = \operatorname{vec}\left(-A^{-1}(dA)A^{-1}\right) = \underbrace{-(A^{-T} \otimes A^{-1})}_{\text{якобиан}} \operatorname{vec}(dA),

где A−TA^{-T} обозначает (A−1)T=(AT)−1(A^{-1})^T = (A^T)^{-1}. Эту формулу можно проверить численно, как в блокноте.

На практике, однако, вы, вероятно, обнаружите, что операторное выражение −A−1 dA A−1-A^{-1}\, dA\, A^{-1} полезнее явного якобиана для производных с обратными матрицами. Например, если у вас есть матричная функция A(t)A(t) скалярного параметра t∈Rt \in \mathbb{R}, вы сразу получаете d(A−1)dt=−A−1dAdtA−1\frac{d(A^{-1})}{dt} = -A^{-1} \frac{dA}{dt} A^{-1}. Более изощрённое применение — метод сопряжённых уравнений (adjoint method) в главе 6 конспекта.

ENRU
vectorization, vecвекторизация, vec
column-major / row-majorхранение по столбцам / по строкам
Kronecker productпроизведение Кронекера
tensorтензор
Sylvester equationуравнение Сильвестра
sparse / dense matrixразреженная / плотная матрица
inner productскалярное произведение
Frobenius inner product, Frobenius normскалярное произведение Фробениуса, норма Фробениуса
traceслед
Hilbert space, Banach spaceгильбертово пространство, банахово пространство
Riesz representation theoremтеорема Рисса о представлении
Cauchy–Schwarz inequalityнеравенство Коши — Буняковского — Шварца
triangle inequality, homogeneityнеравенство треугольника, однородность
Fréchet derivativeпроизводная Фреше
cofactor matrix, adjugateматрица алгебраических дополнений, присоединённая матрица
Laplace (cofactor) expansionразложение Лапласа (по строке)
characteristic polynomialхарактеристический многочлен
logarithmic derivativeлогарифмическая производная
nonlinear eigenproblemнелинейная задача на собственные значения

Дальше: часть 3 — прямой и обратный режим автоматического дифференцирования.