Skip to content

Лекція 07 · Опорно-векторні машини та ядрові методи ​

У лекції 05 ми навчилися проводити межу між класами й оцінювати ймовірність. Сьогодні поставимо жорсткіше питання: серед усіх допустимих меж знайти найнадійнішу — і навчимося робити межу нелінійною, не додаючи жодної нової ознаки вручну.

Зміст лекції ​

Лекція йде від геометрії однієї прямої до методу, який працює в нескінченновимірному просторі ознак.

  1. Максимальний відступ. Гіперплощина, ширина коридору між класами, опорні вектори.
  2. М'який відступ. Слекові змінні, hinge-втрата, параметр C і компроміс «ширина проти помилок».
  3. Двоїста задача. Змінні α, розрідженість розв'язку і головне відкриття: дані входять у задачу лише через попарні скалярні добутки.
  4. Ядровий трюк. Простір ознак, ядро як міра схожості, умова Мерсера, каталог ядер.
  5. Налаштування ядрової SVM. RBF-ядро, спільний підбір C і gamma, наскрізний приклад на медичних даних.
  6. Ядрова регресія. Теорема про представлення, kernel ridge regression і SVR.

Кожен блок відкриває наступний: двоїста задача потрібна не сама по собі, а тому, що саме з неї виростає ядровий трюк.

Чого ви навчитеся ​

Після цієї лекції ви зможете:

  • пояснити, чому серед усіх роздільних прямих SVM обирає ту, що максимізує відстань до найближчих точок;
  • зв'язати ширину коридору з нормою вектора ваг і записати задачу hard-SVM;
  • пояснити роль слекових змінних і показати, що soft-SVM — це мінімізація hinge-втрати з ridge-регуляризацією;
  • передбачити, як зміняться відступ, кількість опорних векторів і якість моделі при зміні C;
  • пояснити, чому двоїста задача залежить від даних лише через матрицю попарних скалярних добутків;
  • обчислити значення ядра двома способами — напряму й через явне відображення ознак — і переконатися, що вони збігаються;
  • обрати ядро під форму даних та підібрати C і gamma перехресною перевіркою;
  • назвати ситуації, у яких ядрова SVM непридатна, і пояснити чому.

Два сурогати однієї втрати: місток із лекції 05 ​

У лекції 05 ми вже бачили ключову картину: справжня мета класифікації — мінімізувати нуль-одиничну втрату, тобто частку помилок, але вона розривна й неопукла. Тому мінімізують опуклу верхню оцінку — сурогатну втрату (surrogate loss), і вибір цієї оцінки визначає метод.

Перехресна ентропія веде до логістичної регресії: модель віддає ймовірність і карається за кожну недостатньо впевнену відповідь, навіть правильну. Hinge-втрата веде до методу опорних векторів: щойно точка класифікована правильно й із запасом, штраф стає рівно нулем, і модель перестає нею цікавитися.

Саме з цієї байдужості до «легких» точок виростає весь сьогоднішній метод: у розв'язку залишаються тільки ті спостереження, що лежать біля межі.

Перехресна ентропіяHinge-втрата
Формулаlog⁡(1+e−yf)max(0, 1−yf)
Штраф за впевнено правильну точкумалий, але ніколи не нульрівно нуль
Що дає модельймовірність класутільки бік межі
Які точки впливають на розв'язокусілише ті, що ближче за відступ
Метод, який із неї виростаєлогістична регресіяопорно-векторна машина

Графік обох функцій поруч із нуль-одиничною втратою — у розділі «Функції втрат, придатні для класифікації» лекції 05.

Дані лекції: розміри пелюсток трьох сортів ірисів ​

Геометрію відступу найкраще видно на двох ознаках, тому основний приклад лекції — класичний набір Iris: 150 квіток, по 50 кожного з трьох сортів, для кожної виміряно довжину й ширину чашолистка та пелюстки в сантиметрах. Беремо дві ознаки — довжину й ширину пелюстки — і передбачаємо сорт.

Ліворуч видно, що сорт setosa відділяється від решти з великим запасом, а versicolor і virginica частково перекриваються. Це дві різні задачі: для першої існує ідеальна пряма, для другої — ні. Спершу розв'яжемо легку, потім навчимося жити з важкою.

iris petal features three species and the overlapping pair

Джерело даних: UCI Machine Learning Repository · Iris

Роздільних прямих багато, надійна серед них одна ​

Візьмімо легку задачу: setosa проти versicolor. Між класами лежить порожня смуга, і будь-яка пряма, що проходить крізь неї, розділяє тренувальні дані без жодної помилки. Ліворуч намальовано шість таких прямих — усі мають однакову нульову похибку на навчанні.

Проте вони не рівноцінні. Пряма, що майже торкається квітки, розсипається від найменшого шуму у вимірюванні: трохи інша пелюстка — і точка опиняється не з того боку. Пряма, що йде серединою смуги, витримує таке зміщення.

Метод опорних векторів (support vector machine, SVM) формалізує цю інтуїцію: серед усіх роздільних гіперплощин обираємо ту, навколо якої залишається найширший вільний коридор. На цих даних його ширина — 1,30 см, а тримається він лише на двох квітках.

many separating lines versus the maximum margin one on iris

Опорно-векторні мережі: стаття 1995 року ​

Метод у сучасному вигляді описали Корінна Кортес і Володимир Вапнік. Їхня стаття вводить одразу дві речі, які ми розберемо сьогодні: нелінійне відображення у високовимірний простір ознак і розширення методу на дані, які не розділяються без помилок.

