第一章:人工智能之不同数据类型及其特点梳理
第二章:自然语言处理(NLP):文本向量化从文字到数字的原理
第三章:循环神经网络RNN:理解 RNN的工作机制与应用场景(附代码)
第四章:循环神经网络RNN、LSTM以及GRU 对比(附代码)
第五章:理解Seq2Seq的工作机制与应用场景中英互译(附代码)
第六章:深度学习架构Seq2Seq-添加并理解注意力机制(一)
第七章:深度学习架构Seq2Seq-添加并理解注意力机制(二)
第八章:深度学习模型Transformer初步认识整体架构
第九章:深度学习模型Transformer核心组件—自注意力机制
第十章:理解梯度下降、链式法则、梯度消失/爆炸
第十一章:Transformer核心组件—残差连接与层归一化
第十二章:Transformer核心组件—位置编码
一、求导的基本知识
求导是微积分中的一个基本操作,用于计算函数在某一点上的瞬时变化率。这里列出一些常见的求导公式和规则,这些对于理解链式法则以及深度学习中的梯度计算非常重要。
1.1 基本求导公式
-
常数的导数:
d d x ( c ) = 0 \frac{d}{dx}(c) = 0 dxd(c)=0,其中 c c c 是常数。 -
幂函数的导数:
d d x ( x n ) = n x n − 1 \frac{d}{dx}(x^n) = nx^{n-1} dxd(xn)=nxn−1,其中 (n) 是任意实数。 -
指数函数的导数:
d d x ( e x ) = e x \frac{d}{dx}(e^x) = e^x dxd(ex)=ex -
对数函数的导数:
d d x ( ln ( x ) ) = 1 x \frac{d}{dx}(\ln(x)) = \frac{1}{x} dxd(ln(x))=x1 -
三角函数的导数:
- 正弦函数: d d x ( sin ( x ) ) = cos ( x ) \frac{d}{dx}(\sin(x)) = \cos(x) dxd(sin(x))=cos(x)
- 余弦函数: d d x ( cos ( x ) ) = − sin ( x ) \frac{d}{dx}(\cos(x)) = -\sin(x) dxd(cos(x))=−sin(x)
- 正切函数: d d x ( tan ( x ) ) = sec 2 ( x ) \frac{d}{dx}(\tan(x)) = \sec^2(x) dxd(tan(x))=sec2(x)
1.2 求导规则
-
加法/减法规则:
如果 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 都是可导函数,则
d d x [ f ( x ) ± g ( x ) ] = f ′ ( x ) ± g ′ ( x ) \frac{d}{dx}[f(x) \pm g(x)] = f'(x) \pm g'(x) dxd[f(x)±g(x)]=f′(x)±g′(x) -
乘法规则(莱布尼茨法则):
如果 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 都是可导函数,则
d d x [ f ( x ) g ( x ) ] = f ′ ( x ) g ( x ) + f ( x ) g ′ ( x ) \frac{d}{dx}[f(x)g(x)] = f'(x)g(x) + f(x)g'(x) dxd[f(x)g(x)]=f′(x)g(x)+f(x)g′(x) -
除法规则:
如果 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 都是可导函数,并且 g ( x ) ≠ 0 g(x) \neq 0 g(x)=0,则
d d x [ f ( x ) g ( x ) ] = f ′ ( x ) g ( x ) − f ( x ) g ′ ( x ) [ g ( x ) ] 2 \frac{d}{dx}\left[\frac{f(x)}{g(x)}\right] = \frac{f'(x)g(x) - f(x)g'(x)}{[g(x)]^2} dxd[g(x)f(x)]=[g(x)]2f′(x)g(x)−f(x)g′(x) -
链式法则:
如果 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)),其中 f f f 和 g g g 都是可导函数,则
d y d x = d f d g ⋅ d g d x \frac{dy}{dx} = \frac{df}{dg} \cdot \frac{dg}{dx} dxdy=dgdf⋅dxdg
或者写作
d d x [ f ( g ( x ) ) ] = f ′ ( g ( x ) ) g ′ ( x ) \frac{d}{dx}[f(g(x))] = f'(g(x))g'(x) dxd[f(g(x))]=f′(g(x))g′(x)
1.3 在神经网络中的应用示例
考虑一个简单的神经网络层,其输出 y y y 通过以下步骤计算:
- 线性变换: z = W x + b z = Wx + b z=Wx+b,其中 W W W 是权重矩阵, x x x 是输入向量, b b b 是偏置项。
- 激活函数: a = σ ( z ) a = \sigma(z) a=σ(z),其中 σ \sigma σ 是激活函数(例如ReLU, Sigmoid等)。
假设损失函数为 L = 1 N ∑ i = 1 N ( y i − a i ) 2 L = \frac{1}{N} \sum_{i=1}^N (y_i - a_i)^2 L=N1∑i=1N(yi−ai)2,此时理解 y i y_i yi是一个常量, L L L 就是一个 关于 a a a 的函数,我们想要计算 L L L 对于 W W W 的导数。根据链式法则:
-
首先计算 L L L 对于激活值 a a a 的导数:
∂ L ∂ a \frac{\partial L}{\partial a} ∂a∂L -
然后计算 a a a 对于 z z z 的导数(即激活函数的导数):
∂ a ∂ z = σ ′ ( z ) \frac{\partial a}{\partial z} = \sigma'(z) ∂z∂a=σ′(z) -
最后计算 z z z 对于 W W W 的导数:
∂ z ∂ W = x \frac{\partial z}{\partial W} = x ∂W∂z=x
将上述部分组合起来,使用链式法则得到 L L L 对于 W W W 的导数:
∂ L ∂ W = ∂ L ∂ a ⋅ ∂ a ∂ z ⋅ ∂ z ∂ W \frac{\partial L}{\partial W} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial W} ∂W∂L=∂a∂L⋅∂z∂a⋅∂W∂z
这展示了如何利用基本的求导规则和链式法则来计算复杂的多层网络中各参数的梯度。这种梯度信息对于更新模型参数至关重要。
二、什么是梯度下降
1. 基础比喻:找山谷最低点
想象你是一个迷路的登山者,站在山坡上(初始位置),四周大雾弥漫看不清路。你的目标是找到山谷的最低点(模型最优解)。你采取的策略是:
- 每一步都沿着最陡的下坡方向走
- 步长由你决定(太大可能跨过最低点,太小则太慢)
这就是梯度下降的核心思想!
2. 数学定义
- 损失函数(Loss Function):衡量模型预测值与真实值的差距(比如预测房价的误差)。
- 梯度(Gradient):损失函数在每个参数方向上的斜率(即“最陡方向”)。
- 学习率(Learning Rate):每次更新的步长(即“步子大小”)。
3. 更新公式:
W 新 = W 旧 − η ⋅ ∇ W L W_{\text{新}} = W_{\text{旧}} - \eta \cdot \nabla_W \mathcal{L} W新=W旧−η⋅∇WL
其中:
- W W W:模型参数(比如神经网络的权重)
- η \eta η:学习率
- ∇ W L \nabla_W \mathcal{L} ∇WL:损失函数对参数的梯度
4. 举个实际例子
假设你要用线性回归预测房价,模型为 y = w x + b y = wx + b y=wx+b,损失函数是均方误差:
L = 1 N ∑ i = 1 N ( y i − ( w x i + b ) ) 2 \mathcal{L} = \frac{1}{N} \sum_{i=1}^N (y_i - (wx_i + b))^2 L=N1i=1∑N(yi−(wxi+b))2
梯度下降的步骤:
- 随机初始化 w w w 和 b b b
- 此时 x i 和 y i x_i 和 y_i xi和yi是一个常量,可以理解为第 i 个样本,x 的特征取值,y 的标签真实取值。
- 计算梯度:
- ∂ L ∂ w = − 2 N ∑ i = 1 N x i ( y i − ( w x i + b ) ) \frac{\partial \mathcal{L}}{\partial w} = -\frac{2}{N} \sum_{i=1}^N x_i (y_i - (wx_i + b)) ∂w∂L=−N2∑i=1Nxi(yi−(wxi+b))
- ∂ L ∂ b = − 2 N ∑ i = 1 N ( y i − ( w x i + b ) ) \frac{\partial \mathcal{L}}{\partial b} = -\frac{2}{N} \sum_{i=1}^N (y_i - (wx_i + b)) ∂b∂L=−N2∑i=1N(yi−(wxi+b))
- 更新参数:
- w = w − η ⋅ ∂ L ∂ w w = w - \eta \cdot \frac{\partial \mathcal{L}}{\partial w} w=w−η⋅∂w∂L
- b = b − η ⋅ ∂ L ∂ b b = b - \eta \cdot \frac{\partial \mathcal{L}}{\partial b} b=b−η⋅∂b∂L
三、梯度链式法则
假设有一个复合函数 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)),其中 x x x 是输入变量, g ( x ) g(x) g(x) 是中间变量,而 f ( g ( x ) ) f(g(x)) f(g(x)) 是最终输出。根据链式法则, y y y 对 x x x 的导数可以表示为:
d y d x = d f d g ⋅ d g d x \frac{dy}{dx} = \frac{df}{dg} \cdot \frac{dg}{dx} dxdy=dgdf⋅dxdg
这意味着,为了计算 y y y 关于 x x x 的导数,我们可以先计算 f f f 关于中间变量 g g g 的导数( d f d g \frac{df}{dg} dgdf),然后乘以 g g g 关于 x x x 的导数( d g d x \frac{dg}{dx} dxdg)。
在神经网络中的应用
在神经网络中,链式法则被广泛应用于反向传播过程中,以计算损失函数相对于各层权重的梯度。考虑一个多层神经网络,每一层都可以看作是一个函数,其输出作为下一层的输入。假设我们有以下结构:
- 输入 x x x
- 第一层: z 1 = W 1 x + b 1 z_1 = W_1 x + b_1 z1=W1x+b1
- 激活函数: a 1 = σ ( z 1 ) a_1 = \sigma(z_1) a1=σ(z1)
- 第二层: z 2 = W 2 a 1 + b 2 z_2 = W_2 a_1 + b_2 z2=W2a1+b2
- 输出: y = σ ( z 2 ) y = \sigma(z_2) y=σ(z2)
其中, W 1 W_1 W1 和 W 2 W_2 W2 是权重矩阵, b 1 b_1 b1 和 b 2 b_2 b2 是偏置项, σ \sigma σ 是激活函数(如ReLU、Sigmoid等)。
如果我们定义损失函数为 L ( y , t ) L(y, t) L(y,t),其中 t t t 是目标值,则通过链式法则可以计算损失函数相对于各层权重的梯度。
计算梯度的例子
-
损失函数相对于第二层输出的梯度:
∂ L ∂ z 2 = ∂ L ∂ y ⋅ ∂ y ∂ z 2 \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z_2} ∂z2∂L=∂y∂L⋅∂z2∂y -
损失函数相对于第二层权重的梯度:
∂ L ∂ W 2 = ∂ L ∂ z 2 ⋅ ∂ z 2 ∂ W 2 \frac{\partial L}{\partial W_2} = \frac{\partial L}{\partial z_2} \cdot \frac{\partial z_2}{\partial W_2} ∂W2∂L=∂z2∂L⋅∂W2∂z2 -
损失函数相对于第一层输出的梯度:
∂ L ∂ z 1 = ∂ L ∂ z 2 ⋅ ∂ z 2 ∂ a 1 ⋅ ∂ a 1 ∂ z 1 \frac{\partial L}{\partial z_1} = \frac{\partial L}{\partial z_2} \cdot \frac{\partial z_2}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} ∂z1∂L=∂z2∂L⋅∂a1∂z2⋅∂z1∂a1 -
损失函数相对于第一层权重的梯度:
∂ L ∂ W 1 = ∂ L ∂ z 1 ⋅ ∂ z 1 ∂ W 1 \frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial z_1} \cdot \frac{\partial z_1}{\partial W_1} ∂W1∂L=∂z1∂L⋅∂W1∂z1
反向传播过程
在实际操作中,反向传播从输出层开始,逐层向前计算每个参数的梯度。具体步骤如下:
- 计算输出层误差:首先计算损失函数对最后一层输出的梯度。
- 逐层传递误差:使用链式法则将误差从前一层传递到当前层,计算每层权重和偏置的梯度。
- 更新权重和偏置:利用计算出的梯度调整模型参数,通常采用梯度下降或其变体(如Adam优化器)进行参数更新。
链式法则高效地计算复杂函数的导数,这对于训练深度神经网络至关重要。通过反向传播算法,可以系统地计算每一层参数的梯度,并据此调整这些参数以最小化损失函数,从而提高模型的性能。
四、什么是梯度消失/爆炸?
4.1 问题背景:深层神经网络
在深度神经网络中,参数更新需要从最后一层反向传播到第一层。梯度在传播过程中会逐层连乘,导致两种问题:
- 梯度消失:梯度越来越小 → 浅层参数几乎不更新
- 梯度爆炸:梯度越来越大 → 参数更新失控
4.2 数学解释
假设网络有3层,每层梯度为 ∂ z ( k + 1 ) ∂ z ( k ) \frac{\partial z^{(k+1)}}{\partial z^{(k)}} ∂z(k)∂z(k+1),则总梯度为:
∂ L ∂ W ( 1 ) = ∂ L ∂ z ( 3 ) ⋅ ∂ z ( 3 ) ∂ z ( 2 ) ⋅ ∂ z ( 2 ) ∂ z ( 1 ) \frac{\partial \mathcal{L}}{\partial W^{(1)}} = \frac{\partial \mathcal{L}}{\partial z^{(3)}} \cdot \frac{\partial z^{(3)}}{\partial z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial z^{(1)}} ∂W(1)∂L=∂z(3)∂L⋅∂z(2)∂z(3)⋅∂z(1)∂z(2)
- 如果每层梯度 < 1 <1 <1 → 连乘后趋近于0(梯度消失)
- 如果每层梯度 > 1 >1 >1 → 连乘后趋向无穷大(梯度爆炸)
4.3 生活案例
想象一个传话游戏:
- 梯度消失:每经过一个人,信息丢失一半。经过10人后,信息只剩 1 / 1024 1/1024 1/1024 → 几乎消失。
- 梯度爆炸:每经过一个人,信息夸大两倍。经过10人后,信息变成 1024 1024 1024 倍 → 完全失真。
4.4 具体数值示例
场景 | 每层梯度 | 经过10层后的总梯度 |
---|---|---|
梯度消失 | 0.5 | 0. 5 10 ≈ 0.001 0.5^{10} ≈ 0.001 0.510≈0.001 |
梯度爆炸 | 2.0 | 2 10 = 1024 2^{10} = 1024 210=1024 |
五、如何解决梯度消失/爆炸?
5.1 梯度消失的解决方案
-
使用ReLU激活函数:导数在正区间恒为1,避免连乘衰减。
def relu(x):return max(0, x)
-
残差连接(ResNet):增加“短路路径”,让梯度直接回传。
-
LSTM/GRU:门控机制控制信息流动,避免长期依赖丢失。
5.2 梯度爆炸的解决方案
- 梯度裁剪(Gradient Clipping):设定梯度最大值。
max_gradient = 1.0 if gradient > max_gradient:gradient = max_gradient
- 权重正则化:限制权重的大小,防止过大。
loss = original_loss + λ * (权重的L2范数)
- 合理的权重初始化:如Xavier初始化,适配激活函数。
W = np.random.randn(n_input, n_output) * sqrt(2 / (n_input + n_output))
六、知识总结表
概念 | 核心问题 | 解决方法 |
---|---|---|
梯度下降 | 如何找到损失函数最小值? | 沿负梯度方向更新参数 |
梯度消失 | 深层网络梯度趋近于0 | ReLU、残差连接、LSTM |
梯度爆炸 | 深层网络梯度趋向无穷大 | 梯度裁剪、权重正则化、Xavier初始化 |
假设你训练一个10层神经网络,使用Sigmoid激活函数,发现浅层权重几乎不更新,可能是梯度消失。可改用ReLU或添加残差连接。
如果训练时损失突然变成NaN(非数字),可能是梯度爆炸。可尝试梯度裁剪或减小学习率。
七、演示梯度计算
通过一个具体的 3层全连接网络 来完整演示梯度计算、链式法则和参数更新过程。这里以简单的二分类任务为例,使用 Sigmoid激活函数 和 均方误差损失。
7.1 网络结构定义
- 输入层:2个神经元(特征)
- 隐藏层:2个神经元(Sigmoid激活)
- 输出层:1个神经元(Sigmoid激活)
7.2 参数初始化
假设初始权重和偏置为:
W ( 1 ) = [ 0.1 0.2 − 0.3 0.4 ] , b ( 1 ) = [ 0.5 − 0.6 ] W ( 2 ) = [ 0.7 − 0.8 ] , b ( 2 ) = 0.9 W^{(1)} = \begin{bmatrix} 0.1 & 0.2 \\ -0.3 & 0.4 \end{bmatrix}, \quad b^{(1)} = \begin{bmatrix} 0.5 \\ -0.6 \end{bmatrix} \\ W^{(2)} = \begin{bmatrix} 0.7 & -0.8 \end{bmatrix}, \quad b^{(2)} = 0.9 W(1)=[0.1−0.30.20.4],b(1)=[0.5−0.6]W(2)=[0.7−0.8],b(2)=0.9
7.3 输入样本
输入特征和标签为:
x = [ 1.0 2.0 ] , y = 1 x = \begin{bmatrix} 1.0 \\ 2.0 \end{bmatrix}, \quad y = 1 x=[1.02.0],y=1
7.4 正向传播(Forward Pass)
我们逐步计算每层的输出:
1. 输入层 → 隐藏层
z ( 1 ) = W ( 1 ) x + b ( 1 ) = [ 0.1 × 1 + 0.2 × 2 + 0.5 − 0.3 × 1 + 0.4 × 2 − 0.6 ] = [ 0.1 + 0.4 + 0.5 − 0.3 + 0.8 − 0.6 ] = [ 1.0 − 0.1 ] a ( 1 ) = σ ( z ( 1 ) ) = [ 1 1 + e − 1.0 1 1 + e 0.1 ] ≈ [ 0.731 0.525 ] z^{(1)} = W^{(1)}x + b^{(1)} = \begin{bmatrix} 0.1 \times 1 + 0.2 \times 2 + 0.5 \\ -0.3 \times 1 + 0.4 \times 2 - 0.6 \end{bmatrix} = \begin{bmatrix} 0.1 + 0.4 + 0.5 \\ -0.3 + 0.8 - 0.6 \end{bmatrix} = \begin{bmatrix} 1.0 \\ -0.1 \end{bmatrix} \\ a^{(1)} = \sigma(z^{(1)}) = \begin{bmatrix} \frac{1}{1+e^{-1.0}} \\ \frac{1}{1+e^{0.1}} \end{bmatrix} \approx \begin{bmatrix} 0.731 \\ 0.525 \end{bmatrix} z(1)=W(1)x+b(1)=[0.1×1+0.2×2+0.5−0.3×1+0.4×2−0.6]=[0.1+0.4+0.5−0.3+0.8−0.6]=[1.0−0.1]a(1)=σ(z(1))=[1+e−1.011+e0.11]≈[0.7310.525]
2. 隐藏层 → 输出层
z ( 2 ) = W ( 2 ) a ( 1 ) + b ( 2 ) = 0.7 × 0.731 + ( − 0.8 ) × 0.525 + 0.9 ≈ 0.512 − 0.420 + 0.9 = 0.992 a ( 2 ) = σ ( z ( 2 ) ) = 1 1 + e − 0.992 ≈ 0.729 z^{(2)} = W^{(2)}a^{(1)} + b^{(2)} = 0.7 \times 0.731 + (-0.8) \times 0.525 + 0.9 \approx 0.512 - 0.420 + 0.9 = 0.992 \\ a^{(2)} = \sigma(z^{(2)}) = \frac{1}{1+e^{-0.992}} \approx 0.729 z(2)=W(2)a(1)+b(2)=0.7×0.731+(−0.8)×0.525+0.9≈0.512−0.420+0.9=0.992a(2)=σ(z(2))=1+e−0.9921≈0.729
3. 计算损失(MSE)
L = 1 2 ( y − a ( 2 ) ) 2 = 1 2 ( 1 − 0.729 ) 2 ≈ 1 2 × 0.073 = 0.0365 \mathcal{L} = \frac{1}{2}(y - a^{(2)})^2 = \frac{1}{2}(1 - 0.729)^2 \approx \frac{1}{2} \times 0.073 = 0.0365 L=21(y−a(2))2=21(1−0.729)2≈21×0.073=0.0365
7.5 反向传播(Backward Pass)
从输出层开始,逐层计算梯度。使用链式法则,每个步骤计算局部梯度并反向传播。
1. 输出层梯度
-
损失对输出层输出的梯度:
∂ L ∂ a ( 2 ) = − ( y − a ( 2 ) ) = − ( 1 − 0.729 ) = − 0.271 \frac{\partial \mathcal{L}}{\partial a^{(2)}} = -(y - a^{(2)}) = -(1 - 0.729) = -0.271 ∂a(2)∂L=−(y−a(2))=−(1−0.729)=−0.271 -
激活函数导数:
σ ′ ( z ( 2 ) ) = a ( 2 ) ( 1 − a ( 2 ) ) = 0.729 × ( 1 − 0.729 ) ≈ 0.197 \sigma'(z^{(2)}) = a^{(2)}(1 - a^{(2)}) = 0.729 \times (1 - 0.729) \approx 0.197 σ′(z(2))=a(2)(1−a(2))=0.729×(1−0.729)≈0.197 -
梯度传播到输出层权重:
∂ L ∂ W ( 2 ) = ∂ L ∂ a ( 2 ) ⋅ σ ′ ( z ( 2 ) ) ⋅ a ( 1 ) = − 0.271 × 0.197 × [ 0.731 0.525 ] ≈ [ − 0.271 × 0.197 × 0.731 − 0.271 × 0.197 × 0.525 ] ≈ [ − 0.039 − 0.028 ] \frac{\partial \mathcal{L}}{\partial W^{(2)}} = \frac{\partial \mathcal{L}}{\partial a^{(2)}} \cdot \sigma'(z^{(2)}) \cdot a^{(1)} = -0.271 \times 0.197 \times \begin{bmatrix} 0.731 \\ 0.525 \end{bmatrix} \approx \begin{bmatrix} -0.271 \times 0.197 \times 0.731 \\ -0.271 \times 0.197 \times 0.525 \end{bmatrix} \approx \begin{bmatrix} -0.039 \\ -0.028 \end{bmatrix} ∂W(2)∂L=∂a(2)∂L⋅σ′(z(2))⋅a(1)=−0.271×0.197×[0.7310.525]≈[−0.271×0.197×0.731−0.271×0.197×0.525]≈[−0.039−0.028] -
更新输出层权重(假设学习率 η = 0.1 \eta = 0.1 η=0.1):
W new ( 2 ) = [ 0.7 − 0.8 ] − 0.1 × [ − 0.039 − 0.028 ] ≈ [ 0.7 + 0.0039 − 0.8 + 0.0028 ] = [ 0.7039 − 0.7972 ] W^{(2)}_{\text{new}} = \begin{bmatrix} 0.7 \\ -0.8 \end{bmatrix} - 0.1 \times \begin{bmatrix} -0.039 \\ -0.028 \end{bmatrix} \approx \begin{bmatrix} 0.7 + 0.0039 \\ -0.8 + 0.0028 \end{bmatrix} = \begin{bmatrix} 0.7039 \\ -0.7972 \end{bmatrix} Wnew(2)=[0.7−0.8]−0.1×[−0.039−0.028]≈[0.7+0.0039−0.8+0.0028]=[0.7039−0.7972]
2. 隐藏层梯度
-
隐藏层输出的梯度(来自输出层):
∂ L ∂ a ( 1 ) = ∂ L ∂ a ( 2 ) ⋅ σ ′ ( z ( 2 ) ) ⋅ W ( 2 ) = − 0.271 × 0.197 × [ 0.7 − 0.8 ] ≈ [ − 0.271 × 0.197 × 0.7 − 0.271 × 0.197 × ( − 0.8 ) ] ≈ [ − 0.037 0.043 ] \frac{\partial \mathcal{L}}{\partial a^{(1)}} = \frac{\partial \mathcal{L}}{\partial a^{(2)}} \cdot \sigma'(z^{(2)}) \cdot W^{(2)} = -0.271 \times 0.197 \times \begin{bmatrix} 0.7 \\ -0.8 \end{bmatrix} \approx \begin{bmatrix} -0.271 \times 0.197 \times 0.7 \\ -0.271 \times 0.197 \times (-0.8) \end{bmatrix} \approx \begin{bmatrix} -0.037 \\ 0.043 \end{bmatrix} ∂a(1)∂L=∂a(2)∂L⋅σ′(z(2))⋅W(2)=−0.271×0.197×[0.7−0.8]≈[−0.271×0.197×0.7−0.271×0.197×(−0.8)]≈[−0.0370.043] -
隐藏层激活导数:
σ ′ ( z ( 1 ) ) = a ( 1 ) ⊙ ( 1 − a ( 1 ) ) = [ 0.731 × ( 1 − 0.731 ) 0.525 × ( 1 − 0.525 ) ] ≈ [ 0.197 0.249 ] \sigma'(z^{(1)}) = a^{(1)} \odot (1 - a^{(1)}) = \begin{bmatrix} 0.731 \times (1 - 0.731) \\ 0.525 \times (1 - 0.525) \end{bmatrix} \approx \begin{bmatrix} 0.197 \\ 0.249 \end{bmatrix} σ′(z(1))=a(1)⊙(1−a(1))=[0.731×(1−0.731)0.525×(1−0.525)]≈[0.1970.249] -
梯度传播到隐藏层权重:
∂ L ∂ W ( 1 ) = ∂ L ∂ a ( 1 ) ⊙ σ ′ ( z ( 1 ) ) ⋅ x T = [ − 0.037 × 0.197 0.043 × 0.249 ] ⋅ [ 1.0 2.0 ] ≈ [ − 0.0073 × 1.0 − 0.0073 × 2.0 0.0107 × 1.0 0.0107 × 2.0 ] = [ − 0.0073 − 0.0146 0.0107 0.0214 ] \frac{\partial \mathcal{L}}{\partial W^{(1)}} = \frac{\partial \mathcal{L}}{\partial a^{(1)}} \odot \sigma'(z^{(1)}) \cdot x^T = \begin{bmatrix} -0.037 \times 0.197 \\ 0.043 \times 0.249 \end{bmatrix} \cdot \begin{bmatrix} 1.0 & 2.0 \end{bmatrix} \approx \begin{bmatrix} -0.0073 \times 1.0 & -0.0073 \times 2.0 \\ 0.0107 \times 1.0 & 0.0107 \times 2.0 \end{bmatrix} = \begin{bmatrix} -0.0073 & -0.0146 \\ 0.0107 & 0.0214 \end{bmatrix} ∂W(1)∂L=∂a(1)∂L⊙σ′(z(1))⋅xT=[−0.037×0.1970.043×0.249]⋅[1.02.0]≈[−0.0073×1.00.0107×1.0−0.0073×2.00.0107×2.0]=[−0.00730.0107−0.01460.0214] -
更新隐藏层权重:
W new ( 1 ) = [ 0.1 0.2 − 0.3 0.4 ] − 0.1 × [ − 0.0073 − 0.0146 0.0107 0.0214 ] ≈ [ 0.1 + 0.00073 0.2 + 0.00146 − 0.3 − 0.00107 0.4 − 0.00214 ] = [ 0.1007 0.2015 − 0.3011 0.3979 ] W^{(1)}_{\text{new}} = \begin{bmatrix} 0.1 & 0.2 \\ -0.3 & 0.4 \end{bmatrix} - 0.1 \times \begin{bmatrix} -0.0073 & -0.0146 \\ 0.0107 & 0.0214 \end{bmatrix} \approx \begin{bmatrix} 0.1 + 0.00073 & 0.2 + 0.00146 \\ -0.3 - 0.00107 & 0.4 - 0.00214 \end{bmatrix} = \begin{bmatrix} 0.1007 & 0.2015 \\ -0.3011 & 0.3979 \end{bmatrix} Wnew(1)=[0.1−0.30.20.4]−0.1×[−0.00730.0107−0.01460.0214]≈[0.1+0.00073−0.3−0.001070.2+0.001460.4−0.00214]=[0.1007−0.30110.20150.3979]
7.6 关键观察:梯度消失的成因
- Sigmoid导数衰减:在隐藏层, σ ′ ( z ( 1 ) ) ≈ [ 0.197 , 0.249 ] \sigma'(z^{(1)}) \approx [0.197, 0.249] σ′(z(1))≈[0.197,0.249],导致梯度被缩小约4-5倍。
- 链式连乘效应:若网络更深,梯度会进一步缩小。例如,假设有10层,每层梯度缩小0.2倍,总梯度将缩小 0. 2 10 ≈ 1 × 1 0 − 7 0.2^{10} \approx 1 \times 10^{-7} 0.210≈1×10−7,几乎消失。
通过这个例子可以看出:
- 梯度消失 主要由于激活函数导数小于1时的连乘效应。
- 解决方案:使用ReLU(导数为1)或残差连接(增加直连路径)。