Содержание курса 13 / 27

13 / 27 · Линейная классификация

Ядра

Линейные методы на нелинейных признаках без вычисления самих признаков: отображения признаков и ядерный трюк в двойственной задаче SVM, какие функции являются ядрами (положительно полуопределённые ядра, теорема Мерсера, правила построения новых ядер), полиномиальное и RBF-ядро и ширина RBF-ядра как ручка компромисса между смещением и разбросом, теорема о представителе и ядерная гребневая регрессия, стоимость от квадратичной до кубической и случайные признаки Фурье как средство от неё.

На этой странице 14

Заметка о методе опорных векторов закончилась двумя наблюдениями. Двойственная задача и полученный из неё классификатор используют обучающие точки только через скалярные произведения ⟨xi,xj⟩\langle x_i, x_j\rangle, а оценка через зазор не зависит от размерности. Линейный классификатор на исходных признаках по-прежнему проводит гиперплоскость, и два концентрических кольца ему не по силам. В этой заметке исходные признаки заменяются более богатым представлением ϕ(x)\phi(x), а скалярное произведение — ядром (kernel) k(x,z)=⟨ϕ(x),ϕ(z)⟩k(x, z) = \langle \phi(x), \phi(z)\rangle, которое можно вычислить, ни разу не построив ϕ(x)\phi(x). Та же задача квадратичного программирования тогда проводит криволинейные границы, а та же идея превращает гребневую регрессию в гибкий непараметрический регрессор. Платить приходится числом обучающих точек вместо числа признаков, и в конце заметки показано, как платить меньше.

Обозначения. Обучающие точки x1,…,xn∈Rdx_1, \dots, x_n \in \mathbb R^d с целевыми значениями yiy_i. Отображение признаков (feature map) ϕ:Rd→H\phi: \mathbb R^d \to \mathcal H переводит точку в вектор пространства H\mathcal H со скалярным произведением, возможно бесконечномерного. Ядро — функция k(x,z)k(x, z); матрица Грама (Gram matrix) KK — матрица n×nn \times n с элементами Kij=k(xi,xj)K_{ij} = k(x_i, x_j), а k(x)=(k(x1,x),…,k(xn,x))⊤k(x) = (k(x_1, x), \dots, k(x_n, x))^\top собирает значения ядра между новой точкой и обучающими. σ\sigma — ширина RBF-ядра, λ\lambda — коэффициент гребневого штрафа.

Отображения признаков#

Линейная модель становится нелинейной по xx, когда она линейна по нелинейным признакам xx. Точки на прямой, у которых один класс в середине, нельзя разделить одним порогом, но после ϕ(x)=(x,x2)\phi(x) = (x, x^2) они лежат на параболе, где их разделяет прямая:

Рисунок

Отображение признаков делает классы линейно разделимыми

Точки на прямой и они же на параболеСлева на числовой прямой синие кружки в середине и красные квадраты по краям. Стрелка φ ведёт к плоскости, где те же точки лежат на параболе: синие внизу, красные выше. Почти горизонтальная прямая отделяет синие точки от красных и пересекает параболу в двух местах.исходный признак x−2−1012−1.471.37один порог не разделит классыправило: +1 при −1.47 < x < 1.37φпосле φ(x) = (x, x²)0246−202xx²k(x, z) = xz + x²z²Точки на прямой и они же на параболеСлева на числовой прямой синие кружки в середине и красные квадраты по краям. Стрелка φ ведёт к плоскости, где те же точки лежат на параболе: синие внизу, красные выше. Почти горизонтальная прямая отделяет синие точки от красных и пересекает параболу в двух местах.исходный признак x−2−1012−1.471.37правило: +1 при −1.47 < x < 1.37φпосле φ(x) = (x, x²)0246−202xx²k(x, z) = xz + x²z²
Двенадцать точек на прямой: класс +1 в середине, класс −1 по краям, и ни один порог по x их не разделяет. Отображение φ(x) = (x, x²) поднимает точки на параболу, и там их разделяет прямая; сплошная линия — решение SVM с жёстким зазором в плоскости (x, x²), пунктир — края полосы, в кружках три опорных вектора. Прямая пересекает параболу при x = −1.47 и x = 1.37: линейное правило в новых признаках — это два порога в исходном. Скалярное произведение после отображения равно k(x, z) = xz + x²z², и SVM можно обучить, зная только его.

Прямая w1x+w2x2+b=0w_1 x + w_2 x^2 + b = 0 на поднятой плоскости — это квадратное неравенство по xx, которое выполняется между двумя порогами. В общем случае добавляют все произведения признаков до некоторой степени pp. Число одночленов степени не выше pp от dd переменных равно (d+pp)\binom{d + p}{p}: при d=100d = 100 и p=3p = 3 это 176 851176\,851. Выписать эти признаки для каждой обучающей точки и подобрать вес для каждого быстро становится узким местом.

Ядерный трюк в двойственной задаче#

Самим признакам SVM не нужен. Его двойственная задача с ϕ(xi)\phi(x_i) вместо xix_i выглядит так:

max⁡α ∑iαi−12∑i,jαiαjyiyj k(xi,xj)subject to  0≤αi≤C,∑iαiyi=0,\begin{aligned} &\max_{\alpha}\ \sum_i \alpha_i - \tfrac12 \sum_{i,j} \alpha_i \alpha_j y_i y_j\, k(x_i, x_j)\\ &\text{subject to}\ \ 0 \le \alpha_i \le C,\quad \sum_i \alpha_i y_i = 0, \end{aligned}

