一文搞懂梯度下降法


梯度下降法,堪称训练神经网络的黑魔法。掌握该魔法,要先搞懂 梯度的概念。

梯度是什么东东?

梯度是一个多维向量。对于多元函数 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn)上的某一点 ( x 1 , x 2 , . . . , x n , y ) (x_1,x_2,...,x_n,y) (x1,x2,...,xn,y),其梯度被定义为 ⟨ ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ⟩ \left \langle \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2},...,\frac{\partial f}{\partial x_n} \right \rangle x1f,x2f,...,xnf,也就是说,函数的梯度作为一个向量,其分量等于各个自变量对应的偏导数。

梯度的方向和大小,具有直观的几何意义。可以证明(本文不证):,某点的梯度方向,总是指向函数值“变化率”最大的方向,而梯度的大小等于该“变化率”。

一元函数的变化率,就是该函数的导数;而刻画多元函数的“变化率”,则需要引入方向导数的概念。

对于一元函数,自变量只有增大和减小两个变化方向,而对于多元函数,自变量可以有任意多个变化方向。不妨以二元函数 f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2 为例。如下图:

方向导数

该图出自 geogebra 方向导数。访问该网址可以查看动态效果。

图中的点 P 0 ( 1 , 1 , 2 ) P_0(1,1,2) P0(1,1,2),在 x O y xOy xOy 平面上的投影为点 P ( 1 , 1 ) P(1,1) P(1,1)。红色的箭头所示的单位向量 u u u,表示 P 0 P_0 P0 点处函数 f f f 的一个自变量变化方向。设黑色的切线和 x O y xOy xOy 平面的夹角为 θ \theta θ,和一元函数类似, t a n ( θ ) tan(\theta) tan(θ) 等于函数 f f f P 0 P_0 P0 处沿着方向 u u u方向导数,用符号表示为 f u ′ ( 1 , 1 ) f_u^{'}(1,1) fu(1,1)

拖动图中的手柄,可以调整红色箭头 u u u 的方向。显然, u u u 可以在 x O y xOy xOy 平面中 360 度旋转,对应地, P 0 P_0 P0 点处方向导数 f u ′ ( 1 , 1 ) f_u^{'}(1,1) fu(1,1) 也会变化;当方向导数取到最大值时, u u u 的方向就是 P 0 P_0 P0 处变化率最大的方向,也就是 P 0 P_0 P0 处的梯度方向。

怎么个下降法

顾名思义,梯度下降法就是沿着梯度的反方向进行下降,直到找到函数的局部最小值或者全局最小值。

想象一下你在山上,站在某个点。如果你沿着不同的方向走,你会发现高度的变化率是不同的,也就是山的陡峭程度是不同的,而沿着梯度指向的方向,是最陡峭的。那么,每次沿着梯度的反方向迈出一小步,就能以最快的速度下山。

怎么判断你已经到了山谷呢?很简单,你只管沿着梯度的方向走,只要高度下再下降了,也就是梯度变成了 0 时,你就到了山谷。

显然,每一步迈出的距离大小,会影响下山的速度。这个步长,称之为学习率,记为 η \eta η

梯度下降法用于训练神经网络时,目标是最小化损失函数。什么叫损失函数这里先不用管,只要知道它是一个多元函数即可。

一个神经网络可以有成千上万的参数,对应地,损失函数可以有成千上万的自变量。

运行梯度下降法时,首先需要随机地初始化这些自变量,然后沿着梯度反方向迭代若干轮。

一般地,对于损失函数 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn),梯度下降法每次迭代,更新参数(自变量)的方式为:

x i ← x i − η ∂ f ∂ x i (式1) x_i \leftarrow x_i - \eta \frac{\partial f}{\partial x_i} \tag{式1} xixiηxif(1)

这个式子,就是训练神经网络时的魔法所在

你可能会好奇,一个拥有成千上万个自变量的函数,怎么对其求出每一个偏导数呢?这就要用到大名鼎鼎的误差逆传播算法了,这里也先跳过。

潜在的问题

陷入局部最小

梯度下降法可能会陷入局部最小值,而不是全局最小值。比如:如果初始位置位于局部最小值的附近,那么梯度下降法可能会很快找到该局部最小值然后停止,而不是全局最小值。

遭遇鞍点

鞍点

如上图所示,鞍点处的梯度为 0,但既不是极小值,也不是极大值。遭遇鞍点时,梯度下降法会终止。

学习率的选择

式 1 可以看到,学习率 η \eta η 的选择至关重要。

如果学习率设置得太小,那么梯度下降法就会非常缓慢地收敛,浪费计算资源。

如果学习率设置得太大,那么梯度下降法可能会在最小值附近来回震荡,无法收敛。

在求解多元线性回归模型时,梯度下降法和牛顿法是两种常用的优化技术,它们在原理和效率上存在显著差异。梯度下降法是一种迭代算法,通过逐步迭代更新模型参数来最小化损失函数。具体来说,它通过计算损失函数相对于模型参数的梯度,并沿着梯度的反方向(即下降最快的方向)更新参数,直到达到局部最小值或满足停止条件。 参考资源链接:[Python实现多元线性回归梯度下降法与牛顿法求极值详解](https://wenku.csdn.net/doc/6412b6e0be7fbd1778d484bb?spm=1055.2569.3001.10343) 牛顿法则是基于函数的二阶导数信息,利用泰勒级数展开来逼近函数的极值点。牛顿法在每一步迭代中使用Hessian矩阵(二阶导数矩阵)来计算最优下降方向,从而具有更快的收敛速度,尤其是接近最优解时。但由于牛顿法需要计算和存储Hessian矩阵,其计算成本相对较高,特别是在处理大规模数据时。 在Python中实现梯度下降法时,通常使用NumPy等科学计算库来计算梯度和更新参数。而牛顿法的实现则需要额外处理Hessian矩阵,这在SciPy优化库中可以找到相应的函数支持。 为了更好地理解这两种方法的差异,《Python实现多元线性回归梯度下降法与牛顿法求极值详解》一书提供了详细的理论基础和实际代码示例,使得读者可以亲身体验两种算法在实践中的应用和比较。 在实际应用中,选择哪种方法取决于问题的规模、参数空间的复杂度以及对计算效率的要求。对于大规模数据集,通常使用梯度下降法的变种,如随机梯度下降(SGD)来提高计算效率。而对于需要快速收敛到精确解的情况,则可能优先考虑牛顿法或者它的拟牛顿法变种。 总之,掌握梯度下降法和牛顿法的基本原理及其Python实现对于进行数值优化和机器学习模型的参数优化具有重要意义。有兴趣深入学习这些内容的读者,可以参考《Python实现多元线性回归梯度下降法与牛顿法求极值详解》这本书,它不仅涵盖了理论知识,还提供了丰富的实践案例,帮助读者更好地掌握这些优化算法。 参考资源链接:[Python实现多元线性回归梯度下降法与牛顿法求极值详解](https://wenku.csdn.net/doc/6412b6e0be7fbd1778d484bb?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值