Быстрый метод поиска лучших метапараметров SVM (это быстрее, чем поиск по сетке)

17

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

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

Есть ли лучший способ найти оптимальные (или почти оптимальные) метапараметры? Для меня это в основном вопрос времени вычислений - один поиск по сетке для этой задачи занимает около двух часов (после того, как я выполнил некоторые оптимизации).

Плюсы сетки поиска:

  • Его можно легко распараллелить - если у вас 20 процессоров, он будет работать в 20 раз быстрее, распараллелить другие методы сложнее
  • Вы проверяете большие части пространства метапараметров, поэтому, если есть хорошее решение, вы найдете его.
ДБ.
источник

Ответы:

10

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

Вот запись в блоге Алекса Смолы, связанная с вашим вопросом

Вот цитата:

[...] выберите, скажем, 1000 пар (x, x ') случайным образом из вашего набора данных, вычислите расстояние всех таких пар и возьмите медиану, квантиль 0,1 и 0,9. Теперь выберите λ, чтобы быть обратным любому из этих трех чисел. Немного пройдя перекрестную проверку, вы поймете, какой из трех является лучшим. В большинстве случаев вам не нужно искать дальше.

Я не пробовал это сам, но это кажется многообещающим.

carlosdc
источник
Как это связано с вопросом? Вопрос в том, чтобы найти лучшие параметры для модели SVM (быстрым способом).
Ророноа Зоро
2
@ Ророноа Зоро: и ответ тоже. Он объясняет, как найти параметры для SVM радиальных базисных функций (C и \ lambda в сообщении блога Смолы) в 3 | Cs | время в отличие от | \ gammas || Cs | как это делается в случае поиска по сетке.
Carlosdc
Просто чтобы уточнить, чтобы убедиться, что я понимаю эвристику, в основном вы просто случайным образом рисуете 1000 точек данных из набора данных для обучения SVM, а затем берете обратное значение для квантилей и медианы .1, .9, и они, вероятно, будут хорошими. кандидаты на подходящую гамму?
Томас
6

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

Это имеет тенденцию работать довольно хорошо на практике, с оговорками, конечно. Во-первых, пространство не обязательно гладкое, и там могут быть локальные оптимумы . Грубая сетка может полностью пропустить это, и вы можете получить неоптимальное решение. Также обратите внимание, что если у вас относительно мало сэмплов в вашем наборе удержания, то у вас может быть много настроек параметров, которые дают одинаковую оценку (ошибка или любой другой показатель, который вы используете). Это может быть особенно проблематично, если вы проводите многоклассное обучение (например, используя метод « один против всех» ), и у вас есть только несколько примеров из каждого класса в вашем наборе. Однако, не прибегая к неприятным методам нелинейной оптимизации, это, вероятно, служит хорошей отправной точкой.

Там хороший набор ссылок здесь . В прошлом я использовал подход, согласно которому вы можете разумно оценить хороший диапазон гиперпараметров ядра путем проверки ядра (например, в случае ядра RBF, обеспечив, чтобы гистограмма значений ядра давала хороший разброс значений, вместо того, чтобы наклониться к 0 или 1 - и вы можете сделать это автоматически тоже без особой работы), что означает, что вы можете сузить диапазон перед началом. Затем вы можете сосредоточить свой поиск на любых других параметрах, таких как параметр регуляризации / производительности. Однако, конечно, это работает только с предварительно вычисленными ядрами, хотя вы можете оценить это по случайному подмножеству точек, если вы не хотите использовать предварительно вычисленные ядра, и я думаю, что этот подход тоже подойдет.

TDC
источник
5

Я использую моделируемый отжиг для поиска параметров.

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

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

Немного поиграйтесь с параметрами, и вы сможете найти набор, который работает хорошо и быстро.

А в Научную библиотеку GNU входит моделируемый отжиг.

Kevin
источник
4

Если кому-то интересно, вот некоторые из моих мыслей на эту тему:

  • Как предложил @tdc, я делаю грубый / точный поиск по сетке. Это создает две проблемы:
    • В большинстве случаев я получу набор хороших наборов метапараметров, которые имеют совершенно разные параметры - я интерпретирую таким образом, что эти параметры являются оптимальными решениями, но, чтобы быть уверенным, я должен проверить все точные сетки вблизи всех этих хороших параметров ( это заняло бы много времени), поэтому сейчас я проверяю только набор метапараметров соседства ставок.
    • В большинстве случаев точный поиск не увеличивает производительность SVM (это может быть связано с тем, что я проверяю только приблизительную точку наилучшей точки из грубой сетки).
  • Я наблюдал за поведением, что большая часть вычислительного времени тратится на наборы метапараметров, которые не дадут хороших результатов, например: большинство наборов метапараметров будут вычисляться менее чем за 15 секунд (и лучшие из них имеют частоту ошибок 15%), а некоторые занимают 15 минут ( и большинство из них имеют ошибки более 100%). Поэтому, когда я выполняю поиск по сетке, я убиваю точки, которые вычисляются более чем за 30 секунд, и предполагаю, что они имели бесконечную ошибку.
  • Я использую многопроцессорность (что достаточно просто)
ДБ.
источник
1

σ


источник
Ссылка мертва. На какую эвристику вы ссылались?
Aalawlx