а классификатор равен f(x)=∑iαiyi k(xi,x)+bf(x) = \sum_i \alpha_i y_i\, k(x_i, x) + b, где b=yi−∑jαjyjk(xj,xi)b = y_i - \sum_j \alpha_j y_j k(x_j, x_i) для любого опорного вектора на краю полосы. И то и другое требует только k(x,z)=⟨ϕ(x),ϕ(z)⟩k(x, z) = \langle \phi(x), \phi(z)\rangle. Замена каждого скалярного произведения в линейном методе ядром называется ядерным трюком (kernel trick; Boser, Guyon and Vapnik, 1992); он работает для любого метода, который можно записать через скалярные произведения, от SVM и гребневой регрессии до PCA и kk-средних.

Выигрыш дают ядра, которые дёшево вычислять, хотя ϕ\phi велико. Для x∈R2x \in \mathbb R^2 и ϕ(x)=(x12, 2 x1x2, x22)\phi(x) = (x_1^2,\ \sqrt2\, x_1 x_2,\ x_2^2)

⟨ϕ(x),ϕ(z)⟩=x12z12+2x1x2z1z2+x22z22=(x1z1+x2z2)2=⟨x,z⟩2.\langle \phi(x), \phi(z)\rangle = x_1^2 z_1^2 + 2 x_1 x_2 z_1 z_2 + x_2^2 z_2^2 = (x_1 z_1 + x_2 z_2)^2 = \langle x, z\rangle^2 .

Разобранный пример. Для x=(1,2)x = (1, 2) и z=(3,1)z = (3, 1): ϕ(x)=(1,22,4)\phi(x) = (1, 2\sqrt2, 4), ϕ(z)=(9,32,1)\phi(z) = (9, 3\sqrt2, 1) и ⟨ϕ(x),ϕ(z)⟩=9+12+4=25=(1⋅3+2⋅1)2\langle\phi(x), \phi(z)\rangle = 9 + 12 + 4 = 25 = (1 \cdot 3 + 2 \cdot 1)^2. Ядро стоит одного скалярного произведения в R2\mathbb R^2 и возведения в квадрат; в dd измерениях ⟨x,z⟩2\langle x, z\rangle^2 стоит dd умножений против d2d^2 для явных признаков. У отображения признаков с рисунка, ϕ(x)=(x,x2)\phi(x) = (x, x^2), ядро равно k(x,z)=xz+x2z2k(x, z) = xz + x^2 z^2.

Какие функции являются ядрами#

Не всякая функция сходства — скалярное произведение в каком-то пространстве. Если k(x,z)=⟨ϕ(x),ϕ(z)⟩k(x, z) = \langle\phi(x), \phi(z)\rangle, то для любых точек x1,…,xmx_1, \dots, x_m и любых вещественных чисел c1,…,cmc_1, \dots, c_m

∑i,jcicj k(xi,xj)=∥∑iciϕ(xi)∥2≥0.\sum_{i,j} c_i c_j\, k(x_i, x_j) = \Big\lVert \sum_i c_i \phi(x_i)\Big\rVert^2 \ge 0 .

Значит, матрица Грама ядра на любом конечном множестве точек симметрична и положительно полуопределена. Верно и обратное: симметричная функция, все матрицы Грама которой положительно полуопределены, — это скалярное произведение после некоторого отображения признаков в гильбертово пространство, гильбертово пространство с воспроизводящим ядром (reproducing kernel Hilbert space, RKHS) функции kk (Aronszajn, 1950; Shalev-Shwartz and Ben-David, 2014, лемма 16.2). Такие функции называются положительно полуопределёнными ядрами (positive semidefinite kernels), и именно их может использовать ядерный трюк. Теорема Мерсера (Mercer’s theorem) явно даёт отображение признаков для непрерывного ядра на компактной области: k(x,z)=∑jλjej(x)ej(z)k(x, z) = \sum_j \lambda_j e_j(x) e_j(z) с собственными значениями λj≥0\lambda_j \ge 0 и ортонормированными собственными функциями eje_j, так что ϕ(x)=(λj ej(x))j\phi(x) = (\sqrt{\lambda_j}\, e_j(x))_j (Rasmussen and Williams, 2006, §4.3).

Это условие знакомо по теории вероятностей. Матрица положительно полуопределена ровно тогда, когда она является ковариационной матрицей некоторого случайного вектора, потому что ∑i,jcicjCov⁡(Zi,Zj)=Var⁡(∑iciZi)≥0\sum_{i,j} c_i c_j \operatorname{Cov}(Z_i, Z_j) = \operatorname{Var}(\sum_i c_i Z_i) \ge 0 (см. ковариацию). Точно так же kk — положительно полуопределённое ядро ровно тогда, когда оно является ковариационной функцией случайной функции: k(x,z)=Cov⁡(F(x),F(z))k(x, z) = \operatorname{Cov}(F(x), F(z)) для гауссовского процесса FF. Ядро говорит, насколько сильно коррелированы значения неизвестной функции в двух входах; это прочтение вернётся в ядерной гребневой регрессии.

Проверять определение напрямую часто трудно, поэтому ядра обычно строят из более простых по правилам, сохраняющим положительную полуопределённость. Если k1k_1 и k2k_2 — ядра, то ядрами являются и:

  • k1+k2k_1 + k_2 и c k1c\, k_1 при c>0c \gt 0: суммы и положительные кратные положительно полуопределённых матриц положительно полуопределены;
  • k1k2k_1 k_2: поэлементное произведение положительно полуопределённых матриц положительно полуопределено (теорема Шура о произведении), или, в терминах признаков, ϕ1⊗ϕ2\phi_1 \otimes \phi_2;
  • g(x)g(z)g(x) g(z) для любой вещественной функции gg: матрица Грама ранга один gg⊤gg^\top;
  • k1(ψ(x),ψ(z))k_1(\psi(x), \psi(z)) для любого отображения ψ\psi;
  • поточечный предел ядер, потому что каждое неравенство ∑cicjk(xi,xj)≥0\sum c_i c_j k(x_i, x_j) \ge 0 сохраняется в пределе.

