Наближення функції втрати XGBoost з розширенням Тейлора


28

Як приклад, візьміть об'єктивну функцію моделі XGBoost на t -й ітерації:

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

де функція втрат, ft є t «го вихідного дерева і Ω є регуляризація. Одним із (багатьох) ключових кроків для швидкого обчислення є наближення:

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

де gi і hi є першою та другою похідними функції втрат.

Мене просять переконливі аргументи, щоб демістифікувати, чому вищезазначене наближення працює:

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 критерієм розділення за замовчуванням є середня квадратна помилка. Те саме стосується і наукового навчання .

Ви намагаєтеся знайти найкращу модель яка мінімізує вартість . Але для цього ви встановлюєте просту регресійну модель для залишків, використовуючи MSE в якості об'єктивної функції. Зауважте, що ви не мінімізуєте безпосередньо те, що хочете, але використовуєте залишки та MSE як проксі. Погана частина полягає в тому, що це не обов'язково дає оптимальне рішення. Гарна частина полягає в тому, що вона працює.hm(x)(yi,Hm1(xi)+hm(xi))

Традиційний градієнтний спуск

Це аналогічно традиційному спуску градієнта (Вікіпедія) , де ви намагаєтеся мінімізувати функцію витрат , дотримуючись (мінус) градієнта функції, на кожному кроці.f(x)f(x)

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

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

Інтерлюдія

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

Що, як видається, означає, що "справжній XGBoost" повинен обчислити функцію витрат для кожного розбиття, і що "приблизний XGBoost" використовує евристику для його наближення. Ви можете бачити це таким чином, але історично ми мали загальний алгоритм збільшення градієнта, який не використовує інформацію про функцію витрат, крім похідної в поточній точці. XGBoost - це розширення до Gradient Boosting, яке намагається бути розумнішим щодо вирощування дерев слабких регресій, використовуючи більш точне наближення, ніж просто градієнт.

Інші способи вибрати найкращу модельhm(x)

Якщо ми розглянемо AdaBoost як особливий випадок збільшення градієнта, він не вибирає регресорів, а класифікаторів як слабких учнів. Якщо ми встановимо , спосіб AdaBoost вибирає найкращу модель шляхом пошукуhm(x){1,1}

hm=argmaxhmi=1Nwihm(xi)

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

Але ще раз, це не безпосередньо вимірювання того, що мінімізує . Це вимірювання того, наскільки хороший хід , щодо загального напрямку, який ви повинні пройти, вимірюється із залишками , які також є наближенням. Залишки говорять вам, в якому напрямку ви повинні рухатися за їх знаком, і приблизно на скільки їх величини, але вони не кажуть вам, де саме ви повинні зупинитися.hm(yi,Hm1(xi)+hm(xi))hmwi

Кращий градієнтний спуск

Наступні три приклади не є істотними для пояснення, і тут якраз можна представити кілька способів зробити краще, ніж спуск градієнта ванілі, щоб підтримати думку про те, що те, що робить XGBoost - це просто ще один спосіб поліпшення градієнтного спуску. У традиційних параметрах спуску градієнта, намагаючись мінімізувати , можна зробити краще, ніж просто слідувати за градієнтом. Запропоновано багато розширень (Вікіпедія) . Ось деякі з них, щоб показати, що можна зробити краще, враховуючи більше часу на обчислення або більше властивостей функції .f(x)f

  • Пошук рядків / зворотний трек: У Gradient Descent, як тільки обчислюється градієнт , наступною точкою має бутиf(x(i))

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

    Але градієнт дає лише напрямок, в якому слід рухатися, а не насправді на "скільки", тому можна використовувати іншу процедуру, щоб знайти найкращий такий, щоc>0

    xc(i+1)=x(i)cf(x(i))

    мінімізує функцію витрат. Для цього робиться оцінка для деякого , і оскільки функція повинна бути опуклою, це зробити досить просто за допомогою пошуку рядків (Wikipedia) або пошуку ліній (Wikipedia) . Тут основна вартість - оцінка . Таким чином, це розширення працює найкраще, якщо легко обчислити. Зауважте, що загальний алгоритм збільшення градієнта використовує пошук рядків, як показано на початку моєї відповіді.f(xc(i+1))cff(x)f

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

  • Стохастичний спуск градієнта та імпульс: У стохастичному спуску градієнта ви не оцінюєте градієнт за всіма точками, а лише за підмножиною цих точок. Ви робите крок, потім обчислюєте градієнт на іншій партії та продовжуєте рух. Стохастичний градієнт спуск може бути використаний, оскільки обчислення по всіх точках дуже дороге, або, можливо, всі ці точки навіть не вписуються в пам'ять. Це дозволяє зробити більше кроків, швидше, але менш точно.

    При цьому напрямок градієнта може змінюватися залежно від того, які точки відбираються. Для протидії цьому ефекту методи імпульсу зберігають ковзне середнє напрямок для кожного виміру, зменшуючи дисперсію в кожному русі.

Найбільш релевантним розширенням до градієнтного спуску в нашому обговоренні XGBoost є метод Ньютона (Wikipedia) . Замість того, щоб просто обчислити градієнт і слідувати за ним, він використовує похідну другого порядку, щоб зібрати більше інформації про напрямок, в який він повинен піти. Якщо ми використовуємо градієнтний спуск, ми маємо на увазі, що при кожній ітерації ми оновлюємо точку як далі,x(i)

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

