Dlaczego moje kroki stają się coraz mniejsze, gdy używam ustalonego rozmiaru kroku podczas opadania gradientu?

9

Załóżmy, że robimy zabawkowy przykład na przyzwoitym gradiencie, minimalizując funkcję kwadratową , stosując ustalony rozmiar kroku . ( A = [10, 2; 2, 3] )xTAxα=0.03A=[10,2;2,3]

Jeśli wykreślimy ślad x w każdej iteracji, otrzymamy następujący rysunek. Dlaczego punkty stają się „gęste”, gdy używamy ustalonego rozmiaru kroku? Intuicyjnie nie wygląda jak stały rozmiar kroku, ale malejący rozmiar kroku.

wprowadź opis zdjęcia tutaj


Kod PS: R obejmuje działkę.

A=rbind(c(10,2),c(2,3))
f <-function(x){
  v=t(x) %*% A %*% x
  as.numeric(v)
}
gr <-function(x){
  v = 2* A %*% x
  as.numeric(v)
}

x1=seq(-2,2,0.02)
x2=seq(-2,2,0.02)
df=expand.grid(x1=x1,x2=x2)
contour(x1,x2,matrix(apply(df, 1, f),ncol=sqrt(nrow(df))), labcex = 1.5, 
        levels=c(1,3,5,10,20,40))
grid()

opt_v=0
alpha=3e-2
x_trace=c(-2,-2)
x=c(-2,-2)
while(abs(f(x)-opt_v)>1e-6){
  x=x-alpha*gr(x)
  x_trace=rbind(x_trace,x)
}
points(x_trace, type='b', pch= ".", lwd=3, col="red")
text(x_trace, as.character(1:nrow(x_trace)), col="red")
Haitao Du
źródło
Twój kod nie pasuje do opisu: używa alpha=3e-2zamiast . 0.01
whuber

Odpowiedzi:

12

Niech gdzie jest symetryczne i dodatnio określone (myślę, że to założenie jest bezpieczne na podstawie twojego przykładu). Następnie i może diagonalize jako . Użyj zmiany podstawy . Następnie mamy f(x)=12xTAxAf(x)=AxAA=QΛQTy=QTx

f(y)=12yTΛyf(y)=Λy.

Λ jest ukośna, więc otrzymujemy nasze aktualizacje jako

y(n+1)=y(n)-αΛy(n)=(ja-αΛ)y(n)=(ja-αΛ)n+1y(0).

Oznacza to, że zarządza konwergencją, a my uzyskujemy konwergencję tylko wtedy, gdy . W twoim przypadku mamy więc 1-αλja|1-αλja|<1

Λ(10.5002.5)
ja-αΛ(0,89000,98).

Względnie szybko uzyskujemy zbieżność w kierunku odpowiadającym wektorowi własnemu o wartości własnej co widać po tym, jak iteraty dość szybko schodzą z bardziej stromej części paraboloidu, ale zbieżność jest powolna w kierunku wektora własnego o mniejszej wartości własnej, ponieważ jest tak blisko . Więc nawet jeśli szybkość uczenia się jest stała, rzeczywiste wielkości kroków w tym kierunku zanikają zgodnie z okołoλ10.50,981α(0,98)nktóry staje się coraz wolniejszy. To jest przyczyną tego wykładniczo spowolnionego postępu w tym kierunku (dzieje się to w obu kierunkach, ale drugi kierunek zbliża się wystarczająco szybko, abyśmy nie zauważyli ani nie przejmowali się). W takim przypadku konwergencja byłaby znacznie szybsza, gdyby zwiększono .α

Aby uzyskać znacznie lepszą i dokładniejszą dyskusję na ten temat, zdecydowanie polecam https://distill.pub/2017/momentum/ .

jld
źródło
dzięki za szczegółową odpowiedź i świetne referencje! zmiana podstawy naprawdę mi pomogła. y
Haitao Du
11

Dla płynnej funkcji fa=0 według lokalnych minimów.

Ponieważ twój schemat aktualizacji to αfa, wielkość |fa|kontroluje rozmiar kroku. W przypadku twojego kwadratu|Δfa|0również (po prostu oblicz hessian kwadratyki w twoim przypadku). Pamiętaj, że nie zawsze musi to być prawda. Na przykład wypróbuj ten sam schematfa(x)=x. Twój rozmiar kroku jest zawszeαdlatego nigdy się nie zmniejszy. Lub, co ciekawsze,fa(x,y)=x+y2), gdzie gradient idzie do 0 we współrzędnej y, ale nie do xkoordynować. Zobacz odpowiedź Chaconne na metodologię dla kwadratów.

Alex R.
źródło