"The support-vector network is a new learning machine for two-group classification problems. The machine conceptually implements the following idea: input vectors are non-linearly mapped to a very high-dimension feature space. In this feature space a linear decision surface is constructed." — Cortes C., Vapnik V., 1995

Українською: класифікатор нелінійно переносить входи у простір дуже високої розмірності й будує там лінійну розділяльну поверхню. Уся складність ховається у відображенні, сам класифікатор залишається лінійним — і саме тому задача лишається опуклою.

Джерело: Cortes C., Vapnik V. Support-vector networks. Machine Learning, 20, 273–297 (1995)

Гіперплощина і відстань до неї ​

Мітки в SVM зручно кодувати як y∈{−1,+1}: тоді добуток мітки на прогноз одразу каже, чи вгадала модель.

Розділяльна поверхня — гіперплощина (hyperplane): у двох вимірах пряма, у трьох площина, у D вимірах — підпростір розмірності D−1. Прогноз залежить лише від знака:

f(x)=sign(w⊤x+w0),dist(x0)=|w⊤x0+w0|∥w∥
ПозначенняЗначення
wнормаль до гіперплощини, задає її нахил
w0зсув: наскільки площина відсунута від початку координат
yn∈{−1,+1}мітка n-го спостереження
|w|довжина вектора ваг, нормує відстань

Формула відстані — це теорема Піфагора: беремо проєкцію точки на напрям w. Слайди EPFL записують її коротше, |w⊤x0|, бо там гіперплощина проходить через початок координат і ∥w∥=1; ми залишаємо зсув, як це роблять усі бібліотеки.

Відступ — це відстань до найближчої точки ​

Відступ (margin) гіперплощини — найменша відстань від неї до тренувальної точки. Не середня і не типова, а саме найменша: одна квітка, що підійшла впритул, визначає весь відступ, хай би як далеко лежала решта.

На рисунку суцільна лінія — межа рішення, дві штрихові — межі коридору, а обведені точки лежать точно на них. Пересунути суцільну лінію хоч трохи вгору або вниз означає звузити коридор.

M(w,w0)=minn≤N|w⊤xn+w0|∥w∥

Правило hard-SVM обирає таку гіперплощину, для якої це мінімальне значення найбільше з можливих. Звідси й назва — класифікатор із максимальним відступом.

maximum margin separating hyperplane with support vectors circled

Джерело: scikit-learn · SVM: Maximum margin separating hyperplane

Максимізація відступу — це мінімізація норми ваг ​

Максимізувати мінімум відстаней незручно. Але задача має приховану симетрію: якщо помножити w і w0 на будь-яке додатне число, гіперплощина не зміниться. Скористаємося цією свободою й зафіксуємо масштаб так, щоб найближчі точки давали рівно одиницю. Тоді задача стає простою й опуклою:

minw,w0 12∥w∥2за умови yn(w⊤xn+w0)≥1  для всіх n

За такої нормалізації відступ дорівнює M=1/∥w∥, а ширина всього коридору — 2/∥w∥. Чим коротший вектор ваг, тим ширший коридор: «максимізувати відступ» і «мінімізувати норму» — це буквально одна задача.

Числовий приклад із попереднього рисунка: для setosa проти versicolor оптимальний ∥w∥=1,53, звідси коридор 2/1,53=1,30 см. Задача опукла й має єдиний розв'язок — на відміну від нейронних мереж, тут не буває невдалої ініціалізації.

Розв'язок тримається лише на опорних векторах ​

Опорні вектори (support vectors) — це точки, що лежать на межах коридору або порушують їх. Решта спостережень у розв'язок не входять зовсім, і це легко перевірити експериментом.

Ліворуч SVM навчено на всіх 100 квітках, праворуч — лише на двох опорних векторах, які знайшла перша модель. Межа збіглася: максимальна різниця коефіцієнтів становить 7,3⋅10−9, зсуву — 2,1⋅10−8, тобто на рівні похибки округлення. Дев'яносто вісім викинутих квіток не змінили нічого.

Практичний наслідок подвійний. З одного боку, модель компактна: щоб робити прогнози, достатньо зберігати опорні вектори. З іншого — вона вразлива: помилка у вимірюванні однієї прикордонної точки зсуває всю межу, тоді як груба помилка в далекій точці не робить нічого.

identical svm boundary trained on all points and on support vectors only

Реальні класи перекриваються: м'який відступ ​

Друга пара сортів, versicolor проти virginica, ідеальної прямої не має: у зоні перекриття лежать квітки обох класів. Жорстка вимога yn(w⊤xn+w0)≥1 для всіх точок тут просто не має розв'язку — задача несумісна.

Soft-SVM послаблює вимогу: кожній точці дозволено порушити межу коридору, але за плату. На рисунку обведено 23 квітки, які залізли в коридор або перейшли на чужий бік; п'ять із них класифіковано неправильно. Решта 77 лежать за коридором і на межу не впливають.

Зверніть увагу: порушників 23, а помилок лише 5. Більшість «порушників» класифіковано правильно — вони просто підійшли до межі ближче, ніж на одиницю відступу. Це і є ціна ширшого коридору.

soft margin svm on overlapping iris species with slack points marked

Слекові змінні вимірюють глибину порушення ​

