深入浅出梯度下降算法:快速抵达函数最小值的方法
引言
梯度是机器学习和优化领域中不可或缺的概念,它为我们提供了理解和调整多维空间中函数行为的工具。本文将详细介绍梯度的定义、性质,并通过具体的一元和多元函数案例展示如何使用梯度下降算法找到最佳参数。
一、梯度的基础知识
1.1 定义与计算
梯度是一个向量,表示一个多变量函数在某一点处的最大变化率的方向以及变化率的大小。对于一个可微函数 f ( x 1 , x 2 , . . . , x n ) f(x_1, x_2, ..., x_n) f(x1,x2,...,xn),其梯度 ∇ f \nabla f ∇f 是由各个自变量的偏导数组成的向量:
∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) ∇f=(∂x1∂f,∂x2∂f,...,∂xn∂f)
1.2 梯度的方向
梯度是一个向量,它表示一个多变量函数在某一点处的最大变化率的方向以及变化率的大小。梯度指向的是函数值增加最快的方向。因此,如果我们希望减小函数值,我们应该沿着梯度的反方向移动。这正是梯度下降算法的核心思想。理解梯度的方向对于优化问题至关重要。下面我们将详细展开讨论梯度方向在一元函数、多元函数以及神经网络中的具体表现。
1.2.1 一元函数中的梯度方向
对于一维情况,梯度实际上就是一个标量值,它告诉我们函数在该点是增加还是减少:
- 梯度为正值:如果导数(即梯度) d y d x > 0 \frac{dy}{dx} > 0 dxdy>0,那么函数值随着 x x x 的增加而增加。这意味着梯度指向正方向,即沿着 x x x 轴的正方向移动会使得函数值增大。
- 梯度为负值:如果导数(即梯度) d y d x < 0 \frac{dy}{dx} < 0 dxdy<0,那么函数值随着 x x x 的增加而减小。这意味着梯度指向负方向,即沿着 x x x 轴的负方向移动会使得函数值增大。
- 梯度为零:如果导数(即梯度) d y d x = 0 \frac{dy}{dx} = 0 dxdy=0,那么在这一点上函数值既不增加也不减少,可能是极值点或平稳点。
例如,考虑二次函数 y = x 2 y = x^2 y=x2:
- 在 x > 0 x > 0 x>0 时,梯度为正值( 2 x > 0 2x > 0 2x>0),表明函数在这个区域沿 x x x 正方向增长最快。
- 在 x < 0 x < 0 x<0 时,梯度为负值( 2 x < 0 2x < 0 2x<0),表明函数在这个区域沿 x x x 负方向增长最快。
- 在 x = 0 x = 0 x=0 时,梯度为零,这是全局最小值点。
为了减小 y y y 的值,我们应该沿着梯度的反方向移动:
- 在 x > 0 x > 0 x>0 时,梯度为正值,所以我们应该向左移动(减小 x x x)。
- 在 x < 0 x < 0 x<0 时,梯度为负值,所以我们应该向右移动(增加 x x x)。
- 在 x = 0 x = 0 x=0 时,梯度为零,这里已经是最低点了。
1.2.2 多元函数中的梯度方向
对于多变量函数 f ( x 1 , x 2 , . . . , x n ) f(x_1, x_2, ..., x_n) f(x1,x2,...,xn),梯度是一个向量 ∇ f \nabla f ∇f,由各个自变量的偏导数组成:
∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) ∇f=(∂x1∂f,∂x2∂f,...,∂xn∂f)
梯度指向的是函数值增加最快的方向。因此,如果我们希望减小函数值,我们应该沿着梯度的反方向移动。这同样适用于每个参数的更新:
- 梯度为正向量:如果某个分量 ∂ f ∂ x i > 0 \frac{\partial f}{\partial x_i} > 0 ∂xi∂f>0,那么函数值随着 x i x_i xi 的增加而增加。这意味着梯度在 x i x_i xi 方向上是正的,沿着这个方向移动会使得函数值增大。
- 梯度为负向量:如果某个分量 ∂ f ∂ x i < 0 \frac{\partial f}{\partial x_i} < 0 ∂xi∂f<0,那么函数值随着 x i x_i xi 的增加而减小。这意味着梯度在 x i x_i xi 方向上是负的,沿着这个方向移动会使得函数值增大。
- 梯度为零向量:如果所有分量均为零,那么在这一点上函数值既不增加也不减少,可能是极值点或平稳点。
例如,考虑二维二次函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2:
- 在点 ( 1 , 1 ) (1, 1) (1,1),梯度为 ( 2 , 2 ) (2, 2) (2,2),表明从这一点出发,沿 ( 2 , 2 ) (2, 2) (2,2) 方向移动会使 f ( x , y ) f(x, y) f(x,y) 值迅速增大。反方向 ( − 2 , − 2 ) (-2, -2) (−2,−2) 则使 f ( x , y ) f(x, y) f(x,y) 值迅速减小。
- 在点 ( − 1 , − 1 ) (-1, -1) (−1,−1),梯度为 ( − 2 , − 2 ) (-2, -2) (−2,−2),表明从这一点出发,沿 ( − 2 , − 2 ) (-2, -2) (−2,−2) 方向移动会使 f ( x , y ) f(x, y) f(x,y) 值迅速增大。反方向 ( 2 , 2 ) (2, 2) (2,2) 则使 f ( x , y ) f(x, y) f(x,y) 值迅速减小。
- 在点 ( 0 , 0 ) (0, 0) (0,0),梯度为 ( 0 , 0 ) (0, 0) (0,0),这里是全局最小值点,没有明确的增长或减少方向。
1.2.3 神经网络中的梯度方向
在神经网络中,梯度方向用于指导参数(权重和偏置)的更新,以最小化损失函数。梯度本身是一个向量,它指向了损失函数值增加最快的方向。因此,在优化过程中,我们沿着梯度的反方向调整参数,以减小损失函数值。
梯度方向的具体表现
-
权重矩阵 W ( l ) W^{(l)} W(l) 的梯度:
- 对于每一层的权重矩阵 W ( l ) W^{(l)} W(l),其梯度 ∇ W ( l ) L \nabla_{W^{(l)}} L ∇W(l)L 表示该层权重对损失函数的影响。
- 如果某个权重的梯度为正,意味着增加该权重会使损失增大;反之,减少该权重会使损失减小。
- 因此,为了减小损失,我们应沿着梯度的反方向更新权重: W new ( l ) = W old ( l ) − α ⋅ ∇ W ( l ) L W^{(l)}_{\text{new}} = W^{(l)}_{\text{old}} - \alpha \cdot \nabla_{W^{(l)}} L Wnew(l)=Wold(l)−α⋅∇W(l)L
-
偏置向量 b ( l ) b^{(l)} b(l) 的梯度:
- 类似地,对于每一层的偏置向量 b ( l ) b^{(l)} b(l),其梯度 ∇ b ( l ) L \nabla_{b^{(l)}} L ∇b(l)L 表示该层偏置对损失函数的影响。
- 如果某个偏置的梯度为正,意味着增加该偏置会使损失增大;反之,减少该偏置会使损失减小。
- 为了减小损失,我们应沿着梯度的反方向更新偏置: b new ( l ) = b old ( l ) − α ⋅ ∇ b ( l ) L b^{(l)}_{\text{new}} = b^{(l)}_{\text{old}} - \alpha \cdot \nabla_{b^{(l)}} L bnew(l)=bold(l)−α⋅∇b(l)L
反向传播与梯度计算
反向传播算法是计算神经网络中梯度的关键步骤。它通过链式法则逐层计算每个参数对损失函数的影响:
-
输出层:
- 计算输出层误差 δ ( L ) \delta^{(L)} δ(L):
δ ( L ) = a ( L ) − y \delta^{(L)} = a^{(L)} - y δ(L)=a(L)−y - 计算输出层权重和偏置的梯度:
∇ W ( L ) L = δ ( L ) ⋅ ( a ( L − 1 ) ) T \nabla_{W^{(L)}} L = \delta^{(L)} \cdot (a^{(L-1)})^T ∇W(L)L=δ(L)⋅(a(L−1))T
∇ b ( L ) L = δ ( L ) \nabla_{b^{(L)}} L = \delta^{(L)} ∇b(L)L=δ(L)
- 计算输出层误差 δ ( L ) \delta^{(L)} δ(L):
-
隐藏层:
- 计算隐藏层误差 δ ( l ) \delta^{(l)} δ(l):
δ ( l ) = ( δ ( l + 1 ) ⋅ ( W ( l + 1 ) ) T ) ⊙ f ′ ( z ( l ) ) \delta^{(l)} = (\delta^{(l+1)} \cdot (W^{(l+1)})^T) \odot f'(z^{(l)}) δ(l)=(δ(l+1)⋅(W(l+1))T)⊙f′(z(l))
其中 f ′ f' f′ 是激活函数的导数。 - 计算隐藏层权重和偏置的梯度:
∇ W ( l ) L = δ ( l ) ⋅ ( a ( l − 1 ) ) T \nabla_{W^{(l)}} L = \delta^{(l)} \cdot (a^{(l-1)})^T ∇W(l)L=δ(l)⋅(a(l−1))T
∇ b ( l ) L = δ ( l ) \nabla_{b^{(l)}} L = \delta^{(l)} ∇b(l)L=δ(l)
- 计算隐藏层误差 δ ( l ) \delta^{(l)} δ(l):
梯度方向的直观理解
- 权重更新:如果某个权重的梯度为正值,这意味着增加该权重会使损失增大,所以我们应该减小该权重。相反,如果梯度为负值,则应该增加该权重。
- 偏置更新:同样的逻辑适用于偏置,根据梯度的符号调整偏置值,以减小损失。
通过不断的迭代,网络的权重和偏置将逐渐收敛到最优解,从而使损失函数最小化,预测性能最大化。在神经网络中,梯度方向直接指导了参数更新的方向。
总结
无论是处理简单的一元二次函数、复杂的多元函数,还是神经网络中的复杂优化问题,梯度都为我们提供了一条通向最优解的道路。通过了解梯度的方向和反方向,我们可以有效地使用梯度下降算法来找到函数的最低点。每一次迭代中,我们根据当前的损失计算梯度,并沿着梯度的反方向调整参数,最终使模型更好地拟合训练数据。
1.3 梯度下降的一般性公式
梯度下降是一种用于最小化损失函数的迭代优化算法。其核心思想是通过逐步调整参数,使损失函数的值不断减小,直到收敛到局部或全局最小值。梯度下降的基本步骤如下:
- 初始化参数:选择一组初始参数 θ 0 \theta_0 θ0。
- 计算梯度:在当前参数 θ n \theta_n θn 处计算损失函数 J ( θ ) J(\theta) J(θ) 的梯度 ∇ θ J ( θ n ) \nabla_\theta J(\theta_n) ∇θJ(θn)。
- 更新参数:根据梯度的反方向更新参数:
θ n + 1 = θ n − α ⋅ ∇ θ J ( θ n ) \theta_{n+1} = \theta_n - \alpha \cdot \nabla_\theta J(\theta_n) θn+1=θn−α⋅∇θJ(θn)
其中 α \alpha α 是学习率,决定了每次更新步长的大小。 - 重复迭代:重复上述步骤,直到满足某个停止条件(如梯度接近零或达到最大迭代次数)。
梯度下降的具体形式取决于使用的数据集和模型。以下是几种常见的梯度下降变体:
- 批量梯度下降(Batch Gradient Descent):每次迭代使用整个训练集来计算梯度。
- 随机梯度下降(Stochastic Gradient Descent, SGD):每次迭代仅使用一个样本(或一个小批次)来计算梯度,从而加快收敛速度但可能引入更多噪声。
- 小批量梯度下降(Mini-batch Gradient Descent):每次迭代使用一小批样本(通常几十个)来计算梯度,结合了批量和随机梯度下降的优点。
二、一元二次函数的梯度下降
2.1 函数及其导数
考虑简单的二次函数 y = x 2 y = x^2 y=x2。可以计算其导数(即梯度):
d y d x = 2 x \frac{dy}{dx} = 2x dxdy=2x
这个导数告诉我们,在任意点 x x x 处,函数 y y y 的变化率是多少。
2.2 梯度下降的具体过程
假设想找到使 y = x 2 y = x^2 y=x2 最小化的 x x x 值,将使用梯度下降算法来进行优化。
-
初始化:选择初始猜测 x 0 = 3 x_0 = 3 x0=3,学习率 α = 0.1 \alpha = 0.1 α=0.1。
-
迭代过程:按照以下步骤进行迭代:
- 计算梯度:在当前点 x n x_n xn 计算导数: d y d x ( x n ) = 2 x n \frac{dy}{dx}(x_n) = 2x_n dxdy(xn)=2xn
- 更新参数:根据梯度的反方向更新 x x x:
x n + 1 = x n − α ⋅ d y d x ( x n ) x_{n+1} = x_n - \alpha \cdot \frac{dy}{dx}(x_n) xn+1=xn−α⋅dxdy(xn) - 重复:重复上述步骤直到收敛或达到预定的迭代次数。
具体
🌰🌰
-
第一次迭代:
- 当前位置 x 0 = 3 x_0 = 3 x0=3
- 计算梯度: d y d x ( x 0 ) = 2 ∗ 3 = 6 \frac{dy}{dx}(x_0) = 2*3 = 6 dxdy(x0)=2∗3=6
- 更新 x x x: x 1 = x 0 − 0.1 ∗ 6 = 3 − 0.6 = 2.4 x_1 = x_0 - 0.1 * 6 = 3 - 0.6 = 2.4 x1=x0−0.1∗6=3−0.6=2.4
-
第二次迭代:
- 当前位置 x 1 = 2.4 x_1 = 2.4 x1=2.4
- 计算梯度: d y d x ( x 1 ) = 2 ∗ 2.4 = 4.8 \frac{dy}{dx}(x_1) = 2*2.4 = 4.8 dxdy(x1)=2∗2.4=4.8
- 更新 x x x: x 2 = x 1 − 0.1 ∗ 4.8 = 2.4 − 0.48 = 1.92 x_2 = x_1 - 0.1 * 4.8 = 2.4 - 0.48 = 1.92 x2=x1−0.1∗4.8=2.4−0.48=1.92
-
第三次迭代:
- 当前位置 x 2 = 1.92 x_2 = 1.92 x2=1.92
- 计算梯度: d y d x ( x 2 ) = 2 ∗ 1.92 = 3.84 \frac{dy}{dx}(x_2) = 2*1.92 = 3.84 dxdy(x2)=2∗1.92=3.84
- 更新 x x x: x 3 = x 2 − 0.1 ∗ 3.84 = 1.92 − 0.384 = 1.536 x_3 = x_2 - 0.1 * 3.84 = 1.92 - 0.384 = 1.536 x3=x2−0.1∗3.84=1.92−0.384=1.536
随着迭代次数的增加, x x x 将逐渐接近最小值点 x = 0 x = 0 x=0。最终,经过足够多次的迭代, x x x 会非常接近 0,此时 y = x 2 y = x^2 y=x2 达到最小值。
三、多元函数的梯度下降
3.1 函数及其梯度
考虑一个二维二次函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2。该函数描述了一个三维空间中的抛物面,顶点位于原点 (0, 0)。其梯度向量为:
∇ f = ( 2 x , 2 y ) \nabla f = (2x, 2y) ∇f=(2x,2y)
3.2 梯度下降的具体过程
假设想找到使 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 最小化的 x x x 和 y y y 的值,将使用梯度下降算法来进行优化。
-
初始化:选择初始猜测 x 0 = 1 x_0 = 1 x0=1, y 0 = 1 y_0 = 1 y0=1,学习率 α = 0.1 \alpha = 0.1 α=0.1。
-
迭代过程:按照以下步骤进行迭代:
- 计算梯度:在当前点 ( x n , y n ) (x_n, y_n) (xn,yn) 计算梯度 ∇ f ( x n , y n ) = ( 2 x n , 2 y n ) \nabla f(x_n, y_n) = (2x_n, 2y_n) ∇f(xn,yn)=(2xn,2yn)。
- 更新参数:根据梯度的反方向更新 x x x 和 y y y:
x n + 1 = x n − α ⋅ ∂ f ∂ x ( x n , y n ) x_{n+1} = x_n - \alpha \cdot \frac{\partial f}{\partial x}(x_n, y_n) xn+1=xn−α⋅∂x∂f(xn,yn)
y n + 1 = y n − α ⋅ ∂ f ∂ y ( x n , y n ) y_{n+1} = y_n - \alpha \cdot \frac{\partial f}{\partial y}(x_n, y_n) yn+1=yn−α⋅∂y∂f(xn,yn) - 重复:重复上述步骤直到收敛或达到预定的迭代次数。
具体
🌰🌰
-
第一次迭代:
- 当前位置 ( x 0 , y 0 ) = ( 1 , 1 ) (x_0, y_0) = (1, 1) (x0,y0)=(1,1)
- 计算梯度: ∇ f ( x 0 , y 0 ) = ( 2 ∗ 1 , 2 ∗ 1 ) = ( 2 , 2 ) \nabla f(x_0, y_0) = (2*1, 2*1) = (2, 2) ∇f(x0,y0)=(2∗1,2∗1)=(2,2)
- 更新 x x x 和 y y y:
x 1 = x 0 − 0.1 ∗ 2 = 1 − 0.2 = 0.8 x_1 = x_0 - 0.1 * 2 = 1 - 0.2 = 0.8 x1=x0−0.1∗2=1−0.2=0.8
y 1 = y 0 − 0.1 ∗ 2 = 1 − 0.2 = 0.8 y_1 = y_0 - 0.1 * 2 = 1 - 0.2 = 0.8 y1=y0−0.1∗2=1−0.2=0.8
-
第二次迭代:
- 当前位置 ( x 1 , y 1 ) = ( 0.8 , 0.8 ) (x_1, y_1) = (0.8, 0.8) (x1,y1)=(0.8,0.8)
- 计算梯度: ∇ f ( x 1 , y 1 ) = ( 2 ∗ 0.8 , 2 ∗ 0.8 ) = ( 1.6 , 1.6 ) \nabla f(x_1, y_1) = (2*0.8, 2*0.8) = (1.6, 1.6) ∇f(x1,y1)=(2∗0.8,2∗0.8)=(1.6,1.6)
- 更新 x x x 和 y y y:
x 2 = x 1 − 0.1 ∗ 1.6 = 0.8 − 0.16 = 0.64 x_2 = x_1 - 0.1 * 1.6 = 0.8 - 0.16 = 0.64 x2=x1−0.1∗1.6=0.8−0.16=0.64
y 2 = y 1 − 0.1 ∗ 1.6 = 0.8 − 0.16 = 0.64 y_2 = y_1 - 0.1 * 1.6 = 0.8 - 0.16 = 0.64 y2=y1−0.1∗1.6=0.8−0.16=0.64
-
第三次迭代:
- 当前位置 ( x 2 , y 2 ) = ( 0.64 , 0.64 ) (x_2, y_2) = (0.64, 0.64) (x2,y2)=(0.64,0.64)
- 计算梯度: ∇ f ( x 2 , y 2 ) = ( 2 ∗ 0.64 , 2 ∗ 0.64 ) = ( 1.28 , 1.28 ) \nabla f(x_2, y_2) = (2*0.64, 2*0.64) = (1.28, 1.28) ∇f(x2,y2)=(2∗0.64,2∗0.64)=(1.28,1.28)
- 更新 x x x 和 y y y:
x 3 = x 2 − 0.1 ∗ 1.28 = 0.64 − 0.128 = 0.512 x_3 = x_2 - 0.1 * 1.28 = 0.64 - 0.128 = 0.512 x3=x2−0.1∗1.28=0.64−0.128=0.512
y 3 = y 2 − 0.1 ∗ 1.28 = 0.64 − 0.128 = 0.512 y_3 = y_2 - 0.1 * 1.28 = 0.64 - 0.128 = 0.512 y3=y2−0.1∗1.28=0.64−0.128=0.512
随着迭代次数的增加, x x x 和 y y y 将逐渐接近最小值点 ( 0 , 0 ) (0, 0) (0,0)。最终,经过足够多次的迭代, ( x , y ) (x, y) (x,y) 会非常接近 (0, 0),此时 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 达到最小值。
3.3 神经网络中的梯度下降
为了更直观地理解神经网络中梯度下降的过程,我们将通过一个具体的二分类问题来展示如何使用梯度下降和反向传播算法优化网络参数。假设有一个简单的两层神经网络,用于区分两类样本。下面将详细说明每一步的计算过程,并给出具体的数值示例。
模型结构
- 输入层:2 个特征 x 1 x_1 x1 和 x 2 x_2 x2。
- 隐藏层:3 个神经元,激活函数为 ReLU(Rectified Linear Unit)。
- 输出层:1 个神经元,激活函数为 Sigmoid,用于二分类。
- 损失函数:交叉熵损失函数。
初始化参数
随机初始化权重和偏置:
- 输入层到隐藏层的权重矩阵 W ( 1 ) W^{(1)} W(1):
W ( 1 ) = ( 0.5 − 0.2 0.3 0.4 − 0.1 0.6 ) W^{(1)} = \begin{pmatrix} 0.5 & -0.2 \\ 0.3 & 0.4 \\ -0.1 & 0.6 \end{pmatrix} W(1)= 0.50.3−0.1−0.20.40.6 - 隐藏层到输出层的权重矩阵 W ( 2 ) W^{(2)} W(2):
W ( 2 ) = ( 0.2 − 0.3 0.4 ) W^{(2)} = \begin{pmatrix} 0.2 \\ -0.3 \\ 0.4 \end{pmatrix} W(2)= 0.2−0.30.4 - 隐藏层的偏置向量 b ( 1 ) b^{(1)} b(1):
b ( 1 ) = ( 0.1 − 0.2 0.3 ) b^{(1)} = \begin{pmatrix} 0.1 \\ -0.2 \\ 0.3 \end{pmatrix} b(1)= 0.1−0.20.3 - 输出层的偏置 b ( 2 ) b^{(2)} b(2):
b ( 2 ) = 0.1 b^{(2)} = 0.1 b(2)=0.1
具体
🌰🌰
考虑一个简单的训练样本:
- 输入特征 X = ( 1 2 ) X = \begin{pmatrix} 1 \\ 2 \end{pmatrix} X=(12)
- 对应标签 y = 1 y = 1 y=1
第一次迭代
1. 前向传播
-
计算隐藏层的线性组合:
z ( 1 ) = W ( 1 ) ⋅ X + b ( 1 ) = ( 0.5 − 0.2 0.3 0.4 − 0.1 0.6 ) ⋅ ( 1 2 ) + ( 0.1 − 0.2 0.3 ) = ( 0.5 ⋅ 1 + ( − 0.2 ) ⋅ 2 + 0.1 0.3 ⋅ 1 + 0.4 ⋅ 2 − 0.2 − 0.1 ⋅ 1 + 0.6 ⋅ 2 + 0.3 ) = ( 0.4 0.7 1.4 ) z^{(1)} = W^{(1)} \cdot X + b^{(1)} = \begin{pmatrix} 0.5 & -0.2 \\ 0.3 & 0.4 \\ -0.1 & 0.6 \end{pmatrix} \cdot \begin{pmatrix} 1 \\ 2 \end{pmatrix} + \begin{pmatrix} 0.1 \\ -0.2 \\ 0.3 \end{pmatrix} = \begin{pmatrix} 0.5 \cdot 1 + (-0.2) \cdot 2 + 0.1 \\ 0.3 \cdot 1 + 0.4 \cdot 2 - 0.2 \\ -0.1 \cdot 1 + 0.6 \cdot 2 + 0.3 \end{pmatrix} = \begin{pmatrix} 0.4 \\ 0.7 \\ 1.4 \end{pmatrix} z(1)=W(1)⋅X+b(1)= 0.50.3−0.1−0.20.40.6 ⋅(12)+ 0.1−0.20.3 = 0.5⋅1+(−0.2)⋅2+0.10.3⋅1+0.4⋅2−0.2−0.1⋅1+0.6⋅2+0.3 = 0.40.71.4 -
应用 ReLU 激活函数:
a ( 1 ) = ReLU ( z ( 1 ) ) = ( max ( 0 , 0.4 ) max ( 0 , 0.7 ) max ( 0 , 1.4 ) ) = ( 0.4 0.7 1.4 ) a^{(1)} = \text{ReLU}(z^{(1)}) = \begin{pmatrix} \max(0, 0.4) \\ \max(0, 0.7) \\ \max(0, 1.4) \end{pmatrix} = \begin{pmatrix} 0.4 \\ 0.7 \\ 1.4 \end{pmatrix} a(1)=ReLU(z(1))= max(0,0.4)max(0,0.7)max(0,1.4) = 0.40.71.4 -
计算输出层的线性组合:
z ( 2 ) = W ( 2 ) ⋅ a ( 1 ) + b ( 2 ) = ( 0.2 − 0.3 0.4 ) ⋅ ( 0.4 0.7 1.4 ) + 0.1 = 0.2 ⋅ 0.4 + ( − 0.3 ) ⋅ 0.7 + 0.4 ⋅ 1.4 + 0.1 = 0.8 − 0.21 + 0.56 + 0.1 = 1.25 z^{(2)} = W^{(2)} \cdot a^{(1)} + b^{(2)} = \begin{pmatrix} 0.2 \\ -0.3 \\ 0.4 \end{pmatrix} \cdot \begin{pmatrix} 0.4 \\ 0.7 \\ 1.4 \end{pmatrix} + 0.1 = 0.2 \cdot 0.4 + (-0.3) \cdot 0.7 + 0.4 \cdot 1.4 + 0.1 = 0.8 - 0.21 + 0.56 + 0.1 = 1.25 z(2)=W(2)⋅a(1)+b(2)= 0.2−0.30.4 ⋅ 0.40.71.4 +0.1=0.2⋅0.4+(−0.3)⋅0.7+0.4⋅1.4+0.1=0.8−0.21+0.56+0.1=1.25 -
应用 Sigmoid 激活函数:
a ( 2 ) = σ ( z ( 2 ) ) = 1 1 + e − 1.25 ≈ 0.777 a^{(2)} = \sigma(z^{(2)}) = \frac{1}{1 + e^{-1.25}} \approx 0.777 a(2)=σ(z(2))=1+e−1.251≈0.777
2. 计算损失
使用交叉熵损失函数:
L = − y log ( a ( 2 ) ) − ( 1 − y ) log ( 1 − a ( 2 ) ) = − 1 ⋅ log ( 0.777 ) − 0 ⋅ log ( 1 − 0.777 ) ≈ 0.251 L = -y \log(a^{(2)}) - (1 - y) \log(1 - a^{(2)}) = -1 \cdot \log(0.777) - 0 \cdot \log(1 - 0.777) \approx 0.251 L=−ylog(a(2))−(1−y)log(1−a(2))=−1⋅log(0.777)−0⋅log(1−0.777)≈0.251
3. 反向传播
-
计算输出层的误差:
δ ( 2 ) = a ( 2 ) − y = 0.777 − 1 = − 0.223 \delta^{(2)} = a^{(2)} - y = 0.777 - 1 = -0.223 δ(2)=a(2)−y=0.777−1=−0.223 -
计算输出层的梯度:
∇ W ( 2 ) L = δ ( 2 ) ⋅ a ( 1 ) T = − 0.223 ⋅ ( 0.4 0.7 1.4 ) = ( − 0.0892 − 0.1561 − 0.3122 ) \nabla_{W^{(2)}} L = \delta^{(2)} \cdot a^{(1)T} = -0.223 \cdot \begin{pmatrix} 0.4 \\ 0.7 \\ 1.4 \end{pmatrix} = \begin{pmatrix} -0.0892 \\ -0.1561 \\ -0.3122 \end{pmatrix} ∇W(2)L=δ(2)⋅a(1)T=−0.223⋅ 0.40.71.4 = −0.0892−0.1561−0.3122
∇ b ( 2 ) L = δ ( 2 ) = − 0.223 \nabla_{b^{(2)}} L = \delta^{(2)} = -0.223 ∇b(2)L=δ(2)=−0.223 -
计算隐藏层的误差:
δ ( 1 ) = ( δ ( 2 ) ⋅ W ( 2 ) T ) ⊙ f ′ ( z ( 1 ) ) \delta^{(1)} = (\delta^{(2)} \cdot W^{(2)T}) \odot f'(z^{(1)}) δ(1)=(δ(2)⋅W(2)T)⊙f′(z(1))
其中 f ′ f' f′ 是 ReLU 的导数(对于正数是 1,对于负数是 0),所以:
δ ( 1 ) = ( − 0.223 ⋅ ( 0.2 − 0.3 0.4 ) ) ⊙ ( 1 1 1 ) = ( − 0.0446 0.0669 − 0.0892 ) \delta^{(1)} = (-0.223 \cdot \begin{pmatrix} 0.2 \\ -0.3 \\ 0.4 \end{pmatrix}) \odot \begin{pmatrix} 1 \\ 1 \\ 1 \end{pmatrix} = \begin{pmatrix} -0.0446 \\ 0.0669 \\ -0.0892 \end{pmatrix} δ(1)=(−0.223⋅ 0.2−0.30.4 )⊙ 111 = −0.04460.0669−0.0892 -
计算隐藏层的梯度:
∇ W ( 1 ) L = δ ( 1 ) ⋅ X T = ( − 0.0446 0.0669 − 0.0892 ) ⋅ ( 1 2 ) = ( − 0.0446 − 0.0892 0.0669 0.1338 − 0.0892 − 0.1784 ) \nabla_{W^{(1)}} L = \delta^{(1)} \cdot X^T = \begin{pmatrix} -0.0446 \\ 0.0669 \\ -0.0892 \end{pmatrix} \cdot \begin{pmatrix} 1 \\ 2 \end{pmatrix} = \begin{pmatrix} -0.0446 & -0.0892 \\ 0.0669 & 0.1338 \\ -0.0892 & -0.1784 \end{pmatrix} ∇W(1)L=δ(1)⋅XT= −0.04460.0669−0.0892 ⋅(12)= −0.04460.0669−0.0892−0.08920.1338−0.1784
∇ b ( 1 ) L = δ ( 1 ) = ( − 0.0446 0.0669 − 0.0892 ) \nabla_{b^{(1)}} L = \delta^{(1)} = \begin{pmatrix} -0.0446 \\ 0.0669 \\ -0.0892 \end{pmatrix} ∇b(1)L=δ(1)= −0.04460.0669−0.0892
4. 更新参数
选择学习率 α = 0.1 \alpha = 0.1 α=0.1:
-
更新输出层的权重和偏置:
W new ( 2 ) = W ( 2 ) − α ⋅ ∇ W ( 2 ) L = ( 0.2 − 0.3 0.4 ) − 0.1 ⋅ ( − 0.0892 − 0.1561 − 0.3122 ) = ( 0.20892 − 0.28439 0.43122 ) W^{(2)}_{\text{new}} = W^{(2)} - \alpha \cdot \nabla_{W^{(2)}} L = \begin{pmatrix} 0.2 \\ -0.3 \\ 0.4 \end{pmatrix} - 0.1 \cdot \begin{pmatrix} -0.0892 \\ -0.1561 \\ -0.3122 \end{pmatrix} = \begin{pmatrix} 0.20892 \\ -0.28439 \\ 0.43122 \end{pmatrix} Wnew(2)=W(2)−α⋅∇W(2)L= 0.2−0.30.4 −0.1⋅ −0.0892−0.1561−0.3122 = 0.20892−0.284390.43122
b new ( 2 ) = b ( 2 ) − α ⋅ ∇ b ( 2 ) L = 0.1 − 0.1 ⋅ ( − 0.223 ) = 0.1223 b^{(2)}_{\text{new}} = b^{(2)} - \alpha \cdot \nabla_{b^{(2)}} L = 0.1 - 0.1 \cdot (-0.223) = 0.1223 bnew(2)=b(2)−α⋅∇b(2)L=0.1−0.1⋅(−0.223)=0.1223 -
更新隐藏层的权重和偏置:
W new ( 1 ) = W ( 1 ) − α ⋅ ∇ W ( 1 ) L = ( 0.5 − 0.2 0.3 0.4 − 0.1 0.6 ) − 0.1 ⋅ ( − 0.0446 − 0.0892 0.0669 0.1338 − 0.0892 − 0.1784 ) = ( 0.50446 − 0.19108 0.29331 0.38662 − 0.09108 0.61784 ) W^{(1)}_{\text{new}} = W^{(1)} - \alpha \cdot \nabla_{W^{(1)}} L = \begin{pmatrix} 0.5 & -0.2 \\ 0.3 & 0.4 \\ -0.1 & 0.6 \end{pmatrix} - 0.1 \cdot \begin{pmatrix} -0.0446 & -0.0892 \\ 0.0669 & 0.1338 \\ -0.0892 & -0.1784 \end{pmatrix} = \begin{pmatrix} 0.50446 & -0.19108 \\ 0.29331 & 0.38662 \\ -0.09108 & 0.61784 \end{pmatrix} Wnew(1)=W(1)−α⋅∇W(1)L= 0.50.3−0.1−0.20.40.6 −0.1⋅ −0.04460.0669−0.0892−0.08920.1338−0.1784 = 0.504460.29331−0.09108−0.191080.386620.61784
b new ( 1 ) = b ( 1 ) − α ⋅ ∇ b ( 1 ) L = ( 0.1 − 0.2 0.3 ) − 0.1 ⋅ ( − 0.0446 0.0669 − 0.0892 ) = ( 0.10446 − 0.20669 0.30892 ) b^{(1)}_{\text{new}} = b^{(1)} - \alpha \cdot \nabla_{b^{(1)}} L = \begin{pmatrix} 0.1 \\ -0.2 \\ 0.3 \end{pmatrix} - 0.1 \cdot \begin{pmatrix} -0.0446 \\ 0.0669 \\ -0.0892 \end{pmatrix} = \begin{pmatrix} 0.10446 \\ -0.20669 \\ 0.30892 \end{pmatrix} bnew(1)=b(1)−α⋅∇b(1)L= 0.1−0.20.3 −0.1⋅ −0.04460.0669−0.0892 = 0.10446−0.206690.30892
后续迭代
重复上述步骤,逐步减少损失函数,提高预测准确性。随着迭代次数的增加,网络的权重和偏置将逐渐收敛到最优解,从而使损失函数最小化,预测性能最大化。
通过这个具体的数值例子,可以更直观地理解神经网络中梯度下降和反向传播的工作原理。每一次迭代中,会根据当前的损失计算梯度,并沿着梯度的反方向调整参数,最终使模型更好地拟合训练数据。
四、结论
梯度不仅是理解多维空间中函数行为的强大工具,而且在优化问题中扮演着至关重要的角色。通过了解梯度的方向和反方向,我们可以有效地使用梯度下降算法来找到函数的最低点。无论是处理简单的一元二次函数还是更复杂的多元函数,梯度都为我们提供了一条通向最优解的道路。通过具体的迭代过程和参数更新方法,展示了如何在实际问题中应用梯度下降算法,帮助大家更好地掌握这一优化技术。