Поэтому многочлены от ядра с неотрицательными коэффициентами и его экспонента (предел таких многочленов) тоже являются ядрами (Bishop, 2006, §6.2).

Некоторые естественные меры сходства этому не удовлетворяют. У расстояния k(x,z)=∥x−z∥k(x, z) = \lVert x - z\rVert на диагонали матрицы Грама стоят нули, поэтому сумма собственных значений равна следу, 0, и если не все точки совпадают, одно из них отрицательно. Для двух точек 0 и 1 матрица Грама равна (0110)\begin{pmatrix} 0 & 1 \\ 1 & 0\end{pmatrix} с собственными значениями ±1\pm 1. На 50 случайных точках плоскости её наименьшее собственное значение равно −27.5-27.5; «сигмоидное ядро» tanh⁡(⟨x,z⟩+1)\tanh(\langle x, z\rangle + 1) даёт −6.26-6.26, а у RBF-ядра оно остаётся равным 00 с точностью до округления. С такой функцией двойственная задача SVM перестаёт быть вогнутой, и её решение теряет смысл.

Распространённые ядра: полиномиальное и RBF#

Полиномиальное ядро (polynomial kernel) k(x,z)=(⟨x,z⟩+c)pk(x, z) = (\langle x, z\rangle + c)^p с c≥0c \ge 0 раскладывается по формуле бинома в ∑j=0p(pj)cp−j⟨x,z⟩j\sum_{j=0}^p \binom{p}{j} c^{p-j} \langle x, z\rangle^j — неотрицательную комбинацию ядер ⟨x,z⟩j\langle x, z\rangle^j. Его признаки — все одночлены степени не выше pp, причём одночлен x1a1⋯xdadx_1^{a_1} \cdots x_d^{a_d} степени j=a1+⋯+adj = a_1 + \dots + a_d взят с весом (pj)(ja1,…,ad)cp−j\sqrt{\binom{p}{j} \binom{j}{a_1, \dots, a_d} c^{p - j}}, где мультиномиальный коэффициент возникает при раскрытии ⟨x,z⟩j\langle x, z\rangle^j; cc управляет тем, насколько низкие степени весят по сравнению с высокими.

RBF-ядро (гауссовское, radial basis function kernel) равно

k(x,z)=exp⁡(−∥x−z∥22σ2)=e−∥x∥2/(2σ2) e−∥z∥2/(2σ2) e⟨x,z⟩/σ2.k(x, z) = \exp\Big(-\frac{\lVert x - z\rVert^2}{2\sigma^2}\Big) = e^{-\lVert x\rVert^2/(2\sigma^2)}\, e^{-\lVert z\rVert^2/(2\sigma^2)}\, e^{\langle x, z\rangle/\sigma^2} .

Первые два множителя имеют вид g(x)g(z)g(x) g(z), а последний — экспонента ядра, так что по правилам выше это ядро. Его ряд Тейлора содержит ⟨x,z⟩j\langle x, z\rangle^j для каждого jj, поэтому пространство признаков бесконечномерно: никакое явное ϕ\phi не удалось бы сохранить, а kk стоит одного расстояния. У каждой точки ∥ϕ(x)∥2=k(x,x)=1\lVert\phi(x)\rVert^2 = k(x, x) = 1, а квадрат расстояния между двумя точками в пространстве признаков равен k(x,x)+k(z,z)−2k(x,z)=2−2k(x,z)k(x, x) + k(z, z) - 2k(x, z) = 2 - 2k(x, z): RBF-ядро — это мера сходства, убывающая с расстоянием на масштабе σ\sigma. Классификатор f(x)=∑iαiyi k(xi,x)+bf(x) = \sum_i \alpha_i y_i\, k(x_i, x) + b с этим ядром — взвешенное голосование опорных векторов, в котором ближние весят больше всего, гладкий родственник метода ближайших соседей с весами, подобранными максимизацией зазора.

Ширина ядра как смещение и разброс. При большом σ\sigma каждая обучающая точка влияет на всё пространство, и решающая функция почти линейна; при малом σ\sigma каждая точка влияет лишь на ближайшую окрестность, и функция может обогнуть каждую обучающую точку. На двух зашумлённых полумесяцах (600 точек, шум 0.3, половина для теста, C=1C = 1; scikit-learn записывает ядро как e−γ∥x−z∥2e^{-\gamma\lVert x - z\rVert^2}, так что γ=1/(2σ2)\gamma = 1/(2\sigma^2)):

γ\gammaσ\sigmaдоля правильных на обучениидоля правильных на тестеопорных векторов
0.017.070.8430.827198
0.12.240.8830.850125
10.710.9370.88079
100.220.9400.883126
1000.070.9900.857256
10000.021.0000.653299

Линейный SVM достигает 0.8530.853. С очень широким ядром RBF-SVM не лучше прямой; при σ≈0.2\sigma \approx 0.2–0.70.7 он выигрывает три пункта; с очень узким ядром он запоминает обучающую выборку (доля правильных ответов (accuracy) 1, опорными векторами становятся 299 из 300 точек) и падает до 0.6530.653 на тесте. Число опорных векторов минимально там, где доля правильных ответов на тесте максимальна. σ\sigma и CC подбирают вместе кросс-валидацией по логарифмическим сеткам, предварительно стандартизовав признаки, чтобы одно σ\sigma подходило им всем.

