Esercizio - Discesa del gradiente per il LASSO e scelta del passo
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 4
Testo. Una sola feature centrata e uscita centrata (i dati , senza media; l'intercetta vale e non si penalizza). Il costo del LASSO è
- Scrivere il subgradiente di e il passo di aggiornamento.
- Con eseguire la discesa del gradiente con passo partendo da , confrontare con la soluzione esatta e dire per quali l'algoritmo converge.
- Ripetere con e spiegare il comportamento; mostrare l'effetto del passo adattivo .
Teoria usata: LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente → (subgradiente, passo, soglia morbida); derivate in Derivata - definizione e significatoLa derivata è il limite del rapporto incrementale; geometricamente è la pendenza della retta tangente. f è derivabile in x0 se e solo se f(x) = f(x0) + f'(x0)(x − x0) + o(x − x0); derivabile implica continua, non viceversa. Derivata destra e sinistra, punti angolosi, flessi a tangente verticale, cuspidi.Derivata - definizione e significato → e in più variabili Differenziabilità e gradientef è differenziabile in x0 se f(x) = f(x0) + ∇f(x0)·(x − x0) + o(‖x − x0‖): vicino a x0 il grafico si confonde con il piano tangente z = f(x0) + ∇f(x0)·(x − x0). Differenziabile ⇒ continua, derivabile e D_v f = ∇f·v; derivate parziali continue ⇒ differenziabile. Il gradiente indica la direzione di massima crescita (pendenza ‖∇f‖) ed è ortogonale alle curve di livello.Differenziabilità e gradiente →; autovalori in Autovalori e autovettoriUn autovettore è un vettore non nullo che una funzione lineare manda in un suo multiplo; si trovano gli autovalori come radici del polinomio caratteristico det(A − λI) e gli autovettori come nucleo di A − λI. Matrici simili hanno gli stessi autovalori.Autovalori e autovettori →.
1. Subgradiente
Il termine quadratico: . Servono e , quindi il termine vale e la sua derivata è . Il termine ha subgradiente (con , e in qualunque valore in ). Quindi
Soluzione esatta (soglia morbida): per , (accettabile se ); per , (se , impossibile); se il minimo è (in il subdifferenziale contiene se ). Il coefficiente OLS è .
2. ,
Soluzione esatta . Iterazioni, :
| subgradiente | |||
|---|---|---|---|
| 0 | (con ) | ||
| 1 | |||
| 2 | |||
| 3 | |||
| 4 |
Si vede che l'errore si dimezza a ogni passo: (infatti per , ). Dopo 8 passi .
Condizione di convergenza. L'errore si moltiplica per ad ogni passo, quindi serve . Si ritrova la regola , con (): . Con (troppo grande) si ottiene : oscilla e diverge. Con il fattore è : dopo il primo passo () il secondo arriva esattamente a (un caso fortunato di questo problema a una variabile).
3. : la soluzione è zero
Poiché la soluzione esatta è (il LASSO azzera la feature). Con il subgradiente non converge a zero: . Il valore oscilla attorno a zero senza fermarsi, con ampiezza dell'ordine di : subito sotto zero il termine spinge con forza verso valori positivi. Con l'oscillazione è più piccola (, cioè entro ) ma resta.
Passo adattivo. Con l'ampiezza decresce: dopo 60 iterazioni . Quindi:
- il subgradiente dà soluzioni approssimate vicino a zero ma non zeri esatti; per ottenerli si tronca a zero quando è sotto una tolleranza, oppure si usa la soglia morbida (metodi per coordinate, LARS);
- il passo che decresce stabilizza l'iterazione.
Verifica
import numpy as np
x = np.array([-1.5, -.5, .5, 1.5]); yc = np.array([-1.5, -.5, 1.5, .5])
def gd(lam, eta, n, gamma=0.0):
b = 0.0
for t in range(n):
g = 2 * x @ (b * x - yc) + lam * np.sign(b) # = 10 b - 8 + lam sign(b)
b -= eta / (1 + gamma * t) * g
return b
print(gd(2, 0.05, 60)) # 0.6
print(gd(2, 0.25, 6)) # diverge
print(gd(10, 0.05, 60, gamma=0.2)) # ~0.01: vicino a 0