Формально до кожного обмеження додається власна слекова змінна (slack variable) ξn≥0 — наскільки саме точка порушила вимогу. Сума порушень входить у цільову функцію зі штрафом:

minw,w0,ξ λ2∥w∥2+1N∑n=1Nξnза умови yn(w⊤xn+w0)≥1−ξn,  ξn≥0

Значення ξn читається геометрично: ξn=0 — точка чесно за коридором; 0<ξn≤1 — точка всередині коридору, але з правильного боку; ξn>1 — точка перейшла межу рішення, тобто класифікована помилково. У сантиметрах глибина порушення дорівнює ξn/∥w∥.

Для рисунка вище сума всіх слеків становить 13,6 при ста спостереженнях. Параметр λ визначає, наскільки дорого обходиться ця сума; до нього ми ще повернемося.

Hinge-втрата обнуляється, щойно точка впевнено правильна ​

Слекові змінні можна виключити з задачі. При фіксованих вагах оптимальне значення ξn обчислюється явно: це [1−ηn]+, де ηn=yn(w⊤xn+w0) — функційний відступ (functional margin) точки. Підставивши це назад, отримуємо задачу без обмежень.

На графіку добре видно, чим hinge відрізняється від сусідів. Квадратична втрата має мінімум у точці η=1 і знову зростає праворуч від неї — карає навіть «надто правильні» точки. Логістична спадає, але ніколи не досягає нуля, тому кожне спостереження назавжди залишається в розв'язку. Hinge при η≥1 дорівнює точно нулю: при η=2 логістична втрата ще становить 0,127, квадратична — 1,0, а hinge — рівно 0.

hinge logistic squared and zero one losses versus functional margin

Soft-SVM — це hinge-втрата плюс ridge-регуляризація ​

Після підстановки слеків задача набуває форми, знайомої з лекції 03: середня втрата плюс штраф за довжину вектора ваг.

minw,w0 1N∑n=1N[1−yn(w⊤xn+w0)]++λ2∥w∥2,[z]+=max{0,z}

Тобто SVM — це не окремий алгоритм із власною філософією, а звичайна мінімізація емпіричного ризику, у якій обрано конкретну функцію втрат. Регуляризатор тут виконує подвійну роботу: він і стримує ваги від розбігання, і, оскільки M=1/∥w∥, безпосередньо розширює коридор.

Одна практична незручність: hinge має злам у точці η=1 і в ній не диференційовна. Тому первинну задачу розв'язують субградієнтним методом, а не звичайним градієнтним спуском.

Параметр C — та сама задача в іншій параметризації ​

Бібліотеки записують soft-SVM інакше: штраф ставлять не перед нормою ваг, а перед сумою порушень.

minw,w0,ξ 12∥w∥2+C∑n=1Nξn

Це та сама задача: домноживши форму з попереднього розділу на 1/λ, отримуємо C=1/(λN). Саме таке означення дає Bishop у PRML, §7.1. Отже, велике C — слабка регуляризація, вузький коридор і мало порушень; мале C — сильна регуляризація, широкий коридор і багато порушників.

На рисунку — той самий набір даних при C=1 і C=100. Праворуч коридор помітно вужчий, а обведених опорних векторів менше: модель майже не дозволяє порушень і притискає межу до найближчих точок.

linearsvc support vectors for two values of the C parameter

Джерело: scikit-learn · Plot the support vectors in LinearSVC

Вплив C на реальних даних: діагностика пухлин ​

Перевіримо це на другому наборі лекції. Breast Cancer Wisconsin (Diagnostic): 569 пункційних біопсій, 30 числових ознак, обчислених із зображення (радіус, текстура, периметр, площа ядер клітин та інші), передбачаємо діагноз — доброякісна пухлина чи злоякісна. Навчальна частина — 398 спостережень, ознаки стандартизовано, ядро лінійне.

Ліва панель показує обіцяну залежність без винятків: при C=0,001 у розв'язку 195 опорних векторів із 398, при C=1000 — лише 24. Права панель додає те, чого не видно з геометрії: точність на навчальній вибірці зростає до одиниці, а на перехресній перевірці спершу піднімається до 0,985 при C≈0,32, а потім падає до 0,937. Це класичне перенавчання — надто вузький коридор запам'ятовує шум.

number of support vectors and accuracy versus C on breast cancer

Джерело даних: UCI · Breast Cancer Wisconsin (Diagnostic)

Дисбаланс класів зсуває межу до меншого класу ​

Ще одна пастка, помітна саме в геометрії відступу. Якщо один клас представлено сотнями точок, а другий — десятками, сумарний штраф C∑ξn автоматично більший з боку великого класу. Оптимізатору вигідно посунути межу вбік меншого класу: так він порушить обмеження кількох рідкісних точок замість багатьох частих.

На рисунку близько тисячі точок великого класу і сотня — рідкісного. Чорна лінія — звичайна SVM: вона проходить крізь рідкісний клас і віддає більшу його частину сусідові. Червона — та сама модель із class_weight="balanced", яка множить C для кожного класу на величину, обернену до його частоти. Її межа зсунута вглиб великого класу, і рідкісні точки нарешті опиняються на своєму боці.

Це та сама проблема, що й у лекції 05 при виборі порога, тільки розв'язується вона не після навчання, а всередині цільової функції.

svm decision boundary with and without class weights on unbalanced data

Джерело: scikit-learn · SVM: Separating hyperplane for unbalanced classes

Код: лінійна SVM з нуля на субградієнтному спуску ​

