R
為什麼在梯度下降中使用固定步長時我的步數越來越小?
假設我們正在做一個關於梯度下降的玩具示例,最小化二次函數, 使用固定步長. ()
如果我們繪製軌跡在每次迭代中,我們得到下圖。當我們使用固定步長時,為什麼點會變得“非常密集” ?直觀上看,它看起來不像是固定的步長,而是逐漸減小的步長。
PS:R代碼包括情節。
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")
讓在哪裡是對稱且正定的(根據您的示例,我認為這個假設是安全的)。然後我們可以對角化作為. 使用基數變化. 然後我們有
是對角線所以我們得到我們的更新
這意味著控制收斂,我們只有在. 在你的情況下,我們有
所以
我們在與具有特徵值的特徵向量對應的方向上相對較快地收斂從迭代如何快速下降拋物面的陡峭部分可以看出,但在特徵值較小的特徵向量方向上收斂很慢,因為如此接近. 所以即使學習率是固定的,在這個方向上的實際步幅衰減大約根據它變得越來越慢。這就是這個方向的進展呈指數級放緩的原因(它發生在兩個方向上,但另一個方向很快就足夠近了,以至於我們沒有註意到或關心)。在這種情況下,收斂會快得多,如果增加了。
為了對此進行更好和更徹底的討論,我強烈推薦https://distill.pub/2017/momentum/。