Швидкий метод пошуку найкращих метапараметрів SVM (це швидше, ніж пошук в сітці)


17

Я використовую моделі SVM для короткострокового прогнозування забруднювачів повітря. Для підготовки нової моделі мені потрібно знайти відповідні метапараметри для моделі SVM (я маю на увазі C, гамма тощо).

Документація Libsvm (і багато інших книг, які я прочитав) пропонує використовувати пошук по сітці, щоб знайти ці параметри - тому я в основному треную модель для кожної комбінації цих параметрів з певного набору і вибираю найкращу модель.

Чи є кращий спосіб знайти оптимальні (або майже оптимальні) метапараметри? Для мене це головним чином час обчислення - один пошук сітки на цю проблему займає близько двох годин (після того, як я зробив деякі оптимізації).

Плюси пошуку сітки:

  • Це можна легко паралелізувати - якщо у вас є 20 процесорів, він працюватиме в 20 разів швидше, паралелізуючи інші методи складніше
  • Ви перевіряєте великі частини простору метапараметра, тому, якщо є хороше рішення, ви знайдете його.

Відповіді:


10

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

Ось запис у блозі Алекса Смола, пов’язаний із вашим запитанням

Ось цитата:

[...] виберіть, скажімо, 1000 пар (x, x ') навмання зі свого набору даних, обчисліть відстань усіх таких пар і візьміть медіану, число 0,1 і 0,9. Тепер виберіть λ для оберненого будь-якого з цих трьох чисел. Трохи перекреслившись, ви зрозумієте, який із трьох найкращий. У більшості випадків вам більше не потрібно буде шукати.

Я сам цього не пробував, але це здається багатообіцяючим.


Як це пов’язано з питанням? Питання полягає у пошуку найкращих параметрів для моделі SVM (швидким способом).
Ророноа Зоро

2
@Roronoa Zoro: і так відповідь. Це пояснює, як знайти параметри для радіальних базових функцій на основі SVM (C і \ lambda в публікації блогу Смоли) в 3 | Cs | час на відміну від | \ gammas || Cs | як це робиться у випадку пошуку в сітці.
carlosdc

Просто для уточнення, щоб переконатися, що я розумію евристику, в основному ви просто випадковим чином малюєте 1000 точок даних із набору даних для тренування SVM, а потім берете зворотну кількість .1, .9 квантилів і медіану, і це, ймовірно, буде добре кандидати на відповідну гаму?
tomas

6

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

Це, як правило, спрацьовує досить добре на практиці, звичайно, із застереженнями. По-перше, простір не обов'язково рівне, і там можуть бути місцеві оптими . Груба сітка може повністю пропустити їх, і ви могли б отримати неоптимальне рішення. Також зауважте, що якщо у вашому наборі витримки є порівняно мало зразків, можливо, у вас є багато налаштувань параметрів, які дають однаковий бал (помилка або будь-який показник, який ви використовуєте). Це може бути особливо проблематично, якщо ви займаєтесь навчанням у багатьох класах (наприклад, використовуєте метод « один проти всіх» ), і у вас є лише кілька прикладів для кожного класу у вашому наборі для витримки. Однак, не вдаючись до бридких методів нелінійної оптимізації, це, ймовірно, слугує хорошим відправною точкою.

Там хороший набір посилань тут . Раніше я застосовував підхід, за яким можна обґрунтовано оцінити хороший діапазон гіперпараметрів ядра, перевіривши ядро ​​(наприклад, у випадку ядра RBF, гарантуючи, що гістограма значень ядра дає гарне поширення значень, замість того, щоб перекоситись у напрямку 0 або 1 - і ви можете зробити це теж автоматично, не надто багато роботи), це означає, що ви можете звузити діапазон перед початком. Потім ви можете зосередити свій пошук на будь-яких інших параметрах, таких як параметр регуляризації / ємності. Однак, звичайно, це працює лише з попередньо обчисленими ядрами, хоча ви можете оцінити це за випадковим набором балів, якщо ви не хочете використовувати попередньо обчислені ядра, і я думаю, що і цей підхід буде непоганим.


5

Я використовую імітований відпал для пошуку параметрів.

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

  • k є постійною Больцмана.
  • T_max - ваша початкова температура.
  • T_min - ваш кінцевий поріг.
  • mu_T( μ) - на скільки ти знижуєш температуру ( T->T/μ)
  • i - кількість ітерацій при кожній температурі
  • z- розмір кроку - ви визначаєте, що саме це означає. Я випадковим чином рухаюся всередині old*(1±z).
  1. Візьміть початкову точку (набір значень параметрів).
  2. Отримайте енергію для цього (наскільки добре він відповідає вашим даним; я використовую значення chi-квадрата).
  3. Подивіться у випадковому напрямку («зробіть крок»).
    • Якщо енергія нижче вашої поточної точки, перемістіться туди.
    • Якщо вона вище, рухайтеся туди з вірогідністю p = e^{-(E_{i+1} - E_i)/(kT)}.
  4. Повторіть, періодично опускаючи T->T/μкожну iітерацію, поки не потрапите T_min.

Трохи пограйте з параметрами, і ви зможете знайти набір, який працює добре і швидко.

А Наукова бібліотека ГНУ включає імітований відпал.


4

Якщо когось цікавить ось деякі мої думки з цього приводу:

  • Як @tdc запропонував, я роблю пошук грубої / тонкої сітки. Це спричиняє дві проблеми:
    • У більшості випадків я отримаю набір хороших метапараметричних наборів, які мають диво різні параметри --- я інтерпретую це таким чином, що ці параметри є оптимальними рішеннями, але щоб бути впевненим, я повинен перевірити всі тонкі сітки біля всіх цих хороших параметрів ( це займе багато часу), тому наразі я перевіряю лише сусідство встановлених метапараметрів ставок.
    • У більшості випадків точний пошук не збільшує продуктивність SVM (це може бути пов’язано з тим, що я перевіряю лише сусідство найкращої точки з грубої сітки.
  • Я спостерігав за поведінкою, що найбільше часу на обчислення витрачається на набори метапараметри, які не дадуть хороших результатів, наприклад: більшість наборів метапараметрів обчислюються за 15 секунд (а найкращі з них мають похибку 15%), а деякі займають 15 хвилин ( і більшість із них мають показник помилок, що перевищує 100%). Тому під час пошуку в сітці я вбиваю точки, на які потрібно обчислити більше 30 секунд, і припускаю, що вони мали нескінченну помилку.
  • Я використовую мультиобробку (що досить просто)

1

Якщо ядро ​​радіальне, ви можете використовувати цю евристику, щоб отримати належнеσ - Оптимізація С - це набагато простіше.


Посилання мертва. Що було евристичним, про яке ви посилалися?
Aalawlx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.