Приближение функции потерь XGBoost с расширением Тейлора

28

В качестве примера возьмем целевую функцию модели XGBoost на -й итерации:t

L(t)=i=1n(yi,y^i(t1)+ft(xi))+Ω(ft)

где - функция потерь, - выходной файл ', а - регуляризация. Одним из (многих) ключевых шагов для быстрого расчета является приближение:fttΩ

L(t)i=1n(yi,y^i(t1))+gtft(xi)+12hift2(xi)+Ω(ft),

где и - первая и вторая производные функции потерь.gihi

То, что я прошу, это убедительные аргументы, чтобы объяснить, почему вышеприведенное приближение работает:

1) Как XGBoost с вышеуказанным приближением сравнивается с XGBoost с полной целевой функцией? Какое потенциально интересное поведение высшего порядка теряется в приближении?

2) Это немного сложно визуализировать (и зависит от функции потерь), но, если функция потерь имеет большой кубический компонент, то аппроксимация, скорее всего, потерпит неудачу. Почему это не вызывает проблем для XGBoost?

Алекс Р.
источник

Ответы:

62

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

Традиционное повышение градиента

Рассмотрим традиционный алгоритм повышения градиента (Википедия) :

  • Вычислить базовую модельH0
  • Дляm1:M
    • Вычислить псевдо-остаткиrim=(yi,Hm1(xi))Hm1(xi)
    • базового ученика для псевдо-остатковhm(x)
    • Вычислить множитель который минимизирует стоимость, , (используя поиск строки)γγ=argminγi=1N(yi,Hm1(xi)+γhm(xi))
    • Обновите модель .Hm(x)=Hm1(x)+γhm(x)
  • Вы получите свою усиленную модель .HM(x)

Приближение функции важно для следующей части,

базового ученика для псевдо-остатков.hm(x)

Представьте себе, где наивно построить алгоритм повышения градиента. Вы могли бы построить алгоритм выше, используя существующие деревья регрессии как слабые ученики. Предположим, вам не разрешено изменять существующую реализацию слабых учеников. В Matlab критерием разделения по умолчанию является ошибка среднего квадрата. То же самое можно сказать о scikit .

Вы пытаетесь найти лучшую модель которая минимизирует стоимость . Но для этого вы подгоняете простую регрессионную модель к остаткам, используя MSE в качестве целевой функции. Обратите внимание, что вы не минимизируете напрямую то, что хотите, а используете остаточные значения и MSE в качестве прокси-сервера для этого. Плохая часть в том, что это не обязательно дает оптимальное решение. Хорошая часть в том, что это работает.hm(x)(yi,Hm1(xi)+hm(xi))

Традиционный градиентный спуск

Это аналогично традиционному градиентному спуску (Википедия) , где вы пытаетесь минимизировать функцию стоимости , следуя (отрицательному значению) градиенту функции, на каждом шаге.е(Икс)-е(Икс)

Икс(я+1)знак равноИкс(я)-е(Икс(я))

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

интерлюдия

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

Похоже, что ваш вопрос подразумевает, что «истинный XGBoost» должен вычислять функцию стоимости для каждого разделения, а «приближенный XGBoost» использует эвристику для ее аппроксимации. Вы можете видеть это таким образом, но исторически у нас был общий алгоритм повышения градиента, который не использует информацию о функции стоимости, кроме производной в текущей точке. XGBoost - это расширение Gradient Boosting, которое пытается быть умнее в выращивании деревьев слабой регрессии, используя более точное приближение, чем просто градиент.

Другие способы выбрать лучшую модельчасм(Икс)

Если мы посмотрим на AdaBoost как на особый случай повышения градиента, он выбирает не регрессоров, а классификаторов как слабых учеников. Если мы установим , AdaBoost выберет лучшую модель, найдячасм(Икс){-1,1}

часмзнак равноArgМаксимумчасмΣязнак равно1Nвесячасм(Икся)

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

Но опять же, это не является прямым измерением того, какой минимизирует . Он измеряет, насколько хорош ход , с учетом общего направления, в котором вы должны идти, и измеряется с помощью невязок , которые также являются приблизительными. Остатки сообщают вам, в каком направлении вы должны двигаться, по их знаку и примерно по величине, но они не сообщают вам, где именно вам следует остановиться.часм(Yя,ЧАСм-1(Икся)+часм(Икся))часмвеся

