alterna ai
ALTERNA AI / ГЛАВА 03 · 03

03.3 Собираем чувствительности в вектор

На предыдущей странице: меняем одну причину за раз.

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

f=x²+3y²; точка [2,1].

Частные производные образуют линейный функционал

Для дифференцируемой скалярной функции f:Rn→Rf:\mathbb R^n\to\mathbb R градиент в столбцовом соглашении равен

∇f(x)=[∂f/∂x1⋮∂f/∂xn]∈Rn×1.\nabla f(x)= \begin{bmatrix} \partial f/\partial x_1\\ \vdots\\ \partial f/\partial x_n \end{bmatrix} \in\mathbb R^{n\times1}.

Он кодирует первый порядок для любого малого δ\delta:

f(x+δ)≈f(x)+∇f(x)Tδ.f(x+\delta)\approx f(x)+\nabla f(x)^T\delta.

У f(x,y)=x2+3y2f(x,y)=x^2+3y^2 в точке (2,1)(2,1):

g=∇f(2,1)=[4,6]T,∥g∥2=52.g=\nabla f(2,1)=[4,6]^T, \qquad \|g\|_2=\sqrt{52}.

Gradient имеет shape входа, а не shape [n,n][n,n]. Для loss с PP параметрами это PP чувствительностей, по одной на координату текущего parameter state.

Направленная производная сравнивает единичные движения

Для направления uu единичной евклидовой длины

Duf(x)=∇f(x)Tu,∥u∥2=1.D_uf(x)=\nabla f(x)^Tu, \qquad \|u\|_2=1.

Вдоль осей получаем 4 и 6. Но вдоль u=g/∥g∥2u=g/\|g\|_2:

Duf=gTg∥g∥2=∥g∥2=52≈7.2111.D_uf=g^T\frac g{\|g\|_2}=\|g\|_2=\sqrt{52}\approx7.2111.

Неравенство Коши–Буняковского

gTu≤∥g∥2∥u∥2=∥g∥2g^Tu\le\|g\|_2\|u\|_2=\|g\|_2

доказывает максимальность этого локального роста при ограничении ∥u∥2=1\|u\|_2=1. Слово «наискорейший» зависит от выбранной нормы: при другом ограничении множество допустимых направлений будет другим.

Антиградиент задаёт направление, но не безопасную длину

Шаг gradient descent имеет вид

xnew=x−η∇f(x).x_{\mathrm{new}}=x-\eta\nabla f(x).

При η=0.1\eta=0.1:

[2,1]T−0.1[4,6]T=[1.6,0.4]T,[2,1]^T-0.1[4,6]^T=[1.6,0.4]^T,
f(1.6,0.4)=2.56+0.48=3.04<7.f(1.6,0.4)=2.56+0.48=3.04<7.

Но при η=0.5\eta=0.5 тот же gradient даёт

[2,1]T−0.5[4,6]T=[0,−2]T,f(0,−2)=12>7.[2,1]^T-0.5[4,6]^T=[0,-2]^T, \qquad f(0,-2)=12>7.

Направление −g-g гарантирует убывание только для достаточно малого шага в гладкой локальной области. Оно не выдаёт подходящий learning rate автоматически.

В точке (0,0)(0,0) gradient этой положительной квадратичной функции равен нулю, и точка является глобальным минимумом. Для произвольной функции ∇f=0\nabla f=0 означает лишь стационарность: далее нужны сведения о кривизне или поведении функции.

Перебор конечных разностей по всем PP параметрам требует порядка PP дополнительных forward evaluations. Reverse-mode automatic differentiation для скалярного loss повторно использует вычислительный граф и получает все компоненты gradient в одном backward traversal. Это не делает вычисление бесплатным: нужно хранить или восстанавливать промежуточные значения.

В лаборатории сравните η=0.1\eta=0.1 и 0.50.5 при одном старте. Новый эксперимент должен восстанавливать исходную точку: нельзя выдавать последовательность разных настроек за одну trajectory.

x, y, eta = 2, 1, .1
g = [2*x, 6*y]
next_point = [x - eta*g[0], y - eta*g[1]]
next_value = next_point[0]**2 + 3*next_point[1]**2
assert all(abs(a - b) < 1e-12 for a, b in zip(next_point, [1.6, .4]))
assert abs(next_value - 3.04) < 1e-12

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Каждую причину сначала меняем отдельно. Градиент объединяет чувствительности; малый шаг в обратную сторону уменьшил значение именно в этом примере.

Много входов и много выходов. Как этот вопрос продолжает полученный результат?

Python-примеры главы 03 Академическая база →