Теорема о представителе#

Почему решение SVM имеет вид ∑iαiyiϕ(xi)\sum_i \alpha_i y_i \phi(x_i), с одним коэффициентом на обучающую точку, даже когда ϕ\phi бесконечномерно? Причина не связана именно с кусочно-линейной функцией потерь. Рассмотрим любую регуляризованную задачу

min⁡w ∑i=1nL(yi, ⟨w,ϕ(xi)⟩)+λ∥w∥2,λ>0.\min_{w}\ \sum_{i=1}^n L\big(y_i,\ \langle w, \phi(x_i)\rangle\big) + \lambda \lVert w\rVert^2 ,\qquad \lambda \gt 0 .

Разложим w=w∥+w⊥w = w_\parallel + w_\perp, где w∥w_\parallel лежит в линейной оболочке ϕ(x1),…,ϕ(xn)\phi(x_1), \dots, \phi(x_n), а w⊥w_\perp ортогонален им всем. Предсказания на обучающих точках зависят только от w∥w_\parallel, потому что ⟨w⊥,ϕ(xi)⟩=0\langle w_\perp, \phi(x_i)\rangle = 0, а ∥w∥2=∥w∥∥2+∥w⊥∥2\lVert w\rVert^2 = \lVert w_\parallel\rVert^2 + \lVert w_\perp\rVert^2. Отбрасывание w⊥w_\perp сохраняет функцию потерь и строго уменьшает штраф, если w⊥≠0w_\perp \ne 0, поэтому у любого минимума w⊥=0w_\perp = 0:

w=∑i=1nαiϕ(xi),f(x)=⟨w,ϕ(x)⟩=∑i=1nαi k(xi,x).w = \sum_{i=1}^n \alpha_i \phi(x_i), \qquad f(x) = \langle w, \phi(x)\rangle = \sum_{i=1}^n \alpha_i\, k(x_i, x) .

Это теорема о представителе (representer theorem; Kimeldorf and Wahba, 1971; Schölkopf, Herbrich and Smola, 2001, которые допускают в качестве штрафа любую строго возрастающую функцию от ∥w∥\lVert w\rVert; Shalev-Shwartz and Ben-David, 2014, теорема 16.1). Она превращает поиск в бесконечномерном пространстве в поиск nn коэффициентов и выполняется для любой функции потерь: квадратичной, логистической, кусочно-линейной. После подстановки этого представления ∥w∥2=∑i,jαiαjk(xi,xj)=α⊤Kα\lVert w\rVert^2 = \sum_{i,j} \alpha_i \alpha_j k(x_i, x_j) = \alpha^\top K \alpha, а вектор предсказаний на обучающей выборке равен KαK\alpha.

Ядерная гребневая регрессия#

С квадратичной функцией потерь задача становится гребневой регрессией в пространстве признаков, min⁡w∥y−Φw∥2+λ∥w∥2\min_w \lVert y - \Phi w\rVert^2 + \lambda\lVert w\rVert^2, где строки Φ\Phi — это ϕ(xi)⊤\phi(x_i)^\top. Её решение из заметки о регуляризации можно переписать с помощью тождества Φ⊤(ΦΦ⊤+λI)=(Φ⊤Φ+λI)Φ⊤\Phi^\top(\Phi\Phi^\top + \lambda I) = (\Phi^\top\Phi + \lambda I)\Phi^\top: умножив его слева на (Φ⊤Φ+λI)−1(\Phi^\top\Phi + \lambda I)^{-1} и справа на (ΦΦ⊤+λI)−1(\Phi\Phi^\top + \lambda I)^{-1} (обе матрицы обратимы при λ>0\lambda \gt 0), получаем

w=(Φ⊤Φ+λI)−1Φ⊤y=Φ⊤(ΦΦ⊤+λI)−1y.w = (\Phi^\top \Phi + \lambda I)^{-1}\Phi^\top y = \Phi^\top (\Phi\Phi^\top + \lambda I)^{-1} y .

Левая форма обращает матрицу размера пространства признаков, правая — матрицу размера n×nn \times n, причём ΦΦ⊤=K\Phi\Phi^\top = K. Значит, w=∑iαiϕ(xi)w = \sum_i \alpha_i \phi(x_i) с

α=(K+λI)−1y,f(x)=k(x)⊤(K+λI)−1y,\alpha = (K + \lambda I)^{-1} y, \qquad f(x) = k(x)^\top (K + \lambda I)^{-1} y ,

— это предсказание ядерной гребневой регрессии (kernel ridge regression), в точности в той форме, которую обещала теорема о представителе (Bishop, 2006, §6.1).

Разобранный пример. Две обучающие точки x=0x = 0 и x=1x = 1 с целевыми значениями 11 и 22, RBF-ядро с σ=1\sigma = 1 и λ=0.1\lambda = 0.1. Ядро между точками равно e−1/2=0.6065e^{-1/2} = 0.6065, поэтому

K+λI=(1.10.60650.60651.1),α=(K+λI)−1(12)=(−0.1341.892).K + \lambda I = \begin{pmatrix} 1.1 & 0.6065 \\ 0.6065 & 1.1 \end{pmatrix}, \qquad \alpha = (K + \lambda I)^{-1}\begin{pmatrix} 1 \\ 2\end{pmatrix} = \begin{pmatrix} -0.134 \\ 1.892\end{pmatrix} .

