1. Учимся искать производные

1. Учимся искать производные#

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

Удобнее всего оказывается работать в терминах «дифференциала» — с ним можно не задумываться о промежуточных размерностях, а просто применять стандартные правила.

Мы будем работать в этом конспекте со скалярами, векторами и матрицами. Нас будет интересовать, что именно мы дифференцируем, по чему мы дифференцируем и что получается в итоге.

Строчными буквами мы будем обозначать векторы-столбцы и константы. Заглавными буквами мы будем обозначать матрицы. Производная столбца — это столбец. Производная по столбцу — это столбец.

\[\begin{split} x = \begin{pmatrix}x_1 \\ \ldots \\ x_n \end{pmatrix} \qquad X = \begin{pmatrix}x_{11} & \ldots & x_{1n} \\ \ldots & \ddots & \ldots \\ x_{n1} & \ldots & x_{nn} \end{pmatrix}. \end{split}\]

Мы рассмотрим постепенно много разных входов и выходов, и получим таблицу из канонических случаев. По строчкам будем откладывать то, откуда бьёт функция, то есть входы. По столбцам будем откладывать то, куда бьёт функция, то есть выходы. Для ситуаций обозначенных прочерками обобщения получить не выйдет.

скаляр

вектор

матрица

скаляр

\(f'(x) dx\)

\(\mathfrak{J} dx\)

вектор

\(\nabla_x f(x)^T dx\)

\(\mathfrak{J} dx\)

матрица

\(tr(\nabla_X f(X)^T dX)\)

Символом \(\nabla_x f\) обозначается градиент (вектор из производных). Символом \(\mathfrak{J}\) обозначена матрица Якоби. Символом \(H\) мы будем обозначать матрицу Гессе из вторых производных.

Найдём производную и дифференциал функции \(f(x) = x^2\), где \(x\) скаляр. Функция бьёт из скаляров в скаляры

\[ f(x) : \mathbb{R} \to \mathbb{R}. \]

Примером такой функции может быть \(f(x) = x^2\). Мы знаем, что по таблице производных \(f'(x) = 2x\). Также мы знаем, что дифференциал – это линейная часть приращения функции, а производная – это предел отношения приращения функции к приращению аргумента при приращении аргумента стремящемся к нулю.

Грубо говоря, дифференциал помогает представить приращение функции в линейном виде

\[ d{f(x)} = f'(x) dx. \]

Если мы находимся в какой-то точке \(x_0\) и делаем из неё небольшое приращение \(dx,\) то наша функция изменится примерно на \(df(x)\). Оказывается, что именно в терминах дифференциалов удобно работать с матричными производными.

Свойства матричных дифференциалов очень похожи на свойства обычных. Надо только не забыть, что мы работаем с матрицами.

\[\begin{equation*} \begin{aligned} & d{(XY)} = d{X}Y + X \cdot d{Y}, \quad d{X} \cdot Y \ne Y \cdot d{X} \\ & d{(\alpha X + \beta Y)} = \alpha d{X} + \beta d{Y} \\ & d{(X^T)} = (d{X})^T \\ & d{A} = 0, \quad A - \text{матрица из констант} \end{aligned} \end{equation*}\]

Чтобы доказать все эти свойства достаточно просто аккуратно расписать их. Кроме этих правил нам понадобится пара трюков по работе со скалярами. Если \(s\) — скаляр размера \(1 \times 1\), тогда \(s^T = s\) и \(tr(s) = s\), где \(tr\) — операция взятия следа матрицы.

С помощью этих преобразований мы будем приводить дифференциалы к каноническому виду и вытаскивать из них производные.

а) Найдите производную \(\nabla_x f(x)\), где \(f(x) = a^T x\), где \(a\) и \(x\) векторы размера \(n \times 1\)

Решение

Рассмотрим вторую ситуацию из таблицы, функция бьёт из векторов в скаляры. Это обычная функция от нескольких аргументов

\[ f(x) : \mathbb{R}^n \to \mathbb{R}. \]

Мы уже умеем брать такие производные. Если мы хотим найти производную функции \(f(x_1, x_2, \ldots, x_n)\), нам надо взять производную по каждому аргументу и записать их все в виде вектора. Такой вектор называют градиентом.

\[\begin{split} \nabla_x f(x) = \begin{pmatrix} \frac{\partial f(x)}{\partial x_1} \\ \frac{\partial f(x)}{\partial x_2} \\ \ldots \\ \frac{\partial f(x)}{\partial x_n} \end{pmatrix} \end{split}\]

Если умножить градиент на вектор приращений, у нас получится дифференциал

\[\begin{multline*} d{f(x)} = \nabla_x f(x)^T dx = \begin{pmatrix} \frac{\partial f(x)}{\partial x_1} & \frac{\partial f(x)}{\partial x_2} & \ldots & \frac{\partial f(x)}{\partial x_n} \end{pmatrix} \begin{pmatrix} dx_1 \\ dx_2 \\ \ldots \\ dx_n \end{pmatrix} = \\ = \frac{\partial f(x)}{\partial x_1} \cdot dx_1 + \frac{\partial f(x)}{\partial x_2} \cdot dx_2 + \ldots +\frac{\partial f(x)}{\partial x_n} \cdot dx_n. \end{multline*}\]

При маленьком изменении \(x_i\) на \(dx_i\) функция будет при прочих равных меняться пропорционально соответствующей частной производной. Посмотрим на конкретный пример, скалярное произведение. Можно расписать умножение одного вектора на другой в виде привычной нам формулы

\[\begin{equation*} \underset{[1 \times 1]}{f(x)} = \underset{[1 \times n]}{a^T} \cdot \underset{[n \times 1]}{x} = \begin{pmatrix} a_1 & a_2 & \ldots &a_n \end{pmatrix} \cdot \begin{pmatrix} x_1 \\ x_2 \\ \ldots \\ x_n \end{pmatrix} = a_1 \cdot x_1 + a_2 \cdot x_2 + \ldots + a_n \cdot x_n. \end{equation*}\]

Из неё чётко видно, что \(\frac{\partial f(x)}{\partial x_i} = a_i\). Увидев это мы можем выписать градиент функции

\[\begin{split} \nabla_x f(x) = \begin{pmatrix} \frac{\partial f(x)}{\partial x_1} \\ \frac{\partial f(x)}{\partial x_2} \\ \ldots \\ \frac{\partial f(x)}{\partial x_n} \end{pmatrix} = \begin{pmatrix} a_1 \\ a_2 \\ \ldots \\ a_n \end{pmatrix} = a, \end{split}\]

теперь можно записать дифференциал

\[\begin{multline*} df(x) = a^T dx = \frac{\partial f(x)}{\partial x_1} \cdot dx_1 + \frac{\partial f(x)}{\partial x_2} \cdot dx_2 + \ldots +\frac{\partial f(x)}{\partial x_n} \cdot dx_n = \\ = a_1 \cdot dx_1 + a_2 \cdot dx_2 + \ldots + a_n \cdot dx_n. \end{multline*}\]

В то же самое время можно было бы просто воспользоваться правилами нахождения матричных дифференциалов

\[ df(x) = dx{a^T x} = a^T dx = \nabla f(x)^T dx, \]

откуда \( \nabla_x f(x) = a\). Производная найдена. При таком подходе нам не надо анализировать каждую частную производную по отдельности. Мы находим одним умелым движением руки сразу же все производные.

б) Найдите первую и вторую производные функции \(f(x) = x^T A x\), где \(x\) вектор размера \(n \times 1\), \(A\) матрица размера \(n \times n\)

Решение

Функция по-прежнему бьёт из векторов в скаляры. Попробуем перемножить все матрицы и расписать её в явном виде по аналогии со скалярным произведением

\[\begin{equation*} \underset{[1 \times 1]}{f(x)} = \underset{[1 \times n]}{x^T} \cdot \underset{[n \times n]}{A} \cdot \underset{[n \times 1]}{x} = \sum_{i = 1}^n \sum_{j=1}^n a_{ij} \cdot x_i \cdot x_j. \end{equation*}\]

Если продолжить в том же духе, мы сможем найти все частные производные, а потом назад вернём их в матрицу. Единственное, что смущает – мы делаем что-то неестественное. Всё было записано в красивом компактном матричном виде, а мы это испортили. А что, если множителей будет больше? Тогда суммы станут совсем громоздкими, и мы легко запутаемся.

При этом, если воспользоваться тут правилами работы с матричными дифференциалами, мы легко получим красивый результат

\[ df(x) = d{x^T A x} = d(x^T) \cdot A \cdot x + x^T \cdot d(Ax) = d(x^T) \cdot A \cdot x + x^T \underset{d{A} = 0}{d{(A)}} x + x^T A dx(x). \]

Заметим, что \(d(x^T) A x\) это скаляр. Мы перемножаем матрицы с размерностями \(1 \times n\), \(n \times n\) и \(n \times 1\). В результате получается размерность \(1 \times 1\). Мы можем смело транспонировать скаляр, когда нам это надо. Эта операция никак не повлияет на результат

\[ df(x) = d(x^T) A x + x^T A dx = x^T A^T dx + x^T A dx = x^T(A^T + A) dx. \]

Мы нашли матричный дифференциал и свели его к каноничной форме

\[ df(x) = \nabla^T_x f dx = x^T(A^T + A) dx \]

Получается, что искомая производная \(\nabla_x f(x) = (A + A^T) x\). Обратите внимание, что размерности не нарушены и мы получили столбец из производных, то есть искомый градиент нашей функции \(f(x)\).

По аналогии мы легко можем найти вторую производную. Для этого надо взять производную производной. Функция \(g(x) = (A + A^T) x\) бьёт из векторов в вектора

\[ f(x) : \mathbb{R}^n \to \mathbb{R}^m. \]

На самом деле с такой ситуацией мы также знакомились на математическом анализе. Если \(n=1\) то у нас есть \(m\) функций, каждая из которых применяется к \(x\). На выходе получается вектор

\[\begin{split} \begin{pmatrix} f_1(x) \\ f_2(x) \\ \ldots \\ f_m(x). \end{pmatrix} \end{split}\]

Если мы хотим найти производную, нужно взять частную производную каждой функции по \(x\) и записать в виде вектора. Дифференциал также будет представлять из себя вектор, так как при приращении аргумента на какую-то величину изменяется каждая из функций

\[\begin{split} df(x) = \begin{pmatrix} \frac{\partial f_1}{\partial x} \\ \frac{\partial f_2}{\partial x} \\ \ldots \\ \frac{\partial f_m}{\partial x} \end{pmatrix} \cdot \begin{pmatrix} dx \\ dx \\ \ldots \\ dx \end{pmatrix} = \begin{pmatrix} \frac{\partial f_1}{\partial x} dx \\ \frac{\partial f_2}{\partial x} dx \\ \ldots \\ \frac{\partial f_m}{\partial x} dx \end{pmatrix}. \end{split}\]

Если \(n > 1\), то аргументов на вход в такой вектор из функций идёт несколько, на выходе получается матрица

\[\begin{split} \begin{pmatrix} f_1(x_1) & f_1(x_2) & \ldots & f_1(x_n) \\ f_2(x_1) & f_2(x_2) & \ldots & f_2(x_n) \\ \ldots & \ldots & \ddots & \ldots \\ f_m(x_1) & f_m(x_2) & \ldots & f_m(x_n) \end{pmatrix} \end{split}\]

Производной такой многомерной функции будет матрица из частных производных каждой функции по каждому аргументу

\[\begin{split} \begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \ldots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \ldots & \frac{\partial f_2}{\partial x_n} \\ \ldots & \ldots & \ddots & \ldots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \ldots & \frac{\partial f_m}{\partial x_n} \end{pmatrix}. \end{split}\]

Дифференциал снова будет представлять из себя вектор

\[\begin{split} df(x) = \begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \ldots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \ldots & \frac{\partial f_2}{\partial x_n} \\ \ldots & \ldots & \ddots & \ldots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \ldots & \frac{\partial f_m}{\partial x_n} \end{pmatrix} \cdot \begin{pmatrix} dx_1 \\ dx_2 \\ \ldots \\ dx_n \end{pmatrix} = \begin{pmatrix} \frac{\partial f_1}{\partial x_1} dx_1 + \frac{\partial f_1}{\partial x_2} dx_2 + \ldots + \frac{\partial f_1}{\partial x_n} dx_n \\ \frac{\partial f_2}{\partial x_1} dx_1 + \frac{\partial f_2}{\partial x_2} dx_2 + \ldots + \frac{\partial f_2}{\partial x_n} dx_n \\ \ldots \\ \frac{\partial f_m}{\partial x_1} dx_1 + \frac{\partial f_m}{\partial x_2} dx_2 + \ldots + \frac{\partial f_m}{\partial x_n} dx_n \end{pmatrix}. \end{split}\]

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

\[ dg(x) = (A + A^T) dx. \]

Выходит, что матрица из вторых производных для функции \(f(x)\) выглядит как \(A + A^T.\) Обратите внимание, что для этой ситуации в каноническом виде нет транспонирования. Когда мы вытаскиваем из записи дифференциала производную, нам не надо его применять.

в) Найдите производную \(\nabla_x f(x)\), где \(f(x) = \ln(x^T A x)\), где \(x\) вектор размера \(n \times 1\), \(A\) матрица размера \(n \times n\)