А оскільки градієнт вказує на напрямок найвищого збільшення , його негативні точки в напрямку найбільшого зменшення, і ми сподіваємось, що . Це може бути недоступним, оскільки ми можемо зайти занадто далеко в напрямку градієнта (звідси розширення пошуку рядків), але це гарне наближення. У методі Ньютона ми оновлюємо так,f(x(i))ff(x(i+1))<f(x(i))x(i)

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

Де - гессіана у . Це оновлення враховує інформацію другого порядку, тому напрямок більше не є напрямком найвищого зменшення, а повинен бути більш точним у напрямку таким чином, що (або точка, де мінімальна, якщо немає нуля). Якщо - поліном другого порядку, то метод Ньютона, поєднаний з пошуком рядка, повинен мати можливість знайти мінімум за один крок.Hessf(x)fxx(i+1)f(x(i+1))=0ff

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

Тепер причина, по якій працює метод Ньютона, така ж, як і для наближення XGBoost, і спирається на розширення Тейлора (Wikipedia) та теорему Тейлора (Wikipedia) . Розширення Тейлора (або ряду Тейлора) функції у точці єf(x+a)

f(x)+f(x)xa+122f(x)x2a2+=n=01n!nf(x)xnan.

Зверніть увагу на подібність цього виразу з наближенням XGBoost. Теорема Тейлора стверджує, що якщо зупинити розширення в порядку , то помилка або різниця між і , максимум , де - функція з приємною властивістю, що вона переходить до нуля, як йде до нуля.kf(x+a)n=0k1n!nf(x)xnanhk(x)akhka

Якщо ви хочете зробити деяку візуалізацію того, наскільки добре вона наближає деякі функції, подивіться на сторінки вікіпедії, у них є деякі графіки для наближення неполіномічної функції, наприклад, , .exlog(x)

Варто зазначити, що наближення працює дуже добре, якщо ви хочете обчислити значення в околиці , тобто для дуже малих змін . Це те, що ми хочемо зробити в програмі Boosting. Звичайно, ми хотіли б знайти дерево, яке робить найбільші зміни. Якщо слабкі студенти, які ми будуємо, дуже хороші і хочуть зробити дуже великі зміни, то ми можемо довільно перешкоджати цьому, застосовуючи лише абоfxa0.10.01його дії. Це ступінчастість або швидкість навчання градієнтного спуску. Це прийнятно, тому що якщо наші слабкі студенти отримують дуже хороші рішення, це означає, що або проблема є легкою, і в цьому випадку ми все одно отримаємо хороше рішення, або перестараємося, тож підемо трохи або дуже багато чого в цьому поганому напрямку не змінює основної проблеми.

Отже, чим займається XGBoost і чому він працює?

XGBoost - алгоритм підвищення градієнта, який будує дерева регресії як слабких учнів. Традиційний алгоритм підвищення градієнта дуже схожий на спуск градієнта з пошуком лінії, де напрямок, в якому рухатись, вибирається з доступних слабких учнів. Наївна реалізація Gradient Boosting використала б функцію витрат слабкого учня, щоб пристосувати її до залишку. Це проксі для мінімізації витрат на нову модель, яку дорого обчислити. Що робить XGBoost - це побудувати функцію власної вартості, щоб підходити до дерев, використовуючи серію Taylor порядку 2 як наближення до функції справжньої вартості, так що можна бути більш впевненим, що дерево, яке вона вибирає, є хорошим. У цьому відношенні та в якості спрощення XGBoost полягає у підвищенні рівня градієнта, що є методом Ньютона для спуску градієнта.

Чому вони так побудували

Ваше запитання щодо того, чому використання цього наближення призводить до компромісу витрат / продуктивності. Ця функція вартості використовується для порівняння потенційних розщеплень для дерев регресії, тому, якщо наші точки мають сказати 50 особливостей, в середньому 10 різних значень, кожен вузол має 500 потенційних розщеплень, тому 500 оцінки функції. Якщо ви кинете безперервну функцію, кількість розщеплень вибухає, і оцінка розбиття називається все більше і більше (XGBoost має ще один трюк для боротьби з безперервними функціями, але це виходить за рамки). Оскільки алгоритм витратить більшу частину свого часу на оцінку розділів, спосіб прискорити алгоритм - прискорити оцінку дерева.

Якщо ви оцінили дерево за допомогою функції повної вартості, , це нове обчислення для кожного нового розбиття. Для того, щоб зробити оптимізацію в обчисленні функції витрат, вам потрібно мати інформацію про функцію витрат, яка полягає в усьому суті підвищення градієнта: вона повинна працювати для кожної функції витрат.

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

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

Тож єдине, що вам доведеться обчислити, це та , і тоді все, що залишилося, - це переважно доповнення та деякі множення. Більше того, якщо ви подивитесь на папір XGBoost (arxiv) , ви побачите, що вони використовують факт, що вони будують дерево, щоб додатково спростити вираз до купки підсумовування індексів, що дуже, дуже швидко.ft(xi)Ω(ft)

Підсумок

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

Апроксимація у використанні схожа на метод Ньютона , і її обґрунтовують серії Тейлора (Вікіпедія) та Теорема Тейлора (Вікіпедія) .

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

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


2
+1. Я мушу зізнатися, що я не прочитав цю відповідь (поки що?) І не можу судити про неї в будь-якому випадку, оскільки це не в моїй експертизі, але це виглядає настільки вражаюче, що я радий схвалити. Молодці [здається]!
амеба каже, що повернеться до Моніки

Це була відмінна відповідь. У мене є одне питання. Алгоритм підвищення градієнта відповідає дереву регресії до негативного градієнта з критерієм спліт. Як визначається структура дерева в XGBoost ??
гнікол

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