Я использую модели SVM для краткосрочного прогнозирования загрязнителей воздуха. Для обучения новой модели мне нужно найти соответствующие метапараметры для модели SVM (я имею в виду C, гамма и т. Д.).
Документация libsvm (и многие другие книги, которые я читал) предлагает использовать поиск по сетке для поиска этих параметров - поэтому я в основном обучаю модель для каждой комбинации этих параметров из определенного набора и выбираю лучшую модель.
Есть ли лучший способ найти оптимальные (или почти оптимальные) метапараметры? Для меня это в основном вопрос времени вычислений - один поиск по сетке для этой задачи занимает около двух часов (после того, как я выполнил некоторые оптимизации).
Плюсы сетки поиска:
- Его можно легко распараллелить - если у вас 20 процессоров, он будет работать в 20 раз быстрее, распараллелить другие методы сложнее
- Вы проверяете большие части пространства метапараметров, поэтому, если есть хорошее решение, вы найдете его.
Если вы сделаете предположение, что за сеткой параметров лежит относительно гладкая функция, то есть некоторые вещи, которые вы можете сделать. Например, одна простая эвристика состоит в том, чтобы начать с очень грубой сетки параметров, а затем использовать более тонкую сетку вокруг лучших настроек параметров из грубой сетки.
Это имеет тенденцию работать довольно хорошо на практике, с оговорками, конечно. Во-первых, пространство не обязательно гладкое, и там могут быть локальные оптимумы . Грубая сетка может полностью пропустить это, и вы можете получить неоптимальное решение. Также обратите внимание, что если у вас относительно мало сэмплов в вашем наборе удержания, то у вас может быть много настроек параметров, которые дают одинаковую оценку (ошибка или любой другой показатель, который вы используете). Это может быть особенно проблематично, если вы проводите многоклассное обучение (например, используя метод « один против всех» ), и у вас есть только несколько примеров из каждого класса в вашем наборе. Однако, не прибегая к неприятным методам нелинейной оптимизации, это, вероятно, служит хорошей отправной точкой.
Там хороший набор ссылок здесь . В прошлом я использовал подход, согласно которому вы можете разумно оценить хороший диапазон гиперпараметров ядра путем проверки ядра (например, в случае ядра RBF, обеспечив, чтобы гистограмма значений ядра давала хороший разброс значений, вместо того, чтобы наклониться к 0 или 1 - и вы можете сделать это автоматически тоже без особой работы), что означает, что вы можете сузить диапазон перед началом. Затем вы можете сосредоточить свой поиск на любых других параметрах, таких как параметр регуляризации / производительности. Однако, конечно, это работает только с предварительно вычисленными ядрами, хотя вы можете оценить это по случайному подмножеству точек, если вы не хотите использовать предварительно вычисленные ядра, и я думаю, что этот подход тоже подойдет.
источник
Я использую моделируемый отжиг для поиска параметров.
Поведение регулируется несколькими параметрами:
k
постоянная Больцмана.T_max
ваша начальная температураT_min
ваш конечный порог.mu_T
(μ
) насколько вы понижаете температуру (T->T/μ
)i
количество итераций при каждой температуреz
размер шага - вы определяете, что именно это означает. Я случайно двигаюсь внутриold*(1±z)
.p = e^{-(E_{i+1} - E_i)/(kT)}
.T->T/μ
каждуюi
итерацию, пока не нажметеT_min
.Немного поиграйтесь с параметрами, и вы сможете найти набор, который работает хорошо и быстро.
А в Научную библиотеку GNU входит моделируемый отжиг.
источник
Если кому-то интересно, вот некоторые из моих мыслей на эту тему:
источник
источник