В точке x=0.5x = 0.5 оба значения ядра равны e−1/8=0.8825e^{-1/8} = 0.8825 и f(0.5)=0.8825⋅(−0.134+1.892)=1.551f(0.5) = 0.8825 \cdot (-0.134 + 1.892) = 1.551. В точке x=3x = 3 значения ядра равны e−4.5=0.011e^{-4.5} = 0.011 и e−2=0.135e^{-2} = 0.135, и f(3)=0.255f(3) = 0.255: вдали от данных RBF-регрессор возвращается к 0, своему априорному среднему, каким бы ни был тренд. В самих обучающих точках подгонка равна f(0)=1.013f(0) = 1.013 и f(1)=1.811f(1) = 1.811, а не целевым значениям 11 и 22: при λ>0\lambda \gt 0 подгонка сглаживает, а не интерполирует. Точная интерполяция требует λ=0\lambda = 0 и обратимой KK. В любом случае экстраполяции нет.

Рисунок

Ширина RBF-ядра как сложность модели

Три подгонки гребневой регрессии с ядромТри панели с одними и теми же точками вокруг синусоиды. Слева гладкая пологая кривая проходит мимо пиков, в середине кривая повторяет синусоиду, справа кривая скачет к каждой точке и между ними падает к нулю.σ = 1: слишком широкое ядроdf 2.4 · обучение 0.231 · ошибка 0.181σ = 0.3: в самый разdf 4.4 · обучение 0.039 · ошибка 0.007σ = 0.01: слишком узкое ядроdf 24.3 · обучение 0.004 · ошибка 0.197Три подгонки гребневой регрессии с ядромТри панели с одними и теми же точками вокруг синусоиды. Слева гладкая пологая кривая проходит мимо пиков, в середине кривая повторяет синусоиду, справа кривая скачет к каждой точке и между ними падает к нулю.σ = 1: слишком широкое ядроdf 2.4 · обучение 0.231 · ошибка 0.181σ = 0.3: в самый разdf 4.4 · обучение 0.039 · ошибка 0.007σ = 0.01: слишком узкое ядроdf 24.3 · обучение 0.004 · ошибка 0.197
Гребневая регрессия с RBF-ядром k(x, z) = exp(−(x − z)²/(2σ²)) по 30 зашумлённым точкам кривой sin(2πx) (пунктир), λ = 0.1. Широкое ядро (σ = 1) почти не гнётся: эффективное число параметров df = tr(K(K + λI)⁻¹) = 2.4, кривая недообучена, средний квадрат отклонения от истинной кривой 0.181. При σ = 0.3 (df = 4.4) отклонение падает до 0.007. Узкое ядро (σ = 0.01, df = 24.3 из 30) проходит почти через каждую точку (ошибка на обучении 0.004) и между точками падает к нулю: отклонение снова растёт, до 0.197. Ширина ядра играет роль сложности модели.

Ширина ядра и здесь обменивает смещение на разброс. Эффективное число параметров гребневой подгонки, df=tr⁡(K(K+λI)−1)\mathrm{df} = \operatorname{tr}\big(K(K + \lambda I)^{-1}\big), показывает, сколько направлений использует подгонка (Hastie, Tibshirani and Friedman, 2009, §3.4.1); оно близко к nn, когда подгонка интерполирует, и мало, когда она жёсткая. Для 30 точек рисунка:

σ\sigma10.50.30.20.10.050.020.01
df2.363.314.435.779.2514.6921.6124.26
ошибка на обучении0.2310.0980.0390.0310.0240.0190.0060.004
средний квадрат расстояния до истинной кривой0.1810.0510.0070.0150.0310.0600.1160.197

Ошибка на обучении монотонно падает по мере сужения ядра; средний квадрат расстояния до истинной кривой имеет U-образную форму разложения на смещение и разброс с минимумом около σ=0.3\sigma = 0.3.

Байесовское прочтение. Для конечномерного отображения признаков зададим на весах гауссовское априорное распределение w∼N(0,τ2I)w \sim N(0, \tau^2 I), а на целевых значениях — гауссовский шум с дисперсией s2s^2. Тогда F(x)=⟨w,ϕ(x)⟩F(x) = \langle w, \phi(x)\rangle — гауссовский процесс с ковариацией τ2k(x,z)\tau^2 k(x, z). У RBF-ядра пространство признаков бесконечномерно, и изотропное гауссовское априорное распределение на бесконечном числе весов — лишь формальный предел этой картины; тогда модель задают напрямую: FF — гауссовский процесс с ковариацией τ2k(x,z)\tau^2 k(x, z). В обоих случаях апостериорное среднее F(x)F(x) при данных следует из формулы условного распределения многомерной гауссианы: τ2k(x)⊤(τ2K+s2I)−1y=k(x)⊤(K+λI)−1y\tau^2 k(x)^\top(\tau^2 K + s^2 I)^{-1} y = k(x)^\top (K + \lambda I)^{-1} y с λ=s2/τ2\lambda = s^2/\tau^2. Ядерная гребневая регрессия — это апостериорное среднее регрессии на гауссовских процессах, так же как гребневая регрессия — MAP-оценка при гауссовском априорном распределении (Rasmussen and Williams, 2006, §2.2 и §6.2). Гауссовский процесс добавляет то, чего не хватает гребневому взгляду: апостериорную дисперсию, планку погрешности в каждой точке xx.

Стоимость и случайные признаки Фурье#

Ядерные методы обменивают размерность признаков на число примеров. Вычисление матрицы Грама стоит O(n2d)O(n^2 d) времени и O(n2)O(n^2) памяти, решение (K+λI)α=y(K + \lambda I)\alpha = y стоит O(n3)O(n^3), а солверы SVM на практике масштабируются между O(n2)O(n^2) и O(n3)O(n^3). Каждое предсказание стоит одного вычисления ядра на опорный вектор или обучающую точку. При n=100 000n = 100\,000 одна матрица Грама содержит 101010^{10} элементов, 80 ГБ в двойной точности. Поэтому ядерные методы господствуют на малых и средних данных и проигрывают линейным моделям, деревьям и нейросетям на больших.

