В основе метода усиления простых классификаторов лежит простая предпосылка: скомбинировать некоторое количество элементарных (простых) признаков, таким образом, чтобы получить один, но более мощный. Приведём классический пример: пускай человек, играющий на скачках, решил создать программу, которая бы предсказывала, придёт ли интересующая его лошадь первой к финишу. Опросив некоторое количество играющих людей, он смог определить несколько эмпирических правил: ставь на лошадь, которая победила в трёх предыдущих заездах, ставь на лошадь, ставки на которую максимальны и т.д. Ясно, что каждое из таких правил по отдельности недостаточно надёжно и встает вопрос можно ли их оптимально скомбинировать для получения надёжных результатов.
Ответ на этот вопрос даёт семейство алгоритмов работающих на принципе усиления простых классификаторов. Это семейство использует простые правила классификации подобно деталям конструктора, комбинируя их неким образом, чтобы в итоге получить более сильное правило.
Мы рассмотрим один из самых ранних алгоритмов из данного семейства - AdaBoost (от <адаптивность> и <усиление>). Этот алгоритм был опубликован в 1996 и послужил основой для всех последующих исследований в данной области. На его основе была построена на данный момент пожалуй самая эффективная (как по уровню распознавания, так и по скорости работы) система поиска объектов на изображении (Viola-Jones Object Detector [5]). На данный момент наиболее распространёнными вариантами базового алгоритма являются Gentle AdaBoost и Real AdaBoost, превосходящие базовый алгоритм по своим характеристикам, но сохраняют все основные принципы. К основным достоинствам AdaBoost и его вариантов можно отнести высокую скорость работы, высокую эффективность распознавания, простоту реализации, общность.
Требуется построить
классифицирующую функцию
, где X - пространство векторов признаков, Y - пространство меток классов. Пусть в нашем распоряжении имеется
обучающая выборка (x1, y1), ..., (xN, yN). Где
вектор признаков, а
метка класса, к
которому принадлежит
. Далее в статье мы будем рассматривать задачу с двумя
классами, то есть Y = {-1; +1}. Также у нас есть семейство простых классифицирующий функций
. Мы будем строить финальный классификатор в следующей форме:
где
. Построим итеративный процесс, где на каждом шаге будем
добавлять новое слагаемое
где Zi - нормализующий коэффициент, такой что
Заметим, что если рассмотреть Dm как распределение вероятности над X, что правомерно т.к.
, то
Далее вычисляется вклад текущего слагаемого
классифицирующей функции

В этом разделе мы
уделим внимание фундаменту всех методов усиления простых классификаторов -
семейству простых классификаторов
![]()
Что это такое? Для ясности приведём пример: пусть входные
данные это n-мерные
вектора X = Rn, пусть тогда

Как при таком множестве H происходит выбор наилучшего классификатора hΘ, k на каждой итерации (шаг алгоритма 2.a)? В данном случае делается следующее - для каждого k = 1..n, вычисляется порог Θ'k, реализующий минимум взвешенной ошибки em, затем из полученных классификаторов hΘ, k, k = 1..n выбирается соответствующий минимальной em.
Несмотря на свою простоту, этот классификатор, усиленный алгоритмом AdaBoost, дает весьма впечатляющие результаты. Система поиска объектов на изображении Viola-Jones находит 95% всех искомых объектов и с 0.0001% ложных срабатываний.
Какими свойствами
должен обладать простой классификатор? В первую очередь, вероятность его ошибки
должна быть хотя бы немного меньше 1/2, то есть он должен работать лучше чем "орел/решка":
Самыми часто используемыми на практике простыми классификаторами являются пороги (stumps) и CART решающие деревья [12], [13].
В этой части мы попытаемся пролить немного света на внутреннюю механику алгоритма. Фактически, AdaBoost осуществляет два действия:
Первое действие является своеобразным отображением пространства входных векторов в пространство значений простых классификаторов:
Комбинирование простых классификаторов происходит линейно (составляется линейная комбинация), а решение принимается в зависимости от знака полученной комбинации. Это фактически эквивалентно разделению пространства значений простых классификаторов гиперплоскостью и принятие решения в зависимости от того, по какую сторону гиперплоскости лежит отображение вектора признаков.
Таким образом, готовый классификатор производит вначале отображение в некое пространство, обычно намного более высокой размерности, чем исходное, в котором производит линейную классификацию. На этапе тренировки алгоритм последовательно строит и это отображение, и саму гиперплоскость.
Стоит заметить, что работа AdaBoost в значительной мере напоминает работу алгоритма ядерной машины опорных векторов (Kernel Support Vector Machine - kernel SVM). Исследования последних лет показывает глубокую связь этих двух алгоритмов, что является серьёзным теоретическим результатом [9].
Одна из интерпретаций работы алгоритмов на основе AdaBoost основана на понятие <грани> (margin). В случае AdaBoost грань определяется как:

Эту величину можно интерпретировать как меру <уверенности> классификатора в примере (x, y). Если классификация правильная, то грань больше нуля, иначе грань отрицательна. Чем больше простых классификаторов правильно классифицируют пример, тем больше его грань.
Если учесть то, как на каждом шаге вычисляются веса примеров, то легко видеть, что на каждом шаге AdaBoost пытается максимизировать минимальную грань тренировочной выборки. Утверждается, что данное действие положительно сказывается на обобщающих способностях алгоритма. Больше про данную интерпретацию семейства алгоритмов на основе AdaBoost можно прочитать в [9].
В данный момент подход усиления простых классификаторов является одним из наиболее популярных и, вероятно, наиболее эффективным методом классификации. За счёт высокой скорости, простоты реализации и высокой эффективности распознавания это семейство алгоритмов нашло свое применение во множестве областей так или иначе связанных с классификацией (медицина, анализ изображений, анализ текстов и т.д.).
Мы кратко описали самый базовый алгоритм, основывающийся на идеи усиления простых классификаторов. Все последующие его модификации сохраняют основные свойства своего предка. Для более детального знакомства предлагается обратиться к указанной в библиографии литературе, а также посетить интернет-сайт www.boosting.org.
Комментарии
О расхождении с [1]
В соответствии с [1] в пункте 2.b алгоритма должно быть alpha_m = 1/2 ln frac{1-e_m}{e_m}. Множитель 1/2 не влияет на классификацию в пункте 3, но влияет на то, какие функции h_m выбираются алгоритмом на каждом шаге, так как веса D_m(i) получаются разные, в зависимости от того есть этот множитель или нет. Freund and Schapire в своей работе 96 года использовали (существенно) alpha_m = ln frac{1-e_m}{e_m}, но они при этом использовали другую формулу для пересчёта весов D в пункте 2.c.
вопрос
Непонятно какое значение имеет переменная M в алгоритме Adaboost? В пункте 2. для каждого шага m=1,2,...,M.
ответ
Извиняюсь, что не заметил вопросы раньше.
Про расхождение - да вы правы, это опечатка. Постараюсь в ближайшее время поправить.
Про вопрос - m - номер итерации. Собственно, M - количество итераций. Это число выбирается вручную. Чем оно больше, тем больше классификаторов в комитете и тем ниже ошибка на обучении, но так же более вероятно переобучение.
Я так понял, что
Я так понял, что подобные алгоритмы основанные на комбинации классификаторов, называются ассоциативными машинами. Подробнее на русском языке здесь: Хайкин С. Нейронные сети: полный курс.// 2-е изд., испр. Пер. с англ. – М.: ООО «И.Д. Вильямс», 2006.
Отправить комментарий