Лучший градиентный спуск

Следующие три примера не являются необходимыми для объяснения и предназначены только для того, чтобы представить некоторые способы добиться большего успеха, чем ванильный градиентный спуск, чтобы поддержать идею о том, что то, что делает XGBoost, является просто еще одним способом улучшения градиентного спуска. В традиционной установке градиентного спуска при попытке минимизировать можно добиться большего успеха, чем просто следование градиенту. Было предложено много расширений (Википедия) . Вот некоторые из них, чтобы показать, что это можно сделать лучше, учитывая больше времени вычисления или больше свойств функции .е(Икс)fе

  • Поиск линии / обратное отслеживание: в градиентном спуске после вычисления градиента следующая точка должна быть-е(Икс(я))

    Икс(я+1)знак равноИкс(я)-е(Икс(я))

    Но градиент дает только направление, в котором нужно двигаться, а не «сколько», поэтому можно использовать другую процедуру, чтобы найти наилучшее такое, чтос>0

    Иксс(я+1)знак равноИкс(я)-се(Икс(я))

    минимизирует функцию стоимости. Это делается оценки для некоторого , и, поскольку функция должна быть выпуклой, это относительно легко сделать с помощью поиска строки (Wikipedia) или поиска линии возврата (Wikipedia) . Здесь основной стоимостью является оценка . Так что это расширение работает лучше всего, если легко вычислить. Обратите внимание, что общий алгоритм повышения градиента использует поиск строк, как показано в начале моего ответа.е(Иксс(я+1))сеf ( x ) fе(Икс)е

  • Метод быстрого проксимального градиента: если функция минимизации сильно выпуклая, а ее градиент гладкий ( Липшиц (Википедия) ), то есть некоторый прием, использующий эти свойства, который ускоряет сходимость.

  • Стохастический градиентный спуск и метод Momentum: В Stochastic Gradient Descent вы не оцениваете градиент по всем точкам, а только по подмножеству этих точек. Вы делаете шаг, затем вычисляете градиент в другой партии и продолжаете. Стохастический градиентный спуск может использоваться, потому что вычисления по всем точкам очень дороги, или, может быть, все эти точки даже не помещаются в память. Это позволяет вам делать больше шагов, быстрее, но менее точно.

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

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

x(i+1)=x(i)f(x(я))

А поскольку градиент указывает на направление наибольшего увеличения , его отрицательные точки направлены в сторону наибольшего уменьшения, и мы надеемся, что . Это может не сработать, так как мы можем зайти слишком далеко в направлении градиента (отсюда расширение поиска строки), но это хорошее приближение. В методе Ньютона мы обновляем следующим образом:е(Икс(я))ее(Икс(я+1))<е(Икс(я))Икс(я)

Икс(я+1)знак равноИкс(я)-е(Икс(я))Hessе(Икс(я))

Где - это гессиан функции в . Это обновление учитывает информацию второго порядка, поэтому направление больше не является направлением наибольшего уменьшения, а должно более точно указывать на , так что (или точка, где минимально, если нет нуля). Если - многочлен второго порядка, то метод Ньютона в сочетании с поиском строки должен быть в состоянии найти минимум за один шаг.Hessе(Икс)еИксИкс(я+1)е(Икс(я+1))знак равно0ее

Метод Ньютона отличается от стохастического градиентного спуска. В «Стохастическом градиентном спуске» мы используем меньше точек, чтобы тратить меньше времени на вычисление направления, в котором мы должны идти, чтобы сделать их больше, в надежде, что мы пойдем туда быстрее. В методе Ньютона мы тратим больше времени, чтобы вычислить направление, в котором мы хотим идти, в надежде, что нам нужно сделать меньше шагов, чтобы добраться туда.

Теперь причина, по которой работает метод Ньютона, та же, что и для приближения XGBoost, и оно основано на разложении Тейлора (Википедия) и теореме Тейлора (Википедия) . Разложение Тейлора (или ряд Тейлора) функции в точке имеет виде(Икс+a)

