Approssimazione della funzione di perdita XGBoost con Taylor Expansion


28

Come esempio, assumere la funzione obiettivo del modello XGBoost sulla 'th iterazione:t

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

dove è la funzione di perdita, è la t 'th uscita albero e \ Omega è la regolarizzazione. Uno dei (molti) passaggi chiave per il calcolo veloce è l'approssimazione:fttΩ

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

dove gi e hi sono il primo e il secondo derivato della funzione di perdita.

Quello che sto chiedendo sono argomenti convincenti per demistificare il motivo per cui l'approssimazione di cui sopra funziona:

1) In che modo XGBoost con l'approssimazione di cui sopra si confronta con XGBoost con la funzione obiettivo completa? Quale comportamento potenzialmente interessante, di ordine superiore si perde nell'approssimazione?

2) È un po 'difficile da visualizzare (e dipende dalla funzione di perdita) ma, se la funzione di perdita ha una grande componente cubica, l'approssimazione probabilmente fallirà. Come mai questo non causa problemi per XGBoost?

Risposte:


62

Questa è una domanda molto interessante Per comprendere appieno ciò che stava succedendo, ho dovuto esaminare cosa XGBoost sta cercando di fare e quali altri metodi abbiamo avuto nella nostra cassetta degli attrezzi per gestirlo. La mia risposta va oltre i metodi tradizionali e come / perché XGBoost è un miglioramento. Se vuoi solo i punti elenco, alla fine c'è un riepilogo.

Aumento gradiente tradizionale

Considera il tradizionale Gradient Boosting Algorithm (Wikipedia) :

  • Calcola il modello base H0
  • Per m1:M
    • Calcola pseudo-residui rim=(yi,Hm1(xi))Hm1(xi)
    • Adatta uno studente di base agli pseudo-residuihm(x)
    • Calcola il moltiplicatore che minimizza il costo, , (utilizzando la ricerca di riga)γγ=argminγi=1N(yi,Hm1(xi)+γhm(xi))
    • Aggiorna il modello .Hm(x)=Hm1(x)+γhm(x)
  • Ottieni il tuo modello potenziato .HM(x)

L'approssimazione della funzione è importante per la parte seguente,

Adatta uno studente di base agli pseudo-residui.hm(x)

Immagina dove costruire il tuo Gradient Boosting Algorithm in modo ingenuo. Costruiresti l'algoritmo sopra usando gli alberi di regressione esistenti come discenti deboli. Supponiamo che non ti sia permesso di modificare l'implementazione esistente degli studenti deboli. In Matlab , il criterio di divisione predefinito è l'errore quadrato medio. Lo stesso vale per Scikit Learn .

Stai cercando di trovare il modello migliore che minimizzi il costo . Ma per fare ciò, stai adattando un semplice modello di regressione ai residui usando l'MSE come funzione oggettiva. Si noti che non si sta minimizzando direttamente ciò che si desidera, ma si utilizzano i residui e MSE come proxy per farlo. La parte negativa è che non fornisce necessariamente la soluzione ottimale. La parte buona è che funziona.hm(x)(yi,Hm1(xi)+hm(xi))

Discesa a gradiente tradizionale

Questo è analogo alla tradizionale Discesa del gradiente (Wikipedia) , in cui si sta tentando di minimizzare una funzione di costo seguendo il gradiente (negativo del) della funzione, ad ogni passo.f(x)f(x)

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

Non ti consente di trovare il minimo esatto dopo un passaggio, ma ogni passaggio ti avvicina al minimo (se la funzione è convessa). Questa è un'approssimazione, ma funziona molto bene ed è l'algoritmo che usiamo tradizionalmente per fare una regressione logistica, per esempio.

Interludio

A questo punto, la cosa da capire è che l'algoritmo di aumento del gradiente generale non calcola la funzione di costo per ogni possibile divisione, ma utilizza la funzione di costo dello studente debole di regressione per adattarsi ai residui.

