为什么在梯度下降中使用固定步长时我的步数越来越小?

机器算法验证 r 机器学习 优化 梯度下降
2022-03-17 03:12:02

假设我们正在做一个关于梯度下降的玩具示例,最小化二次函数xTAx, 使用固定步长α=0.03. (A=[10,2;2,3])

如果我们绘制轨迹x在每次迭代中,我们得到下图。当我们使用固定步长时,为什么点会变得“非常密集” ?直观上看,它看起来不像是固定的步长,而是逐渐减小的步长。

在此处输入图像描述


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")
2个回答

f(x)=12xTAx在哪里A是对称且正定的(根据您的示例,我认为这个假设是安全的)。然后f(x)=Ax我们可以对角化A作为A=QΛQT. 使用基数变化y=QTx. 然后我们有

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

Λ是对角线所以我们得到我们的更新

y(n+1)=y(n)αΛy(n)=(IαΛ)y(n)=(IαΛ)n+1y(0).

这意味着1αλi控制收敛,我们只有在|1αλi|<1. 在你的情况下,我们有

Λ(10.5002.5)
所以
IαΛ(0.89000.98).

我们在与具有特征值的特征向量对应的方向上相对较快地收敛λ10.5从迭代如何快速下降抛物面的陡峭部分可以看出,但在特征值较小的特征向量方向上收敛很慢,因为0.98如此接近1. 所以即使学习率α是固定的,在这个方向上的实际步幅衰减大约根据(0.98)n它变得越来越慢。这就是这个方向的进展呈指数级放缓的原因(它在两个方向上都发生,但另一个方向很快就足够近了,以至于我们没有注意到或关心)。在这种情况下,收敛会快得多,如果α增加了。

为了对此进行更好和更彻底的讨论,我强烈推荐https://distill.pub/2017/momentum/

对于平滑函数,f=0在局部最小值。

因为您的更新方案是αf, 幅度|f|控制步长。在你的二次方的情况下|Δf|0以及(在您的情况下只需计算二次的粗麻布)。请注意,这并不总是正确的。例如尝试相同的方案f(x)=x. 那么你的步长总是α因此永远不会减少。或者更有趣的是,f(x,y)=x+y2,梯度在 y 坐标上变为 0,但不是x协调。有关二次方的方法,请参阅 Chaconne 的答案。