Средство Rahimi and Recht (2007) — вернуться к явным признакам, но немногочисленным и случайным. Оно опирается на теорему Бохнера (Bochner’s theorem): непрерывное инвариантное к сдвигу ядро k(x,z)=k(x−z)k(x, z) = k(x - z) с k(0)=1k(0) = 1 положительно полуопределено тогда и только тогда, когда оно является характеристической функцией некоторого распределения вероятностей pp,

k(x−z)=Eω∼p ei⟨ω,x−z⟩=Eω∼pcos⁡⟨ω,x−z⟩k(x - z) = \mathbb E_{\omega \sim p}\, e^{i\langle \omega, x - z\rangle} = \mathbb E_{\omega \sim p} \cos\langle \omega, x - z\rangle

(Rahimi and Recht, §3, теорема 1; вторая форма верна, потому что kk вещественно, так что мнимая часть в среднем равна нулю). Характеристические функции встречались в заметке о математическом ожидании. Для RBF-ядра pp — гауссиана N(0,σ−2I)N(0, \sigma^{-2} I), характеристическая функция которой равна e−∥t∥2/(2σ2)e^{-\lVert t\rVert^2/(2\sigma^2)}. Теперь сгенерируем ω1,…,ωD\omega_1, \dots, \omega_D из pp и b1,…,bDb_1, \dots, b_D равномерно из [0,2π][0, 2\pi] и положим

z(x)=2/D (cos⁡(⟨ω1,x⟩+b1),…,cos⁡(⟨ωD,x⟩+bD)).z(x) = \sqrt{2/D}\,\big(\cos(\langle\omega_1, x\rangle + b_1), \dots, \cos(\langle\omega_D, x\rangle + b_D)\big) .

