Perché la discesa gradiente non è efficace per grandi serie di dati?


13

Supponiamo che il nostro set di dati contenga 1 milione di esempi, ovvero e desideriamo utilizzare la discesa gradiente per eseguire una regressione logistica o lineare su questi set di dati.x1,,x106

Cos'è con il metodo di discesa gradiente che lo rende inefficiente?

Ricordiamo che il passo di discesa del gradiente al tempo è dato da:t

wt+1=wt+ηtf(x)

dove è la funzione di perdita.f

Non vedo nulla fuori dall'ordinario con il passaggio sopra che rende l'algoritmo inefficiente. È il calcolo di ? Non è possibile pre-calcolare questa operazione, ovvero ogni già stato calcolato e semplicemente valutarli in ciascun punto datiff(x) xi?fxxi?


1
Inefficiente rispetto a ...? Anche i quadrati meno inefficienti per un set di dati di grandi dimensioni. È necessaria una notazione O grande per avere idee significative su ciò che la fa all'algoritmo. Non tutti gli algoritmi GD hanno lo stesso grande O. (vero?)n
AdamO

Risposte:


7

Sarebbe utile se fornissi un contesto all'affermazione che la discesa del gradiente è inefficiente. Inefficiente rispetto a cosa?

Immagino che il contesto mancante qui sia il confronto con la discendenza stocastica o gradiente batch nell'apprendimento automatico. Ecco come rispondere alla domanda in questo contesto. Stai ottimizzando i parametri del modello, anche iperparametri. Quindi, hai la funzione di costo , dove x i - i tuoi dati e Θ - vettore dei parametri e L ( ) - funzione di perdita. Per ridurre al minimo questo costo, utilizzare la discesa gradiente sui parametri θ j : i=1nL(xi|Θ)xiΘL() θj

θji=1nL(Θ|xi)

Quindi, vedi che devi ottenere la somma su tutti i dati . Questo è un peccato, perché significa che continui a scorrere i dati per ogni passaggio della discesa del gradiente. È così che arriva la discesa del gradiente batch e stocastico: cosa succederebbe se campionassimo dal set di dati e calcolassimo il gradiente su un campione, non sul set completo? xi=1,,n Qui,nsè il numero di osservazioni nel campiones. Quindi, se il tuo campione è 1/100 del set totale, acceleri i tuoi calcoli di 100 volte! Ovviamente, questo introduce il rumore, che allunga l'apprendimento, ma il rumore diminuisce al ritmo di

θjk=1nsL(Θ|xk)
nss mentre la quantità di calcolo aumenta inn, quindi questo trucco potrebbe funzionare.nn

In alternativa, invece di attendere fino al calcolo della somma completa , è possibile dividerlo in lotti ed eseguire un passaggio per ciascun lotto M s = 1n s i s = 1 . In questo modo avresti fatto M passi quando viene calcolata la somma sull'intero set di dati. Questi sarebbero passi più rumorosi, ma il rumore si annulla nel tempo.i=1ns=1Mis=1ns


19

Esistono due modi in cui la discesa del gradiente può essere inefficiente. È interessante notare che ognuno conduce al proprio metodo di riparazione, che sono soluzioni quasi opposte. I due problemi sono:

(1) Sono richiesti troppi aggiornamenti di discesa gradiente.

(2) Ogni fase di discesa del gradiente è troppo costosa.

Per quanto riguarda (1), confrontando la discesa del gradiente con metodi che tengono conto delle informazioni sui derivati ​​del secondo ordine, la discesa del gradiente tende ad essere altamente inefficiente per quanto riguarda il miglioramento della perdita ad ogni iterazione. Un metodo molto standard, il Metodo di Newton , richiede generalmente molte meno iterazioni per convergere, vale a dire per la regressione logistica, 10 iterazioni del Metodo di Newton avranno spesso una perdita inferiore rispetto alla soluzione fornita da 5.000 iterazioni di discesa gradiente. Per la regressione lineare, questo è ancora più estremo; c'è una soluzione a forma chiusa! Tuttavia, poiché il numero di predittori diventa molto elevato (ovvero 500+), il metodo di Newton / la risoluzione diretta della regressione lineare può diventare troppo costoso per iterazione a causa della quantità di operazioni di matrice richieste, mentre la discesa del gradiente avrà un costo notevolmente inferiore per iterazione.

Per quanto riguarda (2), è possibile avere un set di dati così grande che ogni iterazione della discesa del gradiente è troppo costosa per essere calcolata. Il calcolo del gradiente richiederà operazioni ( n = dimensione del campione, k = numero di covariate). Mentre n = 10 6 non è affatto un problema sui computer moderni per valori di k < 100 , sicuramente qualcosa come n = 10 12 , k = 10 3O(nk)nkn=106k<100n=1012k=103sarà. In questo caso, i metodi che si avvicinano alla derivata in base a sottoinsiemi più piccoli dei dati sono più interessanti, come la discesa gradiente stocastica .

Dico che queste correzioni sono quasi opposte, in quanto qualcosa come il metodo di Newton è più costoso ma più efficiente (in termini di variazione della perdita) per aggiornamento, mentre la discesa gradiente stocastica è in realtà meno efficiente ma molto più computazionalmente più economica per aggiornamento.


k

2
@Learningonepageatatime: covariates = variabili predittive.
Cliff AB,

10

L(w)f(x)LwxwX

L(w)=(Lw1,...,LwD),
D

wX

L(w)=Σio=1N(yio-wTXio)2.
L(w)wNXN=106

3

Risposta breve: il calcolo del gradiente deve essere sommato su tutti i punti dati. Se disponiamo di grandi quantità di dati, ci vorrà molto tempo.

Ho una risposta dettagliata qui.

In che modo la discesa gradiente stocastica può far risparmiare tempo rispetto alla discesa gradiente standard?


D'altra parte, tieni sempre presente che ci sono metodi diretti oltre ai metodi iterativi (gradiente decente). Se vogliamo risolvere un problema almeno quadrato, il metodo diretto può essere super efficiente. Ad esempio, decomposizione QR. Se non abbiamo troppe funzionalità, è molto veloce.

Quando lo verifichi, potrebbe sorprenderti: 5 milioni di punti dati con 2 funzioni, Risolvere la regressione lineare / il minimo quadrato richiede un paio di secondi!

x=matrix(runif(1e7),ncol=2)
y=runif(5e6)
start_time <- Sys.time()
lm(y~x)
end_time <- Sys.time()
end_time - start_time
# Time difference of 4.299081 secs

1

Sebbene i due esempi che hai citato di solito siano convessi, aggiungerò un punto sui problemi non convessi. Secondo me ci sono due ragioni principali per cui la discesa del gradiente (batch) potrebbe essere considerata "inefficiente". Il primo punto sullo sforzo computazionale di calcolare il gradiente di una "grande" somma di funzioni è già stato delineato molto chiaramente nelle altre risposte. Per problemi non convessi, tuttavia, GD ha il problema di rimanere bloccato in un minimo locale "stretto". Questo minimo potrebbe essere molto negativo rispetto al minimo globale. SGD o GD mini-batch hanno il "vantaggio" di vagare (almeno parzialmente) in modo casuale e quindi potrebbero avere la possibilità di trovare un minimo locale migliore. Vedi questa risposta CV qui . O questo altro post CV delineando come la casualità potrebbe essere utile.

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.