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 :
∂Σni = 1L ( xio| Θ)XioΘL ( ) θj
∂∂θjΣi = 1nL ( Θ | xio)
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√
∂∂θjΣk = 1nSL ( Θ | xK)
nSS mentre la quantità di calcolo aumenta in
n, quindi questo trucco potrebbe funzionare.
n--√n
In alternativa, invece di attendere fino al calcolo della somma completa , è possibile dividerlo in lotti ed eseguire un passaggio per ciascun lotto ∑ M s = 1 ∑ n 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.Σni = 1ΣMs = 1ΣnSioS= 1