По формуле 2cos⁡Acos⁡B=cos⁡(A−B)+cos⁡(A+B)2\cos A \cos B = \cos(A - B) + \cos(A + B) каждое слагаемое ⟨z(x),z(x′)⟩\langle z(x), z(x')\rangle равно 1D(cos⁡⟨ωj,x−x′⟩+cos⁡(⟨ωj,x+x′⟩+2bj))\tfrac1D\big(\cos\langle\omega_j, x - x'\rangle + \cos(\langle\omega_j, x + x'\rangle + 2b_j)\big), а второй косинус в среднем по равномерному bjb_j равен нулю. Значит, ⟨z(x),z(x′)⟩\langle z(x), z(x')\rangle — среднее DD независимых слагаемых со средним k(x−x′)k(x - x'): оценка методом Монте-Карло ядра. Каждое слагаемое лежит в [−2,2][-2, 2], и неравенство Хёфдинга даёт P(∣⟨z(x),z(x′)⟩−k(x,x′)∣≥ε)≤2e−Dε2/8P(\lvert\langle z(x), z(x')\rangle - k(x, x')\rvert \ge \varepsilon) \le 2e^{-D\varepsilon^2/8} для каждой пары; Rahimi and Recht (утверждение 1) распространяют оценку сразу на все пары из ограниченного множества ценой множителя, растущего с dd.

Ошибка убывает как 1/D1/\sqrt D. На 300 точках в R5\mathbb R^5 наибольшая ошибка по всей матрице Грама 300×300300 \times 300 равна 1.121.12, 0.340.34, 0.100.10 и 0.0350.035 при D=10D = 10, 100100, 1 0001\,000 и 10 00010\,000 — примерно в 10\sqrt{10} раз на каждом шаге. Любой линейный метод, обученный на z(x)z(x), тогда приближает ядерный метод, а стоит это O(nDd)O(nDd) на признаки и O(nD2)O(nD^2) на гребневую подгонку — линейно по nn. На полумесяцах линейный SVM на D=10D = 10 случайных признаках уже достигает доли правильных ответов на тесте точного RBF-SVM с тем же γ=1\gamma = 1, 0.880.88.

Ядра сравнивают распределения#

Дополнительный материал: ядерные вложения средних и максимальное расхождение средних, которыми пользуется курс генеративных моделей. Остальная часть заметки на него не опирается.

Среднее признаков распределения, μP=EX∼Pϕ(X)\mu_P = \mathbb E_{X \sim P}\phi(X), сводит PP к одной точке пространства признаков, а расстояние между двумя такими точками снова вычисляется одним ядром:

∥μP−μQ∥2=E k(X,X′)+E k(Y,Y′)−2 E k(X,Y),X,X′∼P, Y,Y′∼Q.\lVert \mu_P - \mu_Q\rVert^2 = \mathbb E\, k(X, X') + \mathbb E\, k(Y, Y') - 2\,\mathbb E\, k(X, Y), \qquad X, X' \sim P,\ Y, Y' \sim Q .

Это квадрат максимального среднего расхождения (maximum mean discrepancy, MMD). С полиномиальным ядром оно сравнивает моменты до степени ядра; с RBF-ядром оно равно нулю, только когда P=QP = Q (Gretton et al., 2012). Курс генеративных моделей использует его, чтобы сравнивать сгенерированные изображения с настоящими: Kernel Inception Distance — это та же величина с кубическим полиномиальным ядром на признаках сети.

Что изменилось#

Линейный SVM и гребневая регрессияЯдерные методы
Решающая функция⟨w,x⟩+b\langle w, x\rangle + b, гиперплоскость∑iαik(xi,x)+b\sum_i \alpha_i k(x_i, x) + b, криволинейная по xx
Параметрыdd весовnn коэффициентов, по одному на обучающую точку (теорема о представителе)
Как входят данныевекторы признаковматрица Грама Kij=k(xi,xj)K_{ij} = k(x_i, x_j)
Пространство признаковRd\mathbb R^dлюбое пространство со скалярным произведением, для RBF-ядра бесконечномерное
Ручка сложностиCC или λ\lambdaCC или λ\lambda плюс ядро и его ширина
Стоимость обучениялинейная по nnO(n2)O(n^2) памяти, O(n2)O(n^2)–O(n3)O(n^3) времени; случайные признаки возвращают её к линейной

Ограничения#

  • Квадратичная память, кубическое время. Точные ядерные методы не масштабируются дальше нескольких десятков тысяч примеров; приближения (случайные признаки, метод Нистрёма) жертвуют точностью ради скорости.
  • Ядро — это выбор модели. Оно задаёт, какие входы считаются похожими. RBF-ядро после стандартизации обращается со всеми направлениями одинаково; при многих нерелевантных признаках в расстояниях доминирует шум, как в проклятии размерности из заметки о методе ближайших соседей.
  • Гиперпараметры. Ширина ядра и CC или λ\lambda взаимодействуют, и их нужно подбирать совместно; таблица для полумесяцев показывает долю правильных ответов на тесте от 0.650.65 до 0.880.88 в зависимости от одного только σ\sigma.
  • Нет экстраполяции с локальными ядрами. RBF-подгонка вдали от данных возвращается к нулю, как показал разобранный пример.
  • Фиксированные признаки. Отображение признаков выбирают до того, как увидеть данные. Нейросети вместо этого выучивают признаки, что и позволяет им масштабироваться на изображения и тексты.

Что нужно запомнить#

  • Ядро — это скалярное произведение после отображения признаков, k(x,z)=⟨ϕ(x),ϕ(z)⟩k(x, z) = \langle\phi(x), \phi(z)\rangle. Любой метод, записанный через скалярные произведения, например двойственная задача SVM, работает с kk вместо ⟨x,z⟩\langle x, z\rangle без построения ϕ\phi.
  • kk — допустимое ядро тогда и только тогда, когда все его матрицы Грама симметричны и положительно полуопределены; равносильно, kk — ковариационная функция. Суммы, положительные кратные, произведения, пределы и g(x)g(z)g(x)g(z) сохраняют это свойство; у расстояний и tanh⁡\tanh его нет.
  • Полиномиальное ядро: все одночлены до степени pp. RBF-ядро: бесконечномерные признаки, сходство на масштабе σ\sigma; большое σ\sigma ведёт к недообучению, малое σ\sigma — к переобучению.
  • Теорема о представителе: для любой функции потерь плюс λ∥w∥2\lambda\lVert w\rVert^2 минимум имеет вид ∑iαiϕ(xi)\sum_i \alpha_i \phi(x_i). Ядерная гребневая регрессия: α=(K+λI)−1y\alpha = (K + \lambda I)^{-1}y, f(x)=k(x)⊤αf(x) = k(x)^\top \alpha — апостериорное среднее гауссовского процесса.
  • Точные ядерные методы стоят O(n2)O(n^2) памяти и до O(n3)O(n^3) времени. Случайные признаки Фурье оценивают инвариантное к сдвигу ядро методом Монте-Карло с ошибкой O(1/D)O(1/\sqrt D) и делают обучение линейным по nn.

Код#

Полиномиальное ядро как скалярное произведение, матрицы Грама, которые положительно полуопределены и которые нет, ядерная гребневая регрессия вручную, ширина RBF-ядра на полумесяцах и случайные признаки Фурье:

import numpy as np, math
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC, LinearSVC
from sklearn.kernel_ridge import KernelRidge
from sklearn.kernel_approximation import RBFSampler

# ядро — это скалярное произведение после отображения признаков: (x.z)^2 при phi(x) = (x1^2, sqrt(2) x1 x2, x2^2)
x, z = np.array([1.0, 2.0]), np.array([3.0, 1.0])
phi = lambda v: np.array([v[0]**2, math.sqrt(2) * v[0] * v[1], v[1]**2])
print((x @ z)**2, phi(x) @ phi(z), math.comb(100 + 3, 3))   # 25.0 25.0 176851: одночлены степени <= 3 от 100 признаков

# какие функции являются ядрами: наименьшее собственное значение матрицы Грама на 50 случайных точках
rng = np.random.default_rng(0)
P = rng.normal(size=(50, 2)); D2 = ((P[:, None] - P[None]) ** 2).sum(-1)
for name, G in (('rbf', np.exp(-D2 / 2)), ('distance', np.sqrt(D2)), ('tanh', np.tanh(P @ P.T + 1))):
    print(name, f'{np.linalg.eigvalsh(G).min():.3g}')
# rbf 4.24e-10 | distance -27.5 | tanh -6.26: положительно полуопределена только матрица Грама RBF-ядра

# ядерная гребневая регрессия вручную: x = (0, 1), y = (1, 2), RBF с sigma = 1, lambda = 0.1
X = np.array([[0.0], [1.0]]); y = np.array([1.0, 2.0])
k = lambda A, B: np.exp(-(A - B.T) ** 2 / 2)
alpha = np.linalg.solve(k(X, X) + 0.1 * np.eye(2), y)
Xn = np.array([[0.5], [3.0]])
print(alpha.round(4), (k(Xn, X) @ alpha).round(4))     # [-0.1343  1.8922] [1.5514 0.2546]
print((k(X, X) @ alpha).round(3))                      # [1.013 1.811]: подгонка в обучающих точках, а не (1, 2)
print(KernelRidge(alpha=0.1, kernel='rbf', gamma=0.5).fit(X, y).predict(Xn).round(4))   # [1.5514 0.2546]

# ширина RBF-ядра как смещение и разброс: SVM на двух зашумлённых полумесяцах, gamma = 1/(2 sigma^2)
Xm, ym = make_moons(n_samples=600, noise=0.3, random_state=0)
Xtr, Xte, ytr, yte = train_test_split(Xm, ym, test_size=0.5, random_state=0)
print('linear', round(SVC(kernel='linear').fit(Xtr, ytr).score(Xte, yte), 3))   # linear 0.853
for g in (0.01, 0.1, 1, 10, 100, 1000):
    m = SVC(kernel='rbf', gamma=g, C=1).fit(Xtr, ytr)
    print(g, round(1 / math.sqrt(2 * g), 3), round(m.score(Xtr, ytr), 3), round(m.score(Xte, yte), 3), len(m.support_))
# gamma, sigma, доля правильных на обучении и на тесте, опорные векторы
# 0.01 7.071 0.843 0.827 198 | 0.1 2.236 0.883 0.85 125 | 1 0.707 0.937 0.88 79
# 10 0.224 0.94 0.883 126    | 100 0.071 0.99 0.857 256 | 1000 0.022 1.0 0.653 299

# случайные признаки Фурье: наибольшая ошибка по матрице Грама 300 x 300 (5 признаков, gamma = 0.1), среднее по 5 генерациям
Q = rng.normal(size=(300, 5)); K = np.exp(-0.1 * ((Q[:, None] - Q[None]) ** 2).sum(-1))
for D in (10, 100, 1000, 10000):
    err = [np.abs((Z := RBFSampler(gamma=0.1, n_components=D, random_state=s).fit_transform(Q)) @ Z.T - K).max() for s in range(5)]
    print(D, round(float(np.mean(err)), 3))
# 10 1.118 | 100 0.343 | 1000 0.101 | 10000 0.035: примерно 1/sqrt(D)

# линейный SVM на D случайных признаках приближается к RBF-SVM (gamma = 1: доля правильных на тесте 0.88)
for D in (2, 10, 100, 1000):
    f = RBFSampler(gamma=1, n_components=D, random_state=0).fit(Xtr)
    print(D, round(LinearSVC(C=1).fit(f.transform(Xtr), ytr).score(f.transform(Xte), yte), 3))
# 2 0.663 | 10 0.883 | 100 0.88 | 1000 0.877

Дальше#

SVM и его ядра разделяют два класса. Во многих задачах их больше: десять цифр, тысячи тем, словарь из десятков тысяч слов или несколько меток сразу у одного объекта. Следующая заметка сводит такие задачи к бинарным, обобщает логистическую регрессию на много классов с помощью softmax и приспосабливает метрики из заметки о метриках классификации к нескольким классам и к нескольким меткам на пример.

Литература#

  • B. E. Boser, I. M. Guyon, V. N. Vapnik. A Training Algorithm for Optimal Margin Classifiers. COLT, 1992, pp. 144–152. Ядерный трюк в классификаторе с максимальным зазором.
  • N. Aronszajn. Theory of Reproducing Kernels. Transactions of the American Mathematical Society, 68(3), pp. 337–404, 1950.
  • G. Kimeldorf, G. Wahba. Some Results on Tchebycheffian Spline Functions. Journal of Mathematical Analysis and Applications, 33(1), pp. 82–95, 1971. Теорема о представителе для квадратичной функции потерь.
  • B. Schölkopf, R. Herbrich, A. J. Smola. A Generalized Representer Theorem. COLT, LNCS 2111, pp. 416–426, 2001.
  • A. Rahimi, B. Recht. Random Features for Large-Scale Kernel Machines. NIPS, 2007. §3: теорема Бохнера (теорема 1), случайные признаки Фурье (алгоритм 1), равномерная сходимость (утверждение 1).
  • A. Gretton, K. M. Borgwardt, M. J. Rasch, B. Schölkopf, A. Smola. A kernel two-sample test. JMLR, 13, pp. 723–773, 2012. Максимальное среднее расхождение.
  • C. E. Rasmussen, C. K. I. Williams. Gaussian Processes for Machine Learning. MIT Press, 2006. §2.1–2.2 (регрессия в пространстве весов и в пространстве функций), §4.3 (анализ ядер через собственные функции, теорема Мерсера), §6.1–6.2 (гильбертовы пространства с воспроизводящим ядром, регуляризация).
  • S. Shalev-Shwartz, S. Ben-David. Understanding Machine Learning: From Theory to Algorithms. Cambridge University Press, 2014. Глава 16: вложения в пространства признаков, ядерный трюк, теорема 16.1 (теорема о представителе), лемма 16.2 (положительно полуопределённые ядра).
  • C. M. Bishop. Pattern Recognition and Machine Learning. Springer, 2006. §6.1 (двойственные представления), §6.2 (построение ядер), §6.4 (гауссовские процессы).
  • T. Hastie, R. Tibshirani, J. Friedman. The Elements of Statistical Learning, 2nd ed. Springer, 2009. §3.4.1 (гребневая регрессия и её эффективное число степеней свободы), §5.8 (регуляризация и гильбертовы пространства с воспроизводящим ядром), §12.3 (SVM и ядра).
  • E. Sokolov et al. Машинное обучение (HSE), конспекты лекций: лекция 13 (ядерные методы, построение ядер, полиномиальное и гауссовское ядра), лекция 14 (ядерный SVM, случайные признаки Фурье).