Любая задача машинного обучения — это задача оптимизации, а задачи оптимизации удобнее всего решать градиентными методами (если это возможно, конечно). Поэтому важно уметь находить производные всего, что попадается под руку. Казалось бы, в чём проблема: ведь дифференцирование — простая и понятная штука (чего не скажешь, например, об интегрировании). Зачем же как-то специально учиться дифференцировать матрицы?
Да в принципе-то никаких проблем: в этом параграфе вы не узнаете никаких секретных приёмов или впечатляющих теорем. Но, согласитесь, если исходная функция от вектора $x$ имела вид $f(x) = \vert\vert Ax - b\vert\vert^2$ (где $A$ — константная матрица, а $b$ — постоянный вектор), то хотелось бы уметь и производную выражать красиво и цельно через буквы $A$, $x$ и $b$, не привлекая отдельные координаты $A_{ij}$, $x_k$ и $b_s$. Это не только эстетически приятно, но и благотворно сказывается на производительности наших вычислений: ведь матричные операции обычно очень эффективно оптимизированы в библиотеках, чего не скажешь о самописных циклах по $i, j, k, s$. И всё, что будет происходить дальше, преследует очень простую цель: научиться вычислять производные в удобном, векторно-матричном виде. А чтобы сделать это и не сойти с ума, мы должны ввести ясную систему обозначений, составляющую ядро техники матричного дифференцирования.
Основные обозначения
Вспомним определение производной для функции $f:\mathbb{R}^m\rightarrow\mathbb{R}^n$. Функция $f(x)$ дифференцируема в точке $x_0$, если
$$f(x_0 + h) = f(x_0) + \color{#348FEA}{\left[D_{x_0} f \right]} (h) + \bar{\bar{o}} \left(\left| \left| h\right|\right|\right),$$
где $\color{#348FEA}{\big[D_{x_0} f\big]}$ — дифференциал функции $f$: линейное отображение из мира $x$-ов в мир значений $f$. Грубо говоря, он превращает «малое приращение $h=\Delta x$» в «малое приращение $\Delta f$» («малые» в том смысле, что на о-малое можно плюнуть):
$$f(x_0 + h) - f(x_0)\approx\color{#348FEA}{\left[D_{x_0} f \right]} (h)$$
Отметим, что дифференциал зависит от точки $x_0$, в которой он берётся: $\color{#348FEA}{\left[D_{\color{red}{x_0}} f \right]} (h)$. Под $\vert\vert h\vert\vert$ подразумевается норма вектора $h$, например корень из суммы квадратов координат (обычная евклидова длина).
Давайте рассмотрим несколько примеров и заодно разберёмся, какой вид может принимать выражение $\color{#348FEA}{\big[D_{x_0} f\big]} (h)$ в зависимости от формы $x$. Начнём со случаев, когда $f$ — скалярная функция.
Примеры конкретных форм $\big[D_{x_0} f\big] (h)$, когда $f$ — скалярная функция
$f(x)$ — скалярная функция, $x$ — скаляр. Тогда
$$f(x_0 + h) - f (x_0) \approx f'(x_0) (h)$$
$$\color{#348FEA}{\left[D_{x_0} f\right] (h)} = f'(x_0) h = h \cdot f'(x_0)$$
Здесь $h$ и $f'(x_0)$ — просто числа. В данном случае $\color{#348FEA}{\left[D_{x_0} f\right]}$ — это обычная линейная функция.
$f(x)$ — скалярная функция, $x$ — вектор. Тогда
$$f(x_0 + h) - f(x_0) \approx \sum\limits_i \left.\frac{\partial f}{\partial x_i} \right|_{x=x_0} h_i,$$
то есть
$$ \color{#348FEA}{\left[D_{x_0} f\right]}(h) = \left(\color{#FFC100}{\nabla_{x_0} f}\right)^T h = \langle\color{#FFC100}{\nabla_{x_0} f}, h \rangle, $$
где $\langle\bullet, \bullet\rangle$ — операция скалярного произведения, а $\color{#FFC100}{\nabla_{x_0} f} = \left(\frac{\partial f}{\partial x_1}, \ldots, \frac{\partial f}{\partial x_n}\right)$ — градиент функции $f$.
$f(x)$ — скалярная функция, $X$ — матрица. Дифференциал скалярной функции по матричному аргументу определяется следующим образом:
$$ f(X_0 + H) - f(X_0) \approx \sum\limits_{i,j}\ \left.\frac{\partial f}{\partial X_{ij}} \right|_{X=X_0} H_{ij} $$
Можно заметить, что это стандартное определение дифференциала функции многих переменных для случая, когда переменные — элементы матрицы $X$. Заметим также один интересный факт:
$$ \sum_{ij} A_{ij} B_{ij} = \text{tr}, A^T B, $$
где $A$ и $B$ — произвольные матрицы одинакового размера. Объединяя оба приведённых выше факта, получаем:
$$ \color{#348FEA}{\left[D_{X_0} f \right]} (H) = \sum \limits_{ij} \left. \frac{\partial f}{\partial X_{ij}} \right|_{X = X_0} \left( X - X_0 \right)_{ij} = \text{tr}\, \left( \left[\left. \frac{\partial f}{\partial X_{ij}}\right|_{X=X_0}\right]^T H\right). $$
Можно заметить, что здесь, по аналогии с примерами, где $x$ — скаляр и где $x$ — вектор (и $f(x)$ — скалярная функция), получилось на самом деле скалярное произведение градиента функции $f$ по переменным $X_{ij}$ и приращения. Этот градиент мы записали для удобства в виде матрицы с теми же размерами, что матрица $X$.
В примерах выше нам дважды пришлось столкнуться с давним знакомцем из матанализа: градиентом скалярной функции (у нескалярных функций градиента не бывает). Напомним, что градиент $\color{#FFC100}{\nabla_{x_0} f}$ функции в точке $x_0$ состоит из частных производных этой функции по всем координатам аргумента. При этом его обычно упаковывают в ту же форму, что и сам аргумент: если $x$ — вектор-строка, то и градиент записывается вектор-строкой, а если $x$ — матрица, то и градиент тоже будет матрицей того же размера. Это важно, потому что для осуществления градиентного спуска мы должны уметь прибавлять градиент к точке, в которой он посчитан.
Как мы уже имели возможность убедиться, для градиента скалярной функции $f$ выполнено равенство
$$ \left[D_{x_0} f \right] (x-x_0) = \langle\color{#FFC100}{\nabla_{x_0} f}, x-x_0\rangle, $$
где скалярное произведение — это сумма попарных произведений соответствующих координат (да-да, самое обыкновенное).
Посмотрим теперь, как выглядит дифференцирование для функций, которые на выходе выдают не скаляр, а что-то более сложное.
Примеры $\big[D_{x_0} f\big] (h)$, где $f$ — это вектор или матрица
$f(x) = \begin{pmatrix} f(x_1)\ \vdots\ f(x_m) \end{pmatrix}$, $x$ — вектор. Тогда
$$ f(x_0 + h) - f(x_0) = \begin{pmatrix} f(x_{01} + h_1) - f(x_{01})\ \vdots \ f(x_{0m} + h_m) - f(x_{0m}) \end{pmatrix} \approx \begin{pmatrix} f'(x_{01}) h_1\ \vdots \ f'(x_{0m}) h_m \end{pmatrix} = \begin{pmatrix} f'(x_{01}) \ \vdots \ f'(x_{0m}) \end{pmatrix} \odot h. $$
В последнем выражении происходит покомпонентное умножение:
$$\color{#348FEA}{\big[D_{x_0} f\big]} (h) = f'(x_0) \odot h = h \odot f'(x_0)$$
$f(X) = XW$, где $X$ и $W$ — матрицы. Тогда
$$f(X_0 + H) - f(X_0) = (X_0 + H) W - X_0 W = H W,$$
то есть
$$\color{#348FEA}{\big[D_{X_0} f\big]} (H) = H W$$
$f(W) = XW$, где $X$ и $W$ — матрицы. Тогда
$$f(W_0 + H) - f(W_0) = X(W_0 + H) - XW_0 = X H,$$
то есть
$$\color{#348FEA}{\big[D_{W_0} f\big]} (H) = X H$$
$f(x) = (f_1(x),\ldots,f_K(x))$ — вектор-строка, $x = (x_1,\ldots,x_D)$ — вектор-строка. Тогда
$$ \color{#348FEA}{\big[D_{x_0} f\big]}(h) = \left(\sum_j \left. \frac{\partial f_1}{\partial y_j} \right|_{y=x_0}h_j, \ldots, \sum_j \left. \frac{\partial f_K}{\partial y_j} \right|_{y=x_0}h_j \right) = $$
$$ = h \cdot \begin{pmatrix} \left. \frac{\partial f_1}{\partial y_1} \right|_{y=x_0} & \ldots & \left. \frac{\partial f_k}{\partial y_1} \right|_{y=x_0} \\ \vdots & & \vdots \\ \left. \frac{\partial f_1}{\partial y_D} \right|_{y=x_0} & \ldots & \left. \frac{\partial f_k}{\partial y_D} \right|_{y=x_0}\\ \end{pmatrix} = h \cdot \left. \frac{\partial f}{\partial y}\right|_{y = x_0} $$
Матрица, выписанная в предпоследней выкладке, — это знакомая вам из курса матанализа матрица Якоби.
Простые примеры и свойства матричного дифференцирования
Производная константы. Пусть $f(x) = a$. Тогда
$$f(x_0 + h) - f(x_0) = 0,$$
то есть $\color{#348FEA}{\big[D_{x_0} f\big]}$ — это нулевое отображение. А если $f$ — скалярная функция, то и $\color{#FFC100}{\nabla_{x_0} f} = 0.$
Производная линейного отображения. Пусть $f(x)$ — линейное отображение. Тогда
$$f(x_0 + h) - f(x_0) = f(x_0) + f(h) - f(x_0) = f(h)$$
Поскольку справа линейное отображение, то по определению оно и является дифференциалом $\color{#348FEA}{\big[D_{x_0} f\big]}$. Мы уже видели примеры таких ситуаций выше, когда рассматривали отображения умножения на матрицу слева или справа. Если $f$ — (скалярная) линейная функция, то она представляется в виде $\langle a, v\rangle$ для некоторого вектора $a$ — он и будет градиентом $f$.
Линейность производной. Пусть $f(x) = \lambda u(x) + \mu v(x)$, где $\lambda, \mu$ — скаляры, а $u, v$ — некоторые отображения, тогда
$$\color{#348FEA}{\big[D_{x_0} f\big]} = \lambda \color{#348FEA}{\big[D_{x_0} u\big]} + \mu \color{#348FEA}{\big[D_{x_0} v\big]}$$
Попробуйте доказать сами, прежде чем смотреть доказательство.
$$f(x_0 + h) - f(x_0) = (\lambda u(x_0 + h) + \mu v(x_0 + h)) - (\lambda u(x_0) + \mu v(x_0)) =$$
$$ = \lambda(u(x_0 + h) - u(x_0)) + \mu(v(x_0 + h) - v(x_0)) \approx $$
$$\approx \lambda \color{#348FEA}{\big[D_{x_0} u\big]}(h) + \mu \color{#348FEA}{\big[D_{x_0} v\big]}(h)$$
Производная произведения. Пусть $f(x) = u(x) v(x)$, где $u, v$ — некоторые отображения, тогда
$$\color{#348FEA}{\big[D_{x_0} f\big]} = \color{#348FEA}{\big[D_{x_0} u\big]} \cdot v(x_0) + u(x_0) \cdot \color{#348FEA}{\big[D_{x_0} v\big]}$$
Попробуйте доказать сами, прежде чем смотреть доказательство.
Обозначим для краткости $x = x_0 + h$. Тогда
$$u(x)v(x) - u(x_0)v(x_0) = u(x)v(x) - u(x_0)v(x) + u(x_0)v(x) - u(x_0)v(x_0) =$$
$$ (u(x) - u(x_0))v(x) + u(x_0)(v(x) - v(x_0))\approx $$
$$\approx \color{#348FEA}{\big[D_{x_0} u\big]}(h) \cdot v(x) + u(x_0)\cdot \color{#348FEA}{\big[D_{x_0} v\big]}(h)$$
И всё бы хорошо, да в первом слагаемом $v(x)$ вместо $v(x_0)$. Придётся разложить ещё разок:
$$\color{#348FEA}{\big[D_{x_0} u\big]}(h) \cdot v(x) \approx $$
$$\color{#348FEA}{\big[D_{x_0} u\big]}(h) \cdot \left(v(x_0) + \color{#348FEA}{\big[D_{x_0} v\big]}(h) + o(\vert\vert h\vert\vert)\right) =$$
$$\color{#348FEA}{\big[D_{x_0} u\big]}(h) \cdot v(x_0) + \bar{\bar{o}}\left(\vert\vert h\vert\vert\right)$$
Это же правило сработает и для скалярного произведения:
$$\color{#348FEA}{\big[D_{x_0} \langle u, v\rangle\big]} = \langle\color{#348FEA}{\big[D_{x_0} u\big]}, v\rangle + \langle u, \color{#348FEA}{\big[D_{x_0} v\big]}\rangle$$
В этом нетрудно убедиться, повторив доказательство или заметив, что в доказательстве мы пользовались лишь дистрибутивностью (= билинейностью) умножения.
Производная сложной функции. Пусть $f(x) = u(v(x))$. Тогда
$$f(x_0 + h) - f(x_0) = u(v(x_0 + h)) - u(v(x_0)) \approx $$
$$\approx\left[D_{v(x_0)} u \right] (v(x_0 + h) - v(x_0)) \approx \left[D_{v(x_0)} u \right] \left( \left[D_{x_0} v\right] (h)\right)$$
Здесь $D_{v(x_0)} u$ — дифференциал $u$ в точке $v(x_0)$, а $\left[D_{v(x_0)} u \right]\left(\ldots\right)$ — это применение отображения $\left[D_{v(x_0)} u \right]$ к тому, что в скобках. Итого получаем:
$$\left[D_{x_0} \color{#5002A7}{u} \circ \color{#4CB9C0}{v} \right](h) = \color{#5002A7}{\left[D_{v(x_0)} u \right]} \left( \color{#4CB9C0}{\left[D_{x_0} v\right]} (h)\right)$$
Важный частный случай: дифференцирование перестановочно с линейным отображением. Пусть $f(x) = L(v(x))$, где $L$ — линейное отображение. Тогда $\left[D_{v(x_0)} L \right]$ совпадает с самим $L$ и формула упрощается:
$$\left[D_{x_0} \color{#5002A7}{L} \circ \color{#4CB9C0}{v} \right](h) = \color{#5002A7}{L} \left( \color{#4CB9C0}{\left[D_{x_0} v\right]} (h)\right)$$
Простые примеры вычисления производной
Вычислим дифференциал и градиент функции $f(x) = \langle a, x\rangle$, где $x$ — вектор-столбец, $a$ — постоянный вектор.
Попробуйте вычислить сами, прежде чем смотреть решение.
Вычислить производную можно непосредственно:
$$f(x_0 + h) - f(x_0) = \langle a, x_0 + h\rangle - \langle a, x_0\rangle = \langle a, h\rangle$$
Но можно и воспользоваться формулой дифференциала произведения:
$$\color{#348FEA}{\big[D_{x_0} \langle a, x\rangle\big]} (h) = $$
$$ =\langle\color{#348FEA}{\big[D_{x_0} a\big]}(h), x\rangle + \langle a, \color{#348FEA}{\big[D_{x_0} x\big]}(h)\rangle$$
$$= \langle 0, x\rangle + \langle a, h\rangle = \langle a, h\rangle$$
Сразу видно, что градиент функции равен $a$.
Вычислим производную и градиент $f(x) = \langle Ax, x\rangle$, где $x$ — вектор-столбец, $A$ — постоянная матрица.
Попробуйте вычислить сами, прежде чем смотреть решение.
Снова воспользуемся формулой дифференциала произведения:
$$\color{#348FEA}{\big[D_{x_0} \langle Ax, x\rangle\big]}(h) = $$
$$ = \langle\color{#348FEA}{\big[D_{x_0} Ax\big]}(h), x_0\rangle + \langle Ax_0, \color{#348FEA}{\big[D_{x_0} x\big]}(h)\rangle$$
$$= \langle Ah, x_0\rangle + \langle Ax_0, h\rangle$$
Чтобы найти градиент, нам надо это выражение представить в виде $\langle ?, h\rangle$. Для этого поменяем местами множители первого произведения и перенесём $A$ в другую сторону ($A$ перенесётся с транспонированием):
$$\langle A^Tx_0, h\rangle + \langle Ax_0, h\rangle = $$
$$= \langle (A^T + A)x_0, h\rangle$$
Получается, что градиент в точке $x_0$ равен $(A^T + A)x_0$.
Вычислим производную обратной матрицы: $f(X) = X^{-1}$, где $X$ — квадратная матрица.
Попробуйте вычислить сами, прежде чем смотреть решение.
Рассмотрим равенство $I = X\cdot X^{-1} = I$ и продифференцируем его:
$$0 = \color{#348FEA}{\big[D_{X_0} \left( X\cdot X^{-1}\right)\big]}(H) = $$
$$ = \color{#348FEA}{\big[D_{X_0} X\big]}(H)\cdot X_0^{-1} + X_0\cdot \color{#348FEA}{\big[D_{X_0} X^{-1}\big]}(H)$$
Отсюда уже легко выражается
$$\color{#348FEA}{\big[D_{X_0} X^{-1}\big]}(H) = -X_0^{-1}\cdot\color{#348FEA}{\big[D_{X_0} X\big]}(H)\cdot X_0^{-1}$$
Осталось подставить $\color{#348FEA}{\big[D_{X_0} X\big]}(H) = H$, но запомните и предыдущую формулу, она нам пригодится.
Вычислим градиент определителя: $f(X) = \text{det}(X)$, где $X$ — квадратная матрица.
Попробуйте вычислить сами, прежде чем смотреть решение.
В предыдущих примерах мы изо всех сил старались не писать матричных элементов, но сейчас, увы, придётся. Градиент функции состоит из её частных производных: $\color{#FFC100}{\nabla_{x_0} f} = \left(\frac{\partial f}{\partial{x_{ij}}}\right)_{i,j}$. Попробуем вычислить $\frac{\partial f}{\partial{x_{ij}}}$. Для этого разложим определитель по $i$-й строке:
$$\text{det}(X) = \sum_{k}x_{ik}\cdot(-1)^{i + k}M_{ik},$$
где $M_{ik}$ — это определитель подматрицы, полученной из исходной выбрасыванием $i$-й строки и $k$-го столбца. Теперь мы видим, что определитель линеен по переменной $x_{ij}$, причём коэффициент при ней равен $\cdot(-1)^{i + k}M_{ik}$. Таким образом,
$$\frac{\partial f}{\partial{x_{ij}}} = (-1)^{i + k}M_{ik}$$
Чтобы записать матрицу, составленную из таких определителей, покороче, вспомним, что
$$X^{-1} = \frac1{\text{det}(X)}\left((-1)^{i+j}M_{\color{red}{ji}}\right)_{i,j}$$
Обратите внимание на переставленные индексы $i$ и $j$ (отмечены красным). Но всё равно похоже! Получается, что
$$\color{#FFC100}{\nabla_{x_0} f} = \text{det}(X)\cdot X^{-T},$$
где $X^{-T}$ — это более короткая запись для $(X^{-1})^T$.
Вычислим градиент функции $f(x) = \vert\vert Ax - b\vert\vert^2$. С этой функцией мы ещё встретимся, когда будем обсуждать задачу линейной регрессии.
Попробуйте вычислить сами, прежде чем смотреть решение.
Распишем квадрат модуля в виде скалярного произведения:
$$\vert\vert Ax - b\vert\vert^2 = \langle Ax - b, Ax - b\rangle$$
Применим формулу дифференциала произведения и воспользуемся симметричностью скалярного произведения:
$$\color{#348FEA}{\big[D_{x_0} \langle Ax - b, Ax - b\rangle\big]}(h) = $$
$$ \langle \color{#348FEA}{\big[D_{x_0} (Ax - b)\big]}(h), Ax_0 - b\rangle + \langle Ax_0 - b, \color{#348FEA}{\big[D_{x_0} (Ax - b)\big]}(h)\rangle$$
$$ = 2\langle Ax_0 - b, \color{#348FEA}{\big[D_{x_0} (Ax - b)\big]}(h)\rangle =$$
$$ = 2\langle Ax_0 - b, Ah\rangle = \langle 2A^T(Ax_0 - b), h\rangle$$
Получаем, что
$$\color{#FFC100}{\nabla_{x_0} f} = 2A^T(Ax_0 - b)$$
Примеры вычисления производных сложных функций
Вычислим градиент функции $f(X) = \text{log}(\text{det}(X))$.
Попробуйте вычислить сами, прежде чем смотреть решение.
Вспомним формулу производной сложной функции:
$$\left[D_{X_0} u \circ v \right](H) = \left[D_{v(X_0)} u \right] \left( \left[D_{X_0} v\right] (H)\right)$$
и посмотрим, как её тут можно применить. В роли функции $u$ у нас логарифм:
$$u(y) = \text{log}(u),\quad \left[D_{y_0} u\right](s) = \frac1y_0\cdot s,$$
а в роли $v$ — определитель:
$$v(X) = \text{det}(X),\quad \left[D_{y_0} v\right](H) = \langle \text{det}(X_0)\cdot X_0^{-T}, H\rangle,$$
где под скалярным произведением двух матриц понимается, как обычно,
$$\langle A, B\rangle = \sum_{i,j}a_{ij}b_{ij} = \text{tr}(A^TB)$$
Подставим это всё в формулу произведения сложной функции:
$$\left[D_{X_0} u \circ v \right](H) = \frac1{\text{det}(X)}\cdot\langle \text{det}(X)\cdot X^{-T}, H\rangle =$$
$$= \langle \frac1{\text{det}(X)}\cdot\text{det}(X)\cdot X^{-T}, H\rangle = \langle X_0^{-T}, H\rangle$$
Отсюда сразу видим, что
$$\color{#FFC100}{\nabla_{X_0} f} = X_0^{-T}$$
Вычислим градиент функции $f(X) = \text{tr}(AX^TX)$.
Попробуйте вычислить сами, прежде чем смотреть решение.
Воспользуемся тем, что след — это линейное отображение (и значит, перестановочно с дифференцированием), а также правилом дифференцирования сложной функции:
$$\left[D_{X_0} f \right](H) = \text{tr}\left(\left[D_{X_0} AX^TX \right](H)\right) =$$
$$=\text{tr}\left(A\cdot\left[D_{X_0} X^T \right](H)\cdot X_0 + AX_0^T\left[D_{X_0} X \right](H)\right) =$$
$$=\text{tr}\left(AH^TX_0 + AX_0^TH\right)$$
Чтобы найти градиент, мы должны представить это выражение в виде $\langle ?, H\rangle$, что в случае матриц переписывается, как мы уже хорошо знаем, в виде $\text{tr}(?^T\cdot H) = \text{tr}(?\cdot H^T)$. Воспользуемся тем, что под знаком следа можно транспонировать и переставлять множители по циклу:
$$\ldots=\text{tr}\left(AH^TX_0\right) + \text{tr}\left(AX_0^TH\right) =$$
$$=\text{tr}\left(X_0AH^T\right) + \text{tr}\left(H^TX_0A^T\right) =$$
$$=\text{tr}\left(X_0AH^T\right) + \text{tr}\left(X_0A^TH^T\right) =$$
$$=\text{tr}\left((X_0A + X_0A^T)H^T\right)$$
Стало быть,
$$\color{#FFC100}{\nabla_{X_0} f} = X_0A + X_0A^T$$
Вычислим градиент функции $f(X) = \text{det}\left(AX^{-1}B\right)$.
Подумайте, почему мы не можем расписать определитель в виде произведения определителей
Расписать у нас может не получиться из-за того, что $A$ и $B$ могут быть не квадратными, и тогда у них нет определителей и представить исходный определитель в виде произведения невозможно.
Воспользуемся правилом дифференцирования сложной функции для $u(Y) = \text{det}(Y)$, $v(X) = AX^{-1}B$. А для этого сначала вспомним, какие дифференциалы у них самих. С функцией $u$ всё просто:
$$\left[D_{Y_0} u\right](S) = \langle \text{det}(Y_0)Y_0^{-T}, S\rangle =$$
$$= \text{tr}\left(\text{det}(Y_0)Y_0^{-1}S\right)$$
Функция $v$ сама является сложной, но, к счастью, множители $A$ и $B$ выносятся из-под знака дифференциала, а дифференцировать обратную матрицу мы уже умеем:
$$\left[D_{X_0} v\right](H) = - AX_0^{-1}HX_0^{-1} B$$
С учётом этого получаем:
$$\left[D_{X_0} f \right](H) = \left[D_{v(X_0)} u \right] \left( \left[D_{X_0} v\right] (H)\right) =$$
$$=\text{tr}\left(\text{det}(AX_0^{-1}B)(AX_0^{-1}B)^{-1}\left(- AX_0^{-1}HX_0^{-1} B\right)\right)$$
$$=\text{tr}\left(-\text{det}(AX_0^{-1}B)(AX_0^{-1}B)^{-1}AX_0^{-1}HX_0^{-1} B\right)$$
Чтобы найти градиент, мы должны, как обычно, представить это выражение в виде $\text{tr}(?^T\cdot H)$.
$$\ldots=\text{tr}\left(-\text{det}(AX_0^{-1}B)X_0^{-1} B(AX_0^{-1}B)^{-1}AX_0^{-1}H\right)$$
Стало быть,
$${\nabla_{X_0} f} = \left(-\text{det}(AX_0^{-1}B)X_0^{-1} B(AX_0^{-1}B)^{-1}AX_0^{-1}\right)^T =$$
$$=-\text{det}(AX_0^{-1}B)X_0^{-T} A^T(AX_0^{-1}B)^{-T}B^TX_0^{-T}$$
Вторая производная
Рассмотрим теперь не первые два, а первые три члена ряда Тейлора:
$$f(x_0 + h) = f(x_0) + \color{#348FEA}{\left[D_{x_0} f \right]} (h) + \frac12\color{#4CB9C0}{\left[D_{x_0}^2 f \right]} (h, h) + \bar{\bar{o}} \left(\left|\left| h\right|\right|^2\right),$$
где $\color{#4CB9C0}{\left[D_{x_0}^2 f \right]} (h, h)$ — второй дифференциал, квадратичная форма, в которую мы объединили все члены второй степени.
Вопрос на подумать. Докажите, что второй дифференциал является дифференциалом первого, то есть
$$\left[D_{x_0} \color{#348FEA}{\left[D_{x_0} f \right]} (h_1) \right] (h_2) = \left[D_{x_0}^2 f \right] (h_1, h_2)$$
Зависит ли выражение справа от порядка $h_1$ и $h_2$?
Этот факт позволяет вычислять второй дифференциал не с помощью приращений, а повторным дифференцированием производной.
Вторая производная может оказаться полезной при реализации методов второго порядка или же для проверки того, является ли критическая точка (то есть точка, в которой градиент обращается в ноль) точкой минимума или точкой максимума. Напомним, что квадратичная форма $q(h)$ называется положительно определённой (соответственно, отрицательно определённой), если $q(h) \geqslant 0$ (соответственно, $q(h) \leqslant 0$) для всех $h$, причём $q(h) = 0$ только при $h = 0$.
Теорема. Пусть функция $f:\mathbb{R}^m\rightarrow\mathbb{R}$ имеет непрерывные частные производные второго порядка $\frac{\partial^2 f}{\partial x_i\partial x_j}$ в окрестности точки $x_0$, причём $\color{#FFC100}{\nabla_{x_0} f} = 0$. Тогда точка $x_0$ является точкой минимума функции, если квадратичная форма $\color{#348FEA}{D_{x_0}^2 f} $ положительно определена, и точкой максимума, если она отрицательно определена.
Если мы смогли записать матрицу квадратичной формы второго дифференциала, то мы можем проверить её на положительную или отрицательную определённость с помощью критерия Сильвестра.
Примеры вычисления и использования второй производной
Рассмотрим задачу минимизации $f(x) = \vert\vert Ax - b\vert\vert^2$ по переменной $x$, где $A$ — матрица с линейно независимыми столбцами. Выше мы уже нашли градиент этой функции; он был равен $\color{#FFC100}{\nabla_{x_0} f} = 2A^T(Ax - b)$. Мы можем заподозрить, что минимум достигается в точке, где градиент обращается в ноль: $x_* = (A^TA)^{-1}A^Tb$. Отметим, что обратная матрица существует, так как $\text{rk}(A^TA) = \text{rk}{A}$, а столбцы $A$ по условию линейно независимы и, следовательно, $\text{rk}(A^TA)$ равен размеру этой матрицы. Но действительно ли эта точка является точкой минимума? Давайте оставим в стороне другие соображения (например, геометрические, о которых мы упомянем в параграфе про линейные модели) и проверим аналитически. Для этого мы должны вычислить второй дифференциал функции $f(x) = \vert\vert Ax - b\vert\vert^2$.
Попробуйте вычислить сами, прежде чем смотреть решение.
Вспомним, что
$$\color{#348FEA}{\big[D_{x_0} \vert\vert Ax - b\vert\vert^2\big]}(h_1) = \langle 2A^T(Ax_0 - b), h_1\rangle$$
Продифференцируем снова. Скалярное произведение — это линейная функция, поэтому можно занести дифференцирование внутрь:
$$\color{#348FEA}{\big[D_{x_0} \langle 2A^T(Ax - b), h_1\rangle\big]}(h_2) = \langle \color{#348FEA}{\big[D_{x_0} (2A^TAx - 2A^Tb)\big]}(h_2), h_1\rangle =$$
$$=\langle 2A^TAh_2, h_1\rangle = 2h_2^T A^TA h_1$$
Мы нашли квадратичную форму второго дифференциала; она, оказывается, не зависит от точки (впрочем, логично: исходная функция была второй степени по $x$, так что вторая производная должна быть константой). Чтобы показать, что $x_*$ действительно является точкой минимума, достаточно проверить, что эта квадратичная форма положительно определена.
Попробуйте сделать это сами, прежде чем смотреть решение.
Хорошо знакомый с линейной алгеброй читатель сразу скажет, что матрица $A^TA$ положительно определена для матрицы $A$ с линейно независимыми столбцами. Но всё же давайте докажем это явно. Имеем $h^TA^TAh = (Ah)^TAh = \vert\vert Ah\vert\vert^2 \geqslant 0$. Это выражение равно нулю тогда и только тогда, когда $Ah = 0$. Последнее является однородной системой уравнений на $h$, ранг которой равен числу переменных, так что она имеет лишь нулевое решение $h = 0$.
Докажем, что функция $f(X) = \log{\text{det}(X)}$ является выпуклой вверх на множестве симметричных, положительно определённых матриц. Для этого мы должны проверить, что в любой точке квадратичная форма её дифференциала отрицательно определена. Для начала вычислим эту квадратичную форму.
Попробуйте сделать это сами, прежде чем смотреть решение.
Выше мы уже нашли дифференциал этой функции:
$$\color{#348FEA}{\big[D_{X_0} \log{\text{det}(X)}\big]}(H_1) = \langle X_0^{-T}, H_1\rangle$$
Продифференцируем снова:
$$\color{#348FEA}{\big[D_{X_0} \langle X^{-T}, H_1\rangle\big]}(H_2) = \langle \color{#348FEA}{\big[D_{x_0} X^{-T}\big]}(H_2), h_1\rangle =$$
$$=\langle -X_0^{-1}H_2X_0^{-1}, H_1\rangle$$
Чтобы доказать требуемое в условии, мы должны проверить следующее: что для любой симметричной матрицы $X_0$ и для любого симметричного (чтобы не выйти из пространства симметричных матриц) приращения $H\ne 0$ имеем
$$\color{#348FEA}{\big[D^2_{X_0} \log{\text{det}(X)}\big]}(H, H) < 0$$
Покажем это явно. Так как $X_0$ — симметричная, положительно определённая матрица, у неё есть симметричный и положительно определённый квадратный корень: $X_0 = X_0^{1/2}\cdot X_0^{1/2} = X_0^{1/2}\cdot \left(X_0^{1/2}\right)^T.$ Тогда
$$\langle -X_0^{-1}HX_0^{-1}, H\rangle = -\text{tr}\left(X_0^{1/2} \left(X_0^{1/2}\right)^THX_0^{1/2} \left(X_0^{1/2}\right)^TH^T\right) =$$
$$-\text{tr}\left(\left(X_0^{1/2}\right)^THX_0^{1/2} \left(X_0^{1/2}\right)^TH^TX_0^{1/2}\right) = $$
$$=-\text{tr}\left( \left(X_0^{1/2}\right)^THX_0^{1/2} \left[\left(X_0^{1/2}\right)^THX_0^{1/2}\right]^T\right) =$$
$$=-\vert\vert\left(X_0^{1/2}\right)^THX_0^{1/2}\vert\vert^2,$$
что, конечно, меньше нуля для любой ненулевой $H$.