Решение

Когда мы хотим найти производную \(f(x) = \ln(x^T A x)\), мы просто можем применить правила взятия производной от сложной функции \(f(y) = \ln(y).\) К логарифму на вход идет скаляр, а значит его производная равна \(\frac{1}{y}\). Выходит, что

\[ df(x) = d\ln(y) = \frac{1}{y} dy = \frac{1}{y} d(x^T A x) = \frac{1}{x^T A x} \cdot x^T(A^T + A) dx. \]

Если отображение бьёт в матрицы или вектора, производная будет браться аналогичным образом. Надо будет чуть аккуратнее следить за размерностями. На такой кейс мы посмотрим немного позже.

г) Найдите производную \(f(x) = a^TXAXa\), где \(x\) вектор размера \(n \times 1\), \(A\) матрица размера \(n \times n\)

Решение

Движемся к следующей ситуации. Функция бьёт из матриц в скаляры

\[ f(X) : \mathbb{R}^{n \times k} \to \mathbb{R}. \]

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

\[ d{f(X)} = f'_{x_{11}} dx_{11} + f'_{x_{12}} dx_{12} + \ldots + f'_{x_{nk}} dx_{nk}. \]

Его можно записать в компактном виде через след матрицы как

\[ df(X) = tr(\nabla f(X)^T dX), \]

где

\[\begin{split} \nabla_X f(X) = \begin{pmatrix} f'_{x_{11}} & \ldots & f'_{x_{1k}} \\ \ldots & \ddots & \ldots \\ f'_{x_{n1}} & \ldots & f'_{x_{nk}} \end{pmatrix} \end{split}\]

Вполне естественен вопрос, почему это можно записать именно так? Давайте попробуем увидеть этот факт на каком-нибудь простом примере. Пусть у нас есть две матрицы

\[\begin{split} A_{[2 \times 3]} = \begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \end{pmatrix} \qquad X_{[2 \times 3]} = \begin{pmatrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23} \end{pmatrix}. \end{split}\]

Посмотрим на то, как выглядит \(tr(A^T dX)\). Как это не странно, он совпадает с дифференциалом

\[\begin{split} tr(A^T dX) = tr \left( \begin{pmatrix} a_{11} & a_{21} \\ a_{12} & a_{22} \\ a_{13} & a_{23} \end{pmatrix} \begin{pmatrix} dx_{11} & dx_{12} & dx_{13} \\ dx_{21} & dx_{22} & dx_{23} \end{pmatrix} \right), \end{split}\]

при произведении на выходе получаем матрицу размера \(3 \times 3\)

\[\begin{split} \begin{pmatrix} a_{11} dx_{11} + a_{21} dx_{21} & a_{11} dx_{12} + a_{21} dx_{22} & a_{11} dx_{13} + a_{21} dx_{23} \\ a_{12} dx_{11} + a_{22} dx_{21} & a_{12} dx_{12} + a_{22} dx_{22} & a_{12} dx_{13} + a_{22} dx_{23} \\ a_{13} dx_{11} + a_{23} dx_{21} & a_{13} dx_{12} + a_{23} dx_{22} & a_{13} dx_{13} + a_{23} dx_{23} \end{pmatrix}. \end{split}\]

Когда мы берём её след, остаётся сумма элементов по диагонали. Это и есть требуемый дифференциал. Дальше мы периодически будем пользоваться таким приёмом. Например, норму Фробениуса

\[ ||X-A||_F^2 = \sum_{i,j} (x_{ij} - a_{ij})^2 \]

можно записать в матричном виде как

\[ ||X-A||_F^2 = tr((X-A)^T (X-A)). \]

Итак, найдём производную от \(f(X) = a^TXAXa\). Нам нужно выписать дифференциал и привести его к каноническому виду

Обратим внимание на то, что мы бьём из матриц в скаляры. Дифференциал будет по своей размерности совпадать со скаляром. Производная будет размера матрицы

\[ df(X) = d(a^TXAXa) = \underset{[1 \times 1]}{a^Td(X)AXa} + \underset{[1 \times 1]}{a^TXA \cdot d(X)a}. \]

Оба слагаемых, которые мы получаем после перехода к дифференциалу – скаляры. Мы хотим представить дифференциал в виде \(tr(\text{нечто} d{X})\). След от скаляра это снова скаляр. Получается, что мы бесплатно можем навесить над правой частью наешго равенство знак следа и воспользоваться его свойствами

\[\begin{multline*} df(X) = d(a^TXAXa) = tr(a^T \cdot d(X) \cdot AXa) + tr(a^TXA \cdot d(X) \cdot a) = \\ = tr(AXaa^T \cdot d(X)) + tr(aa^TXA \cdot d(X)) = \\ = tr(AXaa^T \cdot d(X) + aa^TXA \cdot dX) = tr((AXaa^T + aa^TXA)dX). \end{multline*}\]

Производная найдена, оказалось что это

\[ \nabla_X f(X) = (AXaa^T + aa^TXA)^T = aa^TX^TA^T + A^TXaa^T. \]

Как бы мы нашли это, всё по-честному перемножив, даже боюсь себе представлять.

д) Найдите производную \(f(x) = x x^T x\), где \(x\) вектор размера \(n \times 1\)