Ciò che la tua domanda sembra implicare è che il "vero XGBoost" dovrebbe calcolare la funzione di costo per ogni divisione e che il "XGBoost approssimativo" sta usando un euristico per approssimarlo. Puoi vederlo in questo modo, ma storicamente abbiamo avuto l'algoritmo di aumento gradiente generale, che non utilizza informazioni sulla funzione di costo, tranne la derivata nel punto corrente. XGBoost è un'estensione di Gradient Boosting che cerca di essere più intelligente sulla crescita degli alberi di regressione debole utilizzando un'approssimazione più accurata del semplice gradiente.

Altri modi per scegliere il modello migliorehm(x)

Se diamo un'occhiata ad AdaBoost come caso speciale di aumento del gradiente, non seleziona regressori ma classificatori come discenti deboli. Se impostiamo , il modo in cui AdaBoost seleziona il modello migliore è trovandohm(x){1,1}

hm=argmaxhmi=1Nwihm(xi)

dove sono i residui ( fonte, inizia dalla diapositiva 20 ). Il ragionamento per l'uso di questa funzione oggettiva è che se e vanno nella stessa direzione / hanno lo stesso segno, il punto si sposta nella giusta direzione e si sta tentando di massimizzare la massima quantità di movimento in la giusta direzione.wiw i h m ( x i )wihm(xi)

Ma ancora una volta, questo non sta misurando direttamente quale minimizza . Sta misurando quanto è buona la mossa , rispetto alla direzione generale da seguire, misurata con i residui , che sono anche un'approssimazione. I residui ti dicono in quale direzione dovresti muoverti in base al loro segno e all'incirca di quanto in base alla loro grandezza, ma non ti dicono esattamente dove dovresti fermarti.hm(yi,Hm1(xi)+hm(xi))hmwi

Discesa con pendenza migliore

I prossimi tre esempi non sono essenziali per la spiegazione e sono qui solo per presentare alcuni modi per fare meglio di una discesa con gradiente vaniglia, per sostenere l'idea che ciò che XGBoost fa è solo un altro modo per migliorare la discesa con gradiente. In un'impostazione di discesa gradiente tradizionale, quando si cerca di minimizzare , è possibile fare meglio che seguire semplicemente il gradiente. Sono state proposte molte estensioni (Wikipedia) . Eccone alcuni, per dimostrare che è possibile fare di meglio, dati più tempo di calcolo o più proprietà della funzione .f(x)ff

  • Ricerca riga / Backtracking: in Discendente gradiente, una volta calcolato il gradiente , il punto successivo dovrebbe esseref(x(i))

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

    Ma il gradiente fornisce solo la direzione in cui si dovrebbe muovere, non proprio di "quanto", quindi un'altra procedura può essere usata, per trovare il miglior tale chec>0

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

    minimizza la funzione di costo. Questo viene fatto valutando per alcuni , e poiché la funzione deve essere convessa, è relativamente facile eseguire la ricerca di riga (Wikipedia) o la ricerca di backtracking (Wikipedia) . Qui, il costo principale è la valutazione . Quindi questa estensione funziona meglio se è facile da calcolare. Si noti che l'algoritmo generale per l'incremento gradiente utilizza la ricerca di linee, come mostrato all'inizio della mia risposta.f(xc(i+1))cff(x)ff(x)f

  • Metodo del gradiente prossimale veloce: se la funzione da minimizzare è fortemente convessa e il suo gradiente è regolare ( Lipschitz (Wikipedia) ), allora ci sono alcuni trucchi che usano quelle proprietà che accelerano la convergenza.

  • Discesa gradiente stocastica e metodo Momentum: in Discesa gradiente stocastica, non si valuta la sfumatura su tutti i punti, ma solo su un sottoinsieme di quei punti. Fai un passo, quindi calcola il gradiente su un altro batch e continua. La Discesa gradiente stocastica può essere usata perché il calcolo su tutti i punti è molto costoso, o forse tutti quei punti non si adattano nemmeno alla memoria. Ciò ti consente di compiere più passaggi, più rapidamente, ma in modo meno preciso.

    Nel fare ciò, la direzione del gradiente potrebbe cambiare a seconda di quali punti vengono campionati. Per contrastare questo effetto, i metodi momentum mantengono una media mobile della direzione per ogni dimensione, riducendo la varianza in ogni movimento.