е(Икс)+е(Икс)Иксa+122е(Икс)Икс2a2+знак равноΣNзнак равно01N!Nе(Икс)ИксNaN,

Обратите внимание на сходство между этим выражением и приближением, которое использует XGBoost. Теорема Тейлора гласит, что если вы остановите разложение в порядке , то ошибка или разница между и , не превосходит , где является функцией со свойством хорошей , что она стремится к нулю , как стремится к нулю.Ке(Икс+a)ΣNзнак равно0К1N!Nе(Икс)ИксNaNчасК(Икс)aКчасКa

Если вам нужна некоторая визуализация того, насколько хорошо она аппроксимирует некоторые функции, взгляните на страницы википедии, у них есть некоторые графики для аппроксимации неполиномиальной функции, такой как , .еИксжурнал(Икс)

Стоит отметить, что аппроксимация работает очень хорошо, если вы хотите вычислить значение в окрестности , то есть для очень небольших изменений . Это то, что мы хотим сделать в Boosting. Конечно, мы хотели бы найти дерево, которое делает самые большие изменения. Если слабые ученики, которых мы создаем, очень хороши и хотят внести очень большие изменения, то мы можем произвольно помешать этому, применяя только илиеИксa0,10,01его эффекта. Это размер шага или скорость обучения градиентного спуска. Это приемлемо, потому что, если наши слабые ученики получают очень хорошие решения, это означает, что либо проблема проста, и в этом случае мы все равно получим хорошее решение, либо мы переоснащаемся, так что немного или очень многое в этом плохом направлении не меняет основной проблемы.

Так что же делает XGBoost и почему он работает?

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

Почему они построили это так

Ваш вопрос о том, почему использование этого приближения приводит к компромиссу цена / производительность. Эта функция стоимости используется для сравнения потенциальных расщеплений для деревьев регрессии, поэтому, если наши точки имеют, скажем, 50 объектов со средним значением 10 различных значений, каждый узел имеет 500 потенциальных расщеплений, то есть 500 оценок функции. Если вы отбрасываете непрерывную функцию, количество разбиений увеличивается, и оценка разделения вызывается все больше и больше (у XGBoost есть еще одна хитрость для работы с непрерывными функциями, но это выходит за рамки). Поскольку алгоритм тратит большую часть своего времени на оценку разбиений, способ ускорить алгоритм - ускорить оценку дерева.

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

Аппроксимация второго порядка хороша в вычислительном отношении, потому что большинство членов в данной итерации одинаковы. Для данной итерации большая часть выражения может быть вычислена один раз и повторно использована как константа для всех разбиений:

L(T)Σязнак равно1N(Yя,Y^я(T-1))постоянная+гяпостояннаяеT(Икся)+12часяпостояннаяеT2(Икся)+Ω(еT),

Таким образом, единственное, что вам нужно вычислить, это и , а затем остается в основном сложение и некоторые умножения. Более того, если вы посмотрите на статью XGBoost (arxiv) , вы увидите, что они используют тот факт, что они строят дерево, чтобы еще больше упростить выражение до группы суммирования индексов, что очень, очень быстро.еT(Икся)Ω(еT)

Резюме

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

Используемое приближение аналогично методу Ньютона и обосновано рядом Тейлора (Википедия) и теоремой Тейлора (Википедия) .

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

Для визуализации проверьте страницу Википедии ряда Тейлора / Теорема Тейлора , или Академию Хана о приближении ряда Тейлора , или страницу MathDemo о приближении полиномов неполиномов

подмигивает
источник
2
+1. Я должен признаться, что я не читал этот ответ (пока?) И не могу судить о нем в любом случае, потому что это вне моей компетенции, но это выглядит настолько впечатляюще, что я с удовольствием возражаю. Молодец [кажется]!
говорит амеба: восстанови монику
Это был отличный ответ. У меня есть один вопрос, хотя. Алгоритм повышения градиента подгоняет дерево регрессии к отрицательному градиенту с критерием разделения mse. Как определяется древовидная структура в XGBoost ??
gnikol
Вы прибили ответ, хорошая работа!
Марцин Заблоки