理解梯度下降:从梯度到多步迭代更新
引言
梯度下降是一种常用的优化算法,用于寻找多元函数的最小值点。它基于一个简单的想法:沿着函数增长最快方向的反方向(即函数减少最快的方向)更新参数,逐步逼近函数的最小值。本文将详细介绍梯度的概念、梯度下降的基本原理以及一个使用梯度下降进行多步迭代更新的具体例子。
梯度
梯度是一个向量,它表示了多元函数在某一点上方向导数的最大值及其方向。梯度提供了函数增长最快的方向以及该方向上的增长率。
定义
对于一个多元函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \ldots, x_n) f(x1,x2,…,xn),其在点 ( x 1 , x 2 , … , x n ) (x_1, x_2, \ldots, x_n) (x1,x2,…,xn) 处的梯度是一个向量,定义为所有偏导数组成的向量:
∇ f ( x 1 , x 2 , … , x n ) = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , … , ∂ f ∂ x n ) \nabla f(x_1, x_2, \ldots, x_n) = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right) ∇f(x1,x2,…,xn)=(∂x1∂f,∂x2∂f,…,∂xn∂f)
梯度的性质
- 方向:梯度指向函数增长最快的方向。
- 大小:梯度的模长给出了函数沿该方向的增长率。
- 正交性:梯度向量与函数的等值线(等高线在二维情况下)垂直。
梯度下降
梯度下降是一种常用的优化算法,用于寻找多元函数的最小值点。它的基本思想是沿着梯度的反方向(即函数减少最快的方向)更新参数,逐步逼近函数的最小值。
梯度下降步骤
- 初始化参数:选择初始参数值。
- 计算梯度:在当前参数值下计算目标函数的梯度。
- 更新参数:沿着梯度的反方向更新参数,更新公式如下:
θ : = θ − α ∇ f ( θ ) \theta := \theta - \alpha \nabla f(\theta) θ:=θ−α∇f(θ)
- 其中 θ \theta θ 表示参数向量,
- α \alpha α 是学习率,决定了每次更新步长的大小,
- ∇ f ( θ ) \nabla f(\theta) ∇f(θ) 是目标函数 f f f 在当前参数 θ \theta θ 下的梯度。
- 重复步骤2和3,直到满足停止条件(例如梯度足够小或达到最大迭代次数)。
示例:多步更新
假设我们有一个二元函数 f ( x , y ) = x 2 + 2 x y + y 2 f(x, y) = x^2 + 2xy + y^2 f(x,y)=x2+2xy+y2,并且我们想要使用梯度下降来找到它的最小值。
函数定义
我们的目标是最小化函数 f ( x , y ) = x 2 + 2 x y + y 2 f(x, y) = x^2 + 2xy + y^2 f(x,y)=x2+2xy+y2。
计算梯度
首先,我们需要计算函数 f ( x , y ) f(x, y) f(x,y) 的梯度:
∂
f
∂
x
=
2
x
+
2
y
\frac{\partial f}{\partial x} = 2x + 2y
∂x∂f=2x+2y
∂
f
∂
y
=
2
x
+
2
y
\frac{\partial f}{\partial y} = 2x + 2y
∂y∂f=2x+2y
因此,梯度向量为:
∇ f ( x , y ) = ( ∂ f ∂ x , ∂ f ∂ y ) = ( 2 x + 2 y , 2 x + 2 y ) \nabla f(x, y) = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right) = (2x + 2y, 2x + 2y) ∇f(x,y)=(∂x∂f,∂y∂f)=(2x+2y,2x+2y)
初始化参数
假设我们选择初始点 ( x 0 , y 0 ) = ( 1 , 2 ) (x_0, y_0) = (1, 2) (x0,y0)=(1,2)。
选择学习率
为了简化起见,我们选择学习率 α = 0.1 \alpha = 0.1 α=0.1。
迭代更新
现在,我们来执行几轮梯度下降迭代:
-
第0步:初始点 ( x 0 , y 0 ) = ( 1 , 2 ) (x_0, y_0) = (1, 2) (x0,y0)=(1,2)。
-
第1步:计算梯度并更新参数。
-
梯度 ∇ f ( 1 , 2 ) = ( 2 ∗ 1 + 2 ∗ 2 , 2 ∗ 1 + 2 ∗ 2 ) = ( 6 , 6 ) \nabla f(1, 2) = (2*1 + 2*2, 2*1 + 2*2) = (6, 6) ∇f(1,2)=(2∗1+2∗2,2∗1+2∗2)=(6,6)。
-
更新参数: ( x 1 , y 1 ) = ( 1 , 2 ) − 0.1 ⋅ ( 6 , 6 ) = ( 1 − 0.6 , 2 − 0.6 ) = ( 0.4 , 1.4 ) (x_1, y_1) = (1, 2) - 0.1 \cdot (6, 6) = (1 - 0.6, 2 - 0.6) = (0.4, 1.4) (x1,y1)=(1,2)−0.1⋅(6,6)=(1−0.6,2−0.6)=(0.4,1.4)。
-
-
第2步:再次计算梯度并更新参数。
-
梯度 ∇ f ( 0.4 , 1.4 ) = ( 2 ∗ 0.4 + 2 ∗ 1.4 , 2 ∗ 0.4 + 2 ∗ 1.4 ) = ( 3.6 , 3.6 ) \nabla f(0.4, 1.4) = (2*0.4 + 2*1.4, 2*0.4 + 2*1.4) = (3.6, 3.6) ∇f(0.4,1.4)=(2∗0.4+2∗1.4,2∗0.4+2∗1.4)=(3.6,3.6)。
-
更新参数: ( x 2 , y 2 ) = ( 0.4 , 1.4 ) − 0.1 ⋅ ( 3.6 , 3.6 ) = ( 0.4 − 0.36 , 1.4 − 0.36 ) = ( 0.04 , 1.04 ) (x_2, y_2) = (0.4, 1.4) - 0.1 \cdot (3.6, 3.6) = (0.4 - 0.36, 1.4 - 0.36) = (0.04, 1.04) (x2,y2)=(0.4,1.4)−0.1⋅(3.6,3.6)=(0.4−0.36,1.4−0.36)=(0.04,1.04)。
-
-
第3步:继续计算梯度并更新参数。
-
梯度 ∇ f ( 0.04 , 1.04 ) = ( 2 ∗ 0.04 + 2 ∗ 1.04 , 2 ∗ 0.04 + 2 ∗ 1.04 ) = ( 2.16 , 2.16 ) \nabla f(0.04, 1.04) = (2*0.04 + 2*1.04, 2*0.04 + 2*1.04) = (2.16, 2.16) ∇f(0.04,1.04)=(2∗0.04+2∗1.04,2∗0.04+2∗1.04)=(2.16,2.16)。
-
更新参数: ( x 3 , y 3 ) = ( 0.04 , 1.04 ) − 0.1 ⋅ ( 2.16 , 2.16 ) = ( 0.04 − 0.216 , 1.04 − 0.216 ) = ( − 0.176 , 0.824 ) (x_3, y_3) = (0.04, 1.04) - 0.1 \cdot (2.16, 2.16) = (0.04 - 0.216, 1.04 - 0.216) = (-0.176, 0.824) (x3,y3)=(0.04,1.04)−0.1⋅(2.16,2.16)=(0.04−0.216,1.04−0.216)=(−0.176,0.824)。
-
-
第4步:再次计算梯度并更新参数。
-
梯度 ∇ f ( − 0.176 , 0.824 ) = ( 2 ∗ ( − 0.176 ) + 2 ∗ 0.824 , 2 ∗ ( − 0.176 ) + 2 ∗ 0.824 ) = ( 1.296 , 1.296 ) \nabla f(-0.176, 0.824) = (2*(-0.176) + 2*0.824, 2*(-0.176) + 2*0.824) = (1.296, 1.296) ∇f(−0.176,0.824)=(2∗(−0.176)+2∗0.824,2∗(−0.176)+2∗0.824)=(1.296,1.296)。
-
更新参数: ( x 4 , y 4 ) = ( − 0.176 , 0.824 ) − 0.1 ⋅ ( 1.296 , 1.296 ) = ( − 0.176 − 0.1296 , 0.824 − 0.1296 ) = ( − 0.3056 , 0.6944 ) (x_4, y_4) = (-0.176, 0.824) - 0.1 \cdot (1.296, 1.296) = (-0.176 - 0.1296, 0.824 - 0.1296) = (-0.3056, 0.6944) (x4,y4)=(−0.176,0.824)−0.1⋅(1.296,1.296)=(−0.176−0.1296,0.824−0.1296)=(−0.3056,0.6944)。
-
结论
经过四次迭代后,我们得到了一个新的点 ( x 4 , y 4 ) = ( − 0.3056 , 0.6944 ) (x_4, y_4) = (-0.3056, 0.6944) (x4,y4)=(−0.3056,0.6944)。如果我们继续迭代,最终将会收敛到函数的最小值点,也就是 ( x , y ) = ( 0 , 0 ) (x, y) = (0, 0) (x,y)=(0,0)。