L'estensione più rilevante alla discesa gradiente nella nostra discussione su XGBoost è il metodo di Newton (Wikipedia) . Invece di calcolare semplicemente il gradiente e seguirlo, usa la derivata del secondo ordine per raccogliere maggiori informazioni sulla direzione in cui dovrebbe andare. Se utilizziamo la discesa gradiente, lo abbiamo ad ogni iterazione, aggiorniamo il nostro punto come segue,x(i)

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

E poiché il gradiente indica la direzione del più alto aumento di , i suoi punti negativi nella direzione della più bassa diminuzione e speriamo che . Questo potrebbe non valere, poiché potremmo andare troppo lontano nella direzione del gradiente (da qui l'estensione di ricerca della linea), ma è una buona approssimazione. Nel metodo di Newton, aggiorniamo come segue,f(x(i))ff(x(i+1))<f(x(i))x(i)

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

Dove è l'Assia di in . Questo aggiornamento tiene conto delle informazioni del secondo ordine, quindi la direzione non è più la direzione della diminuzione più alta, ma dovrebbe puntare più precisamente verso tale che (o il punto in cui è minimo, se non c'è zero). Se è un polinomio di secondo ordine, il metodo di Newton associato a una ricerca di riga dovrebbe essere in grado di trovare il minimo in un passaggio.Hessf(x)fxx(i+1)f(x(i+1))=0ff

Il metodo di Newton contrasta con la discesa gradiente stocastica. In Stochastic Gradient Descent, usiamo meno punti per impiegare meno tempo per calcolare la direzione verso cui dovremmo andare, al fine di farne di più, nella speranza di andarci più velocemente. Nel metodo di Newton, prendiamo più tempo per calcolare la direzione in cui vogliamo andare, nella speranza che dobbiamo fare meno passi per arrivarci.

Ora, il motivo per cui il metodo di Newton funziona è lo stesso per cui funziona l'approssimazione XGBoost e si basa sull'espansione di Taylor (Wikipedia) e sul teorema di Taylor (Wikipedia) . L'espansione di Taylor (o serie di Taylor) di una funzione in un punto èf(x+a)

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

Nota la somiglianza tra questa espressione e l'approssimazione che XGBoost sta usando. Il teorema di Taylor afferma che se si interrompe l'espansione nell'ordine , l'errore o la differenza tra e , è al massimo , dove è una funzione con la proprietà piacevole che va a zero come va a zero.kf(x+a)n=0k1n!nf(x)xnanhk(x)akhka

Se vuoi una visualizzazione di come approssima alcune funzioni, dai un'occhiata alle pagine di Wikipedia, hanno alcuni grafici per l'approssimazione di funzioni non polinomiali come , .exlog(x)

La cosa da notare è che l'approssimazione funziona molto bene se si desidera calcolare il valore di nel vicinato di , cioè per cambiamenti molto piccoli . Questo è ciò che vogliamo fare in Boosting. Naturalmente vorremmo trovare l'albero che apporta il cambiamento più grande. Se gli studenti deboli che costruiamo sono molto bravi e vogliono fare un grande cambiamento, allora possiamo arbitrariamente ostacolarlo applicando solo ofxa0.10.01del suo effetto. Questa è la dimensione del passo o il tasso di apprendimento della discesa del gradiente. Questo è accettabile, perché se i nostri deboli studenti stanno ottenendo ottime soluzioni, ciò significa che o il problema è facile, nel qual caso finiremo comunque con una buona soluzione, o ci stiamo adattando troppo, quindi andando un po 'o molto molto in questa cattiva direzione non cambia il problema di fondo.

Cosa sta facendo XGBoost e perché funziona?

