为了使梯度下降正确工作,我们需要选择足够小的学习率 η,使得等式 (9) 是一个很好的近似值。如果我们不这样做,我们最终可能会得到,这显然不是很好!同时,我们不希望太小,因为这会使的变化很小,因此梯度下降算法会运行得很慢。在实际实现中,经常变化,因此等式 (9) 仍然是一个很好的近似值,但算法并不太慢。我们稍后会看到这是如何工作的。
但是在我们确定之前的几段,显然总是负的(对于正的)。那么如果我们不选择足够小的学习率怎么可能是正数呢?那里是什么意思?
为了使梯度下降正确工作,我们需要选择足够小的学习率 η,使得等式 (9) 是一个很好的近似值。如果我们不这样做,我们最终可能会得到,这显然不是很好!同时,我们不希望太小,因为这会使的变化很小,因此梯度下降算法会运行得很慢。在实际实现中,经常变化,因此等式 (9) 仍然是一个很好的近似值,但算法并不太慢。我们稍后会看到这是如何工作的。
但是在我们确定之前的几段,显然总是负的(对于正的)。那么如果我们不选择足够小的学习率怎么可能是正数呢?那里是什么意思?
如果学习率过大,可以“过冲”。想象一下,您正在使用梯度下降来最小化一维凸抛物线。如果你迈出一小步,你(可能)最终会比以前更接近最小值。但如果你迈出一大步,你可能最终会落到抛物线的另一边,甚至可能比以前更远离最小值!
这是一个简单的演示:处达到最小值;,所以我们的梯度更新形式为
如果我们从开始,我们可以绘制优化器的进度,对于,不难看出我们正在缓慢但肯定地接近最小值。

如果我们从开始,但选择,那么优化器就会发散。优化器不会在每次迭代中变得更接近最小值,而是总是过冲;显然,目标函数的变化在每一步都是正的。
为什么会超调?因为步长太大以至于损失的线性近似不是一个好的近似。这就是尼尔森写作时的意思
为了使梯度下降正确工作,我们需要选择足够小
换句话说,如果,则等式 (9) 不是一个好的近似值;您需要为选择一个较小的值。
对于起点,这两种制度之间的分界线是;在这个和奇数迭代的之间交替。对于,梯度下降从这个起点收敛;对于,梯度下降发散。
关于如何为二次函数选择好的学习率的一些信息可以在我的回答为什么二阶导数在凸优化中有用?
f <- function(x) x^2
grad_x <- function(x) 2*x
descent <- function(x0, N, gradient, eta=0.1){
x_traj <- numeric(N)
x_traj[1] <- x0
for(i in 2:N){
nabla_x_i <- grad_x(x_traj[i - 1])
x_traj[i] <- x_traj[i - 1] - eta * nabla_x_i
}
return(x_traj)
}
x <- seq(-2,2,length.out=1000)
x_traj_eta_01 <- descent(x0=-1.0, N=10, gradient=grad_x, eta=0.1)
png("gd_eta_0.1.png")
plot(x,f(x), type="l", sub=expression(paste(eta, "=0.1")), main="Gradient descent for f(x)=x * x")
lines(x_traj_eta_01, f(x_traj_eta_01), type="o", col="red", lwd=2)
dev.off()
png("gd_eta_1.125.png")
x_traj_eta_1125 <- descent(x0=-1.0, N=20, gradient=grad_x, eta=1.125)
plot(x,f(x), type="l", sub=expression(paste(eta, "=1.125")), main="Gradient descent for f(x)=x * x")
lines(x_traj_eta_1125, f(x_traj_eta_1125), type="o", col="red", lwd=2)
dev.off()