Двадцять п'ять рядків numpy, щоб було видно: всередині немає нічого, крім формули з попередніх розділів.

Вивід код запущено, вивід не редагувався
text
крок    0   цільова функція 1.0000
крок  500   цільова функція 0.0193
крок 1000   цільова функція 0.0132
крок 1500   цільова функція 0.0117
крок 2000   цільова функція 0.0117

На що дивитися: цільова функція падає з 1,0 до 0,0117 і після 1500 кроків уже не змінюється — спуск зійшовся.

Знайдений напрям w=(0,994; 0,839). Якщо окремо навчити SVC(kernel="linear", C=1/(lam*len(y))) і порівняти напрями, косинус між ними дорівнює 0,991 — тобто наші двадцять п'ять рядків знайшли практично ту саму гіперплощину, що й бібліотека.

Двоїста задача: ті самі ваги через змінні альфа ​

Первинну задачу можна переписати відносно нових змінних αn∈[0,1] — по одній на кожне спостереження. Ключ до перетворення простий: [z]+=maxα∈[0,1]αz, після чого мінімум і максимум міняються місцями (це законно, бо функція опукла по w й угнута по α).

maxα∈[0,1]N 1Nα⊤1−12λN2α⊤YXX⊤⏟KYα,w(α)=1λN∑n=1Nαnynxn

Тут Y=diag(y), а K=XX⊤ — матриця розміру N×N, у якій на перетині рядка i та стовпця j стоїть скалярний добуток xi⊤xj. Запис вище відповідає моделі без окремого нерегуляризованого зсуву; щойно такий зсув з'являється, мінімізація по ньому додає до задачі рівність ∑nαnyn=0.

Прочитайте останню формулу уважно: дані входять у задачу тільки через K. Кількість ознак D у ній не з'являється взагалі. Це і є двері, крізь які за кілька розділів увійде ядровий трюк.

Значення альфа розказує, де лежить точка ​

Оптимальне αn повністю визначається положенням точки відносно коридору, і навпаки.

Положення точки xn1−yn(w⊤xn+w0)αn
правильний бік, за коридором<00
точно на межі коридору=0будь-яке з [0,1]
усередині коридору або на чужому боці>01

Опорні вектори — це рівно точки з αn>0. Оскільки w є їхньою зваженою сумою, точки з αn=0 у формулі просто зникають — саме це ми й побачили в експерименті з двома квітками.

Двоїста форма зручна ще й обчислювально: вона гладка й угнута, тому її розв'язують квадратичними солверами або координатним підйомом, без проблем зі зламом hinge. А розрідженість α означає, що готова модель зберігає лише невелику частку навчальних даних.

Ознаки, яких немає в даних, можна дорахувати ​

Поки що межа завжди була прямою. Але прямою вона є лише в тому просторі, де ми працюємо, — а простір можна змінити.

Ліворуч — одновимірні дані, розмічені за правилом «близько до нуля — один клас, далеко — інший». Жоден поріг на прямій їх не розділить: обидва боки нуля змішані. Праворуч до кожної точки дописано другу координату x2. Точки лягли на параболу, і тепер їх ідеально розділяє горизонтальна пряма x2=16.

ϕ(x)=(x, x2):R→R2

Функцію ϕ називають відображенням у простір ознак (feature map). Головне: задача не стала складнішою — вона залишилася лінійною, просто в іншому просторі. Нелінійна межа у вихідному просторі — це лінійна межа у просторі ознак.

one dimensional data becomes separable after adding the squared coordinate

Той самий прийом у двох вимірах: підйом угору ​

Той самий трюк працює й на реальніших формах. Ліворуч — 220 точок, згенерованих як два концентричні кільця (make_circles). Класи розділені ідеально, але не прямою: лінійна SVM дає 59 % правильних відповідей, тобто ледве краще за монетку.

Праворуч до кожної точки дописано третю координату ϕ3=x12+x22, тобто квадрат відстані до центра. Внутрішнє ядро опустилося вниз, зовнішнє кільце піднялося вгору, і між ними тепер проходить звичайна горизонтальна площина ϕ3=0,54. Класифікатор у просторі ознак лінійний; коли ми проєктуємо його межу назад у площину, вона перетворюється на коло.

Проблема лише одна, і вона обчислювальна: у справжніх задачах потрібне відображення набагато більшої розмірності, і будувати його явно надто дорого.

circles dataset lifted into a third dimension where a plane separates it

Ядровий трюк: скалярний добуток без побудови ознак ​

Тут і спрацьовує головна ідея. Двоїста задача потребує не самих векторів ознак, а лише їхніх попарних скалярних добутків. Отже, якщо вміти рахувати добуток ϕ(x)⊤ϕ(x′) безпосередньо, саме ϕ будувати не треба.

Ядро (kernel) — це функція двох аргументів, що повертає таке саме число, як скалярний добуток у просторі ознак: κ(x,x′)=ϕ(x)⊤ϕ(x′). Перевіримо на прикладі x=(1,2), x′=(3,1) і квадратичному ядрі.