XGBoost è un algoritmo di aumento gradiente che costruisce alberi di regressione come discenti deboli. Il tradizionale algoritmo di incremento del gradiente è molto simile a una discesa del gradiente con una ricerca di linea, in cui la direzione in cui andare viene tracciata dagli studenti deboli disponibili. L'implementazione ingenua di Gradient Boosting userebbe la funzione di costo del discente debole per adattarlo al residuo. Questo è un proxy per ridurre al minimo il costo del nuovo modello, che è costoso da calcolare. Quello che XGBoost sta facendo è costruire una funzione di costo personalizzata per adattarsi agli alberi, usando la serie Taylor di ordine due come approssimazione per la funzione di costo reale, in modo tale che possa essere più sicuro che l'albero che prende è buono. A questo proposito, e come una semplificazione, XGBoost consiste nel Gradient Promuovere quello che il Metodo di Newton consiste nel Gradient Descent.

Perché l'hanno costruito in quel modo

La tua domanda sul perché l'utilizzo di questa approssimazione arriva a un compromesso costi / prestazioni. Questa funzione di costo viene utilizzata per confrontare le potenziali divisioni per gli alberi di regressione, quindi se i nostri punti hanno 50 caratteristiche, con una media di 10 valori diversi, ogni nodo ha 500 potenziali divisioni, quindi 500 valutazione della funzione. Se si rilascia una funzione continua, il numero di suddivisioni esplode e la valutazione della suddivisione viene chiamata sempre più (XGBoost ha un altro trucco per gestire le funzionalità continue, ma non rientra nell'ambito di applicazione). Poiché l'algoritmo impiegherà la maggior parte del suo tempo a valutare le suddivisioni, il modo per accelerare l'algoritmo è accelerare la valutazione dell'albero.

Se hai valutato l'albero con la funzione di costo completo, , si tratta di un nuovo calcolo per ogni nuova suddivisione. Per eseguire l'ottimizzazione nel calcolo della funzione di costo, è necessario disporre di informazioni sulla funzione di costo, che è l'intero punto di incremento gradiente: dovrebbe funzionare per ogni funzione di costo.

L'approssimazione del secondo ordine è buona dal punto di vista computazionale, poiché la maggior parte dei termini sono gli stessi in una data iterazione. Per una data iterazione, la maggior parte dell'espressione può essere calcolata una volta e riutilizzata come costante per tutte le suddivisioni:

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

Quindi l'unica cosa che devi calcolare è e , e quindi ciò che rimane sono principalmente aggiunte e alcune moltiplicazioni. Inoltre, se dai un'occhiata al documento XGBoost (arxiv) , vedrai che usano il fatto che stanno costruendo un albero per semplificare ulteriormente l'espressione fino a un mucchio di sommatoria di indici, che è molto, molto veloce.ft(xi)Ω(ft)

Sommario

Puoi vedere XGBoost (con approssimazione) come una regressione dalla soluzione esatta, un'approssimazione del "vero XGBoost", con una valutazione esatta. Ma poiché la valutazione esatta è così costosa, un altro modo per vederlo è che su enormi set di dati, l'approssimazione è tutto ciò che possiamo realisticamente fare, e questa approssimazione è più accurata dell'approssimazione del primo ordine che farebbe un algoritmo "ingenuo" di gradiente .

L'approssimazione in uso è simile al Metodo di Newton ed è giustificata da Taylor Series (Wikipedia) e Taylor Theorem (Wikipedia) .

Le informazioni di ordine superiore non sono effettivamente completamente utilizzate, ma non sono necessarie, poiché desideriamo una buona approssimazione nelle vicinanze del nostro punto di partenza .

Per la visualizzazione, controlla la pagina Wikipedia della serie Taylor / Teorema di Taylor , o Khan Academy sull'approssimazione della serie Taylor , o la pagina MathDemo sull'approssimazione polinomiale di non polinomi


2
+1. Devo confessare che non ho letto questa risposta (ancora?) E non posso giudicarla comunque perché è al di fuori delle mie competenze, ma sembra così impressionante che sono felice di votare. Ben fatto [sembra]!
ameba dice Ripristina Monica il

Questa è stata una risposta eccellente. Ho una domanda però: l'algoritmo di aumento gradiente adatta un albero di regressione al gradiente negativo con criterio di divisione il mse. Come viene determinata la struttura ad albero in XGBoost ??
gnikol

Hai inchiodato la risposta, bel lavoro!
Marcin Zablocki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.