Решение

Ещё один пример на ситуацию, когда функция бьёт из векторов в вектора

\[ \underset{[n \times 1]}{f(x)} = \underset{[n \times 1]}{x} \underset{[1 \times n]}{x^T} \underset{[n \times 1]}{x}. \]

В нём надо аккуратно вести себя со сложением матриц со скалярами. Берём дифференциал

\[ df(x) = d{xx^Tx} = dx \cdot x^Tx + x dx^T \cdot x + xx^T \cdot dx. \]

В первом слагаемом пользуемся тем, что \(x^Tx\) скаляр и его можно вынести перед дифференциалом. Этот скаляр умножается на каждый элемент вектора. Дальше мы захотим вынести дифференциал за скобку, чтобы не испортить матричное сложение, подчеркнём факт этого перемножения на каждый элемент единичной матрицей. Во втором слагаемом пользуемся тем, что \(dx^T \cdot x\) скаляр и транспонируем его

\[ df(x) = \underset{[1 \times 1]}{x^Tx} \underset{[n \times n]}{I_n} \underset{[n \times 1]}{dx} + x x^T dx + xx^T dx = (x^Tx I_n + 2 x x^T)dx. \]

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

\[\begin{split} \mathfrak{J} = x^Tx I_n + 2 x x^T = \begin{pmatrix} \sum x_i^2 + 2 x_1^2 & 2 x_1 x_2 & \ldots & 2 x_1 x_n \\ 2 x_1 x_2 & \sum x_i^2 + 2 x_2^2 & \ldots & 2 x_2 x_n \\ \ldots & \ldots & \ddots &\ldots \\ 2 x_1 x_n & 2 x_n x_2 & \ldots & \sum x_i^2 + 2 x_n^2 \\ \end{pmatrix}. \end{split}\]

Как и ожидалось, на выходе получилась матрица.

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

\[ f(X) : \mathbb{R}^{n \times k} \to \mathbb{R}^m. \]

Тогда \(X\) матрица, а \(f(X)\) вектор. Нам надо найти производную каждого элемента из вектора \(f(X)\) по каждому элементу из матрицы \(X\). Получается, что \(\frac{\partial f}{\partial X}\) – это трёхмерная структура. Обычно в таких ситуациях ограничиваются записью частных производных либо прибегают к более сложным, многомерным методикам. Мы такие ситуации опустим.