Вивід код запущено, вивід не редагувався
text
ядро напряму      : 25
phi(x), phi(x')   : [1.    2.828 4.   ] [9.    4.243 1.   ]
скалярний добуток : 25.0

На що дивитися: обидва шляхи дають 25: ядро обчислює той самий скалярний добуток, не будуючи тривимірних векторів.

Ліворуч — один скалярний добуток і піднесення до квадрата; праворуч — побудова двох тривимірних векторів. Для степеня p і D ознак різниця стає катастрофічною: O(D) проти O(Dp).

Матриця ядра — це таблиця схожості всіх з усіма ​

Ядро зручно уявляти як міру схожості. Матриця K розміру N×N збирає значення κ(xi,xj) для всіх пар спостережень — це і є єдине, що алгоритм знає про дані.

На рисунку обидві матриці побудовані на всіх 150 квітках Iris за чотирма стандартизованими ознаками; спостереження впорядковано за сортом, тому блоки на діагоналі — це «свої зі своїми». Ліворуч лінійне ядро: значення можуть бути від'ємними, і зчитати структуру важче. Праворуч RBF-ядро: значення лежать у [0,1], три блоки видно неозброєним оком. Середня схожість усередині сорту становить 0,66, а між setosa і virginica — лише 0,02.

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

linear and rbf kernel matrices of iris sorted by species

Не будь-яка функція схожості є ядром ​

Ядром може бути не всяка симетрична функція. Критерій дає умова Мерсера (Mercer's condition): функція κ є ядром тоді й лише тоді, коли вона симетрична й будь-яка складена з неї матриця K додатно напіввизначена.

Контрприклад корисно тримати в голові. Візьмімо «схожість» κ(x,x′)=∥x−x′∥. Для двох точок на відстані d матриця має вигляд (0dd0), її власні значення дорівнюють +d і −d, тобто вона не є додатно напіввизначеною. Ядром ця функція не є, і жодного ϕ для неї не існує.

Нові ядра будують із наявних: якщо κ1 і κ2 — ядра, то ядрами будуть і ακ1+βκ2 при α,β≥0, і добуток κ1⋅κ2. Відображення для суми — конкатенація [αϕ1; βϕ2], для добутку — усі попарні добутки координат.

Каталог ядер і простори, які вони задають ​

Три ядра покривають переважну більшість практичних задач.

ЯдроФормулаПростір ознак
лінійнеx⊤x′вихідний, розмірність D
поліноміальне степеня p(1+x⊤x′)pусі одночлени до степеня p, розмірність (D+pp)
RBF (гаусове)exp(−|x−x′|22σ2)нескінченновимірний

Поліноміальне ядро при D=10 і p=3 відповідає простору з 286 ознак, при p=5 — з 3003; рахувати їх явно не потрібно жодного разу. RBF відповідає нескінченновимірному відображенню, яке отримують розкладом експоненти в ряд Тейлора, — і його одне обчислення все одно коштує O(D).

Ядра існують і для нечислових даних: string kernel вимірює схожість рядків за спільними підпослідовностями, і SVM працює з текстом, не перетворюючи його на вектор.

RBF-ядро: параметр gamma задає радіус впливу ​

RBF — ядро за замовчуванням у більшості бібліотек, тому його параметр варто розуміти точно. У scikit-learn замість σ2 пишуть gamma, і зв'язок такий: γ=1/(2σ2), тобто κ(x,x′)=exp⁡(−γ∥x−x′∥2).

Графік показує, як швидко спадає схожість із відстанню. При γ=0,1 дві точки на відстані 1,0 усе ще схожі на 0,90 — кожне спостереження впливає далеко навколо себе, і межа виходить гладкою. При γ=10 та сама схожість дорівнює 4,5⋅10−5 — точка «бачить» лише найближчих сусідів, і межа розпадається на острівці навколо окремих спостережень.

Звідси правило: завелике gamma — це перенавчання, замале — недонавчання. Значення gamma="scale" у scikit-learn обчислюється як 1/(D⋅Var[X]) і є розумною відправною точкою, а не оптимумом.

rbf kernel value as a function of distance for three gamma values
Що робить gamma — і що з цього виходить
Ліворуч саме ядро: як швидко спадає схожість двох точок із відстанню. Посередині — карта якості по всій сітці C × gamma, клітинки клікабельні. Праворуч — межа рішень на тих самих двох півмісяцях, що в коді лекції.
схожість κ(r) = exp(−γ r²)
101,0відстань між точками
карта якості на сітці C × gamma
0.11101000.10.5151050gammaC
межа рішень на двох півмісяцях
0,007схожість на відстані 1,0
90опорних векторів із 195
0,938точність на навчальних
0,905точність на відкладених

Поставте C = 1 і γ = 0,1: схожість на відстані 1,0 дорівнює 0,90 — кожна точка впливає далеко навколо себе, межа виходить майже прямою, і модель недонавчається: 0,877 на навчальних і 0,848 на відкладених. Тепер γ = 50: схожість падає практично до нуля, межа розпадається на острівці навколо окремих спостережень, навчальна точність злітає до 0,990, а відкладена лишається 0,886 — перенавчання видно просто в цих двох числах. Далі зафіксуйте γ = 0,5 і посуньте C: він керує не радіусом, а ціною порушення відступу, тому змінює межу інакше — і кількість опорних векторів разом із нею, від 116 при C = 0,1 до 38 при C = 100. Саме тому ці два параметри підбирають спільно, сіткою, а не по черзі.

Карта посередині показує це відразу для всіх двадцяти чотирьох пар. Світлі клітинки не збираються в одну точку, а лягають діагоналлю: C = 100 з gamma = 0,1 дає 0,933, C = 10 з gamma = 0,5 — найкращі 0,943, C = 1 з gamma = 0,5 — знову 0,933. Уздовж цієї смуги добуток C·gamma тримається приблизно сталим: більший радіус впливу компенсується суворішим штрафом. Клітинка C = 1, gamma = 0,5 — це рівно той рядок, який друкує код розділу про порівняння ядер: gamma="scale" на стандартизованих даних дорівнює 1/(2·1), тобто 0,5, і віджет дає ті самі 0,933 при 66 опорних векторах із 195. Зелений кружок стоїть на 0,943, але дві сусідні клітинки дають 0,933, а цілий стовпчик при gamma = 1 — по 0,924, і різниця між ними менша за розкид між фолдами. Практичний висновок той самий, що в тексті розділу: сітку беруть логарифмічну, а всередині світлої смуги за третій знак не воюють. Клацніть по кутах карти: лівий верхній (мале gamma, велике C) дає майже пряму межу з 53 опорними векторами, правий нижній (велике gamma, мале C) — 0,495, тобто чисте вгадування, і всі 195 навчальних точок стають опорними: модель запам'ятала кожну й не навчилася нічого.

Ядро задає форму межі, алгоритм не змінюється ​

У двоїстій задачі досить замінити xi⊤xj на κ(xi,xj) — і той самий солвер починає будувати нелінійну межу. Прогноз теж записується лише через ядро:

f(x)=sign(1λN∑n=1Nαnynκ(x,xn)+w0)

Сума йде тільки по опорних векторах, бо в решти αn=0. Формула лінійна у просторі ознак і нелінійна у вихідному — це той самий об'єкт, побачений із двох боків.

Рисунок показує чотири ядра на одних і тих самих даних. Лінійне дає пряму, поліноміальне — криву відповідного порядку, RBF — гладку межу довільної форми, сигмоїдне — химерну ламану, яка ілюструє, що не всяке ядро підходить будь-яким даним.

decision boundaries of linear poly rbf and sigmoid kernels in svc

Джерело: scikit-learn · Plot classification boundaries with different SVM Kernels

Код: лінійне ядро проти RBF на двох півмісяцях ​

Порівняємо ядра там, де правильна відповідь відома заздалегідь: make_moons генерує два переплетені півмісяці, які прямою не розділити принципово.

Вивід код запущено, вивід не редагувався
text
linear: точність на тесті 0.829, опорних векторів  71 із 195
   rbf: точність на тесті 0.933, опорних векторів  66 із 195

На що дивитися: RBF-ядро піднімає точність з 0,829 до 0,933, і опорних векторів йому знадобилося навіть менше — 66 проти 71.

Зміна одного рядка дала плюс десять відсоткових пунктів.

Джерело: scikit-learn · SVC

Результат на півмісяцях: пряма проти гладкої межі ​

Тепер подивимося на те саме очима. Ліворуч лінійне ядро чесно робить усе, що може: одна пряма, 82,9 % правильних відповідей і систематична помилка на «хвостах» обох півмісяців. Праворуч RBF-ядро огинає форму даних і дає 93,3 % на тих самих 105 тестових точках.

Помилки, що залишилися, зосереджені у вузькій зоні перетину півмісяців, де шум noise=0.22 фізично змішав класи. Це важливий орієнтир: ядро прибирає обмеження методу, але не прибирає шум у даних. Модель, яка розділила б і цю зону, просто запам'ятала б окремі точки.

linear versus rbf kernel decision boundary on the two moons dataset

Чотири варіанти SVM на одному наборі ірисів ​

Повернімося до Iris, тепер уже з трьома класами (SVM робить це схемою «один проти одного», навчаючи класифікатор на кожну пару класів). Чотири панелі показують той самий набір і той самий алгоритм із різними налаштуваннями.

SVC(kernel="linear") і LinearSVC дають схожі, але не тотожні межі: перший розв'язує двоїсту задачу зі стандартною hinge-втратою, другий — первинну з квадратичною hinge і регуляризує ще й зсув. RBF-ядро дає плавно вигнуті межі, поліноміальне третього степеня — жорсткіші, майже кутові.

Практичний висновок: «SVM» — це не одна модель, а сімейство, і різниця між його членами буває більшою, ніж різниця між SVM і логістичною регресією.

four svm classifiers on the iris dataset

Джерело: scikit-learn · Plot different SVM classifiers in the iris dataset

C і gamma працюють у парі, а не поодинці ​

Два параметри ядрової SVM не можна підбирати незалежно, бо вони частково компенсують один одного: жорсткіше ядро можна пригасити сильнішою регуляризацією.

Сітка показує це наочно. У верхньому ряду C замале — регуляризація давить модель незалежно від gamma, і межа майже плоска. У правому стовпці gamma завелике — модель обгортає кожну точку окремим острівцем, і це вже перенавчання, яке жодне C не рятує.

Робочі моделі зосереджені в середині діапазону, і жоден із двох параметрів не має «правильного» значення сам по собі: важлива тільки їхня комбінація. Саме тому підбирають їх разом, сіткою, а не по черзі.

rbf svm decision boundaries across a grid of C and gamma values

Джерело: scikit-learn · RBF SVM parameters

Карта якості показує діагональ, а не єдину точку ​

Той самий перебір, але замість меж рішення — точність перехресної перевірки для кожної пари значень. По горизонталі відкладено gamma, по вертикалі C, обидві шкали логарифмічні.

Світлі клітинки утворюються не в одній точці, а витягуються в діагональ: мале gamma з великим C дає приблизно ту саму якість, що велике gamma з малим C. Два праві стовпці — суцільно темні: при gamma порядку сотні модель обгортає кожну точку окремим острівцем і не узагальнює взагалі, і жодне C цього не виправляє.

Звідси два практичні правила. По-перше, шукати параметри слід логарифмічною сіткою — крок «×10», а не «+1». По-друге, всередині світлої смуги немає сенсу боротися за третій знак після коми: різниця між сусідніми клітинками менша за розкид між фолдами перехресної перевірки.

validation accuracy heat map over the C and gamma grid

Джерело: scikit-learn · RBF SVM parameters, карта якості

Код: підбір C і gamma на медичних даних ​

Повний робочий приклад на Breast Cancer: стандартизація всередині конвеєра, сітка по двох параметрах, п'ятикратна перехресна перевірка.

Вивід код запущено, вивід не редагувався
text
найкращі параметри: C = 100, gamma = 0.001
перехресна перевірка: 0.985
на тесті: 0.953
опорних векторів: 40

На що дивитися: крос-валідація дає 0,985, тест — 0,953, а все рішення тримається на 40 опорних векторах із 398 навчальних зразків.

Стандартизація стоїть усередині Pipeline не для краси: обчислена на всій вибірці, вона пропустила б інформацію про тест у навчання.

Результат на медичних даних і межі можливого ​

Ліва панель порівнює чотири конфігурації на тих самих 171 тестовій пухлині. Головний висновок несподіваний для тих, хто чекав чудес від ядра: стандартизація дала більше, ніж вибір ядра. Без неї RBF провалюється до 0,906, бо площа ядра клітини вимірюється сотнями, а гладкість контуру — сотими, і в евклідовій відстані чути лише першу ознаку.

Права панель показує розподіл значень розв'язувальної функції на тесті. Дві вертикальні штрихові лінії — межі коридору; всередині нього лежать саме ті пухлини, які стали опорними векторами. Розділення чисте: більшість спостережень далеко від нуля, і лише кілька потрапили в зону сумніву.

Підбір гіперпараметрів підняв перехресну перевірку до 0,985, але на тесті дав ті самі 0,953, що й налаштування за замовчуванням. На цих даних модель уже близька до стелі, і чесно це визнати корисніше, ніж полірувати сітку.

svm accuracy comparison and decision function histogram on breast cancer

Теорема про представлення відкриває ядра для регресії ​

Ядровий трюк не є винаходом саме для SVM: він працює для будь-якої моделі з ridge-регуляризацією.

"For any loss function ℓ, and any minimizer w* of the regularized empirical risk, there exists α* ∈ ℝᴺ such that w* = Xᵀα*." — теорема про представлення (representer theorem), EPFL CS-433, лекція 07a

Українською: оптимальні ваги завжди є лінійною комбінацією навчальних точок, бо ортогональна до них компонента лише збільшує норму, не змінюючи прогнозів. Отже, будь-яку таку модель можна переписати через α й підставити ядро — так з'являються kernel ridge regression, kernel PCA і kernel SVM. Розв'язок гребеневої регресії з лекції 03 має два еквівалентні записи:

w∗=1N(1NX⊤X+λID)−1X⊤y=1NX⊤(1NXX⊤+λIN)−1y

Перша коштує O(D3+ND2), друга — O(N3+DN2), і саме друга цінна: дані входять у неї через XX⊤, тож добуток можна замінити ядром, а прогноз стає зваженою сумою схожостей y^(x)=∑nαn∗κ(x,xn).

KRR і SVR: одна крива, різна ціна ​

Той самий прийом дає два різні методи регресії. Kernel ridge regression мінімізує квадратичну втрату й тому використовує всі точки. Support vector regression (SVR) замінює її на ε-нечутливу втрату: похибки, менші за ε, не караються зовсім, і розв'язок виходить розрідженим.

На рисунку обидві моделі навчено на зашумленій синусоїді: криві практично збігаються, але червоні кружки — опорні вектори SVR, і їх помітно менше, ніж точок. На нашому запуску з 400 точок KRR дала MSE 0,171 за 0,24 с, SVR — 0,177 за 0,35 с, використавши 95 точок. Обмін чіткий: KRR навчається швидше, SVR дає компактнішу модель, бо вартість її прогнозу зростає з кількістю опорних векторів, а не всієї вибірки.

kernel ridge regression compared with support vector regression

Джерело: scikit-learn · Comparison of kernel ridge regression and SVR

Наближення ядра рятує на великих вибірках ​

Матриця ядра має розмір N×N, і це головна межа масштабування: для ста тисяч спостережень вона займе близько 80 ГБ пам'яті, а розв'язання задачі коштує приблизно O(N3).

Вихід парадоксальний: побудувати відображення ϕ явно, але наближено, і після цього застосувати звичайну лінійну SVM, яка масштабується лінійно за N. Метод Нюстрема відбирає підмножину точок і будує на ній низькорангове наближення матриці ядра; метод випадкових ознак Фур'є використовує ймовірнісне подання RBF-ядра.

На рисунку три моделі на наборі рукописних цифр у проєкції на дві головні компоненти: точне RBF-ядро та два наближення зі ста компонентами. Межі рішень майже не відрізняються.

svc with exact rbf kernel versus fourier and nystroem feature maps

Джерело: scikit-learn · Explicit feature map approximation for RBF kernels

HAR: на семи тисячах спостережень наближення ще не потрібне ​

Перш ніж заміняти ядро наближенням, варто перевірити, чи вже треба. Візьмімо Human Activity Recognition — набір із лабораторної: 10 299 записів з акселерометра смартфона, 561 ознака, шість дій.

Вивід код запущено, вивід не редагувався
text
модель           навчання, с  точність
точне RBF-ядро           1.9    0.9848
Нюстрем 300              0.8    0.9618
Нюстрем 2000             6.5    0.9767

На що дивитися: на семи тисячах записів точне ядро найточніше, а наближення виграє в часі лише зі 300 компонентами — і платить за це точністю.

Результат несподіваний для тих, хто чув правило «ядро не масштабується»: на 7209 навчальних записах точне ядро навчається за неповні дві секунди й дає найкращу точність, 0,985. Наближення зі 300 компонентами вдвічі швидше, але втрачає два відсоткові пункти; із 2000 компонентами воно вже повільніше за точне ядро й усе одно поступається йому.

Висновок практичний: наближення — не «краща версія» ядра, а обмін точності на час, і братися за нього має сенс лише тоді, коли час справді став проблемою. Сім тисяч спостережень — ще не той випадок.

Квадратична стіна: де саме ламається точне ядро ​

Щоб побачити межу, потрібен набір, на якому вона настає: MiniBooNE, 130 064 події детектора нейтрино, 50 ознак. Навчаємо на підвибірках зростаючого розміру.

Вивід код запущено, вивід не редагувався
text
     N  ядро, с  точність ядра  Нюстрем  матриця, ГБ
  2000      0.1         0.7194   0.8766          0.0
  5000      0.2         0.8619   0.8813          0.2
 10000      0.9         0.8793   0.8877          0.8
 20000      3.6         0.8824   0.8913          3.2

На що дивитися: дивіться на стовпці часу й пам'яті: вибірка зросла вдесятеро, час ядра — у десятки разів, а матриця ядра на 20 000 зразках займає вже 3,2 ГБ.

Час точного ядра росте так: 0,1 с при двох тисячах, 0,2 при п'яти, 0,9 при десяти, 3,6 при двадцяти. Вибірка зросла вдесятеро — час у тридцять шість разів. На рисунку той самий вимір продовжено до 40 000 і показано в подвійному логарифмічному масштабі: нахил дорівнює 1,89, тобто обіцяна квадратична залежність не процитована, а виміряна. Наближення на тому ж відрізку дорожчає помітно повільніше й при цьому не програє в точності: 0,895 проти 0,887 на найбільшій вибірці.

Абсолютні секунди залежать від машини, тож порівнювати варто нахили. Що від машини не залежить — пам'ять: матриця ядра при 40 000 спостережень зайняла б 12,8 ГБ, при 130 000 — 135 ГБ. Бібліотека не тримає її цілком, а перераховує через кеш, і саме тому час росте квадратично, а не впирається в пам'ять одразу.

training time and accuracy versus sample size for exact and approximate kernel

Обмеження методу опорних векторів ​

Метод має чіткі межі застосовності, і краще знати їх заздалегідь.

Вартість зростає як куб від кількості спостережень. Матриця ядра N×N робить ядрову SVM непридатною для сотень тисяч рядків. Виходи: лінійне ядро, наближення ядра або зовсім інший клас моделей.

Обов'язкова стандартизація. Відступ вимірюється евклідовою відстанню, тому ознака з більшим числовим розмахом заглушує решту. Ми бачили це на медичних даних: 0,906 проти 0,953 на тих самих ознаках.

Два гіперпараметри без замовчувань. C і gamma треба підбирати перехресною перевіркою на кожному новому наборі даних; універсально правильних значень не існує.

Немає ймовірностей. SVM віддає відстань до межі, а не ймовірність класу. Перетворення (калібрування Платта) можливе, але потребує додаткової перехресної перевірки й помітно уповільнює навчання.

Втрачається інтерпретованість. У лінійному ядрі коефіцієнти ще можна прочитати; у RBF модель — це набір опорних векторів і схожостей, і пояснити конкретне рішення стає важко.

Підсумок лекції ​

Максимальний відступ — це вибір найнадійнішої з нескінченної кількості роздільних гіперплощин. Задача «максимізувати відступ» тотожна задачі «мінімізувати ∥w∥2 за обмежень yn(w⊤xn+w0)≥1», а ширина коридору дорівнює 2/∥w∥.

Soft-SVM — це ERM з hinge-втратою і ridge-регуляризацією. Слекові змінні вимірюють глибину порушення, а параметр C = 1/(λN) керує компромісом між шириною коридору й кількістю допущених помилок.

Розв'язок розріджений. Модель зберігає лише опорні вектори; викидання решти даних не змінює межі — ми перевірили це з точністю до 10−8.

Двоїста задача залежить від даних лише через матрицю попарних скалярних добутків — і саме ця властивість відкриває ядровий трюк.

Ядро дає нелінійність задарма. Заміна x⊤x′ на κ(x,x′) переносить лінійний класифікатор у високовимірний простір ознак, ніколи його не будуючи; той самий прийом працює для регресії, PCA та інших моделей із ridge-регуляризацією.

Джерела й додаткові матеріали ​

Курси

Статті та підручники

Документація й дані

Матеріали курсу. Схеми із зовнішніх джерел належать їхнім авторам — посилання під кожною ілюстрацією.