理解梯度下降、链式法则、梯度消失/爆炸

第一章:人工智能之不同数据类型及其特点梳理
第二章:自然语言处理(NLP):文本向量化从文字到数字的原理
第三章:循环神经网络RNN:理解 RNN的工作机制与应用场景(附代码)
第四章:循环神经网络RNN、LSTM以及GRU 对比(附代码)
第五章:理解Seq2Seq的工作机制与应用场景中英互译(附代码)
第六章:深度学习架构Seq2Seq-添加并理解注意力机制(一)
第七章:深度学习架构Seq2Seq-添加并理解注意力机制(二)
第八章:深度学习模型Transformer初步认识整体架构
第九章:深度学习模型Transformer核心组件—自注意力机制
第十章:理解梯度下降、链式法则、梯度消失/爆炸
第十一章:Transformer核心组件—残差连接与层归一化
第十二章:Transformer核心组件—位置编码

一、求导的基本知识

在这里插入图片描述
求导是微积分中的一个基本操作,用于计算函数在某一点上的瞬时变化率。这里列出一些常见的求导公式和规则,这些对于理解链式法则以及深度学习中的梯度计算非常重要。

1.1 基本求导公式

  1. 常数的导数
    d d x ( c ) = 0 \frac{d}{dx}(c) = 0 dxd(c)=0,其中 c c c 是常数。

  2. 幂函数的导数
    d d x ( x n ) = n x n − 1 \frac{d}{dx}(x^n) = nx^{n-1} dxd(xn)=nxn1,其中 (n) 是任意实数。

  3. 指数函数的导数
    d d x ( e x ) = e x \frac{d}{dx}(e^x) = e^x dxd(ex)=ex

  4. 对数函数的导数
    d d x ( ln ⁡ ( x ) ) = 1 x \frac{d}{dx}(\ln(x)) = \frac{1}{x} dxd(ln(x))=x1

  5. 三角函数的导数

    • 正弦函数: 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 求导规则

  1. 加法/减法规则
    如果 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)

  2. 乘法规则(莱布尼茨法则)
    如果 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)

  3. 除法规则
    如果 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)

  4. 链式法则
    如果 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=dgdfdxdg
    或者写作
    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 通过以下步骤计算:

  1. 线性变换 z = W x + b z = Wx + b z=Wx+b,其中 W W W 是权重矩阵, x x x 是输入向量, b b b 是偏置项。
  2. 激活函数 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=N1i=1N(yiai)2,此时理解 y i y_i yi是一个常量, L L L 就是一个 关于 a a a 的函数,我们想要计算 L L L 对于 W W W 的导数。根据链式法则:

  1. 首先计算 L L L 对于激活值 a a a 的导数
    ∂ L ∂ a \frac{\partial L}{\partial a} aL

  2. 然后计算 a a a 对于 z z z 的导数(即激活函数的导数):
    ∂ a ∂ z = σ ′ ( z ) \frac{\partial a}{\partial z} = \sigma'(z) za=σ(z)

  3. 最后计算 z z z 对于 W W W 的导数
    ∂ z ∂ W = x \frac{\partial z}{\partial W} = x Wz=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} WL=aLzaWz

这展示了如何利用基本的求导规则和链式法则来计算复杂的多层网络中各参数的梯度。这种梯度信息对于更新模型参数至关重要。

二、什么是梯度下降

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=1N(yi(wxi+b))2
梯度下降的步骤:

  1. 随机初始化 w w w b b b
  2. 此时 x i 和 y i x_i 和 y_i xiyi是一个常量,可以理解为第 i 个样本,x 的特征取值,y 的标签真实取值。
  3. 计算梯度:
    • ∂ 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)) wL=N2i=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)) bL=N2i=1N(yi(wxi+b))
  4. 更新参数:
    • w = w − η ⋅ ∂ L ∂ w w = w - \eta \cdot \frac{\partial \mathcal{L}}{\partial w} w=wηwL
    • b = b − η ⋅ ∂ L ∂ b b = b - \eta \cdot \frac{\partial \mathcal{L}}{\partial b} b=bηbL

三、梯度链式法则

假设有一个复合函数 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=dgdfdxdg

这意味着,为了计算 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 是目标值,则通过链式法则可以计算损失函数相对于各层权重的梯度。

计算梯度的例子

  1. 损失函数相对于第二层输出的梯度
    ∂ 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} z2L=yLz2y

  2. 损失函数相对于第二层权重的梯度
    ∂ 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} W2L=z2LW2z2

  3. 损失函数相对于第一层输出的梯度
    ∂ 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} z1L=z2La1z2z1a1

  4. 损失函数相对于第一层权重的梯度
    ∂ 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} W1L=z1LW1z1

反向传播过程

在实际操作中,反向传播从输出层开始,逐层向前计算每个参数的梯度。具体步骤如下:

  1. 计算输出层误差:首先计算损失函数对最后一层输出的梯度。
  2. 逐层传递误差:使用链式法则将误差从前一层传递到当前层,计算每层权重和偏置的梯度。
  3. 更新权重和偏置:利用计算出的梯度调整模型参数,通常采用梯度下降或其变体(如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)Lz(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.5100.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))
    

六、知识总结表

概念核心问题解决方法
梯度下降如何找到损失函数最小值?沿负梯度方向更新参数
梯度消失深层网络梯度趋近于0ReLU、残差连接、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.10.30.20.4],b(1)=[0.50.6]W(2)=[0.70.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.50.3×1+0.4×20.6]=[0.1+0.4+0.50.3+0.80.6]=[1.00.1]a(1)=σ(z(1))=[1+e1.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.90.5120.420+0.9=0.992a(2)=σ(z(2))=1+e0.99210.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(ya(2))2=21(10.729)221×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=(ya(2))=(10.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)(1a(2))=0.729×(10.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.7310.271×0.197×0.525][0.0390.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.70.8]0.1×[0.0390.028][0.7+0.00390.8+0.0028]=[0.70390.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.70.8][0.271×0.197×0.70.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)(1a(1))=[0.731×(10.731)0.525×(10.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.00.0073×2.00.0107×2.0]=[0.00730.01070.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.10.30.20.4]0.1×[0.00730.01070.01460.0214][0.1+0.000730.30.001070.2+0.001460.40.00214]=[0.10070.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.2101×107,几乎消失。

通过这个例子可以看出:

  1. 梯度消失 主要由于激活函数导数小于1时的连乘效应。
  2. 解决方案:使用ReLU(导数为1)或残差连接(增加直连路径)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30467.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记四:C语言中的文件和文件操作

Faye&#xff1a;只要有正确的伴奏&#xff0c;什么都能变成好旋律。 ---------《寻找天堂》 目录 一、文件介绍 1.1程序文件 1.2 数据文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2.文件的打开和关闭 2.3 文件读取结束的判定 三、 文件的顺序读写 3.1 顺序读写…

mysql下载与安装、关系数据库和表的创建

一、mysql下载&#xff1a; MySQL获取&#xff1a; 官网&#xff1a;www.mysql.com 也可以从Oracle官方进入&#xff1a;https://www.oracle.com/ 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 选择对应的版本和对应的操作系统&#xff…

(数据结构)双向链表

(数据结构)带头双向循环链表 前言 前面链表部分&#xff0c;咱们着重讲解了不带头单向不循环链表&#xff0c;简称单链表。那么链表其实也分很多种类适用于各种各样的场景。通过单链表的学习&#xff0c;其实我们已经大致了解了链表的绝大多数的内容&#xff0c;所以接下来我通…

考研英语语法全攻略:从基础到长难句剖析​

引言 在考研英语的备考之旅中,语法犹如一座灯塔,为我们在浩瀚的英语知识海洋中指引方向。无论是阅读理解中复杂长难句的解读,还是写作时准确流畅表达的需求,扎实的语法基础都起着至关重要的作用。本文将结合有道考研语法基础入门课的相关内容,为大家全面梳理考研英语语法…

【计算机网络入门】应用层

目录 1.网络应用模型 1.1 C/S模型&#xff08;客户端服务器模型&#xff09; 1.2 P2P模型&#xff08;对等模型&#xff09; 2. DNS系统 2.1 域名 2.2 域名解析流程 3. FTP文件传输协议 4. 电子邮件系统 4.1 SMTP协议 4.2 pop3协议 4.3 IMAP协议 4.4 基于万维网的电…

【GoTeams】-3:构建api、重构错误码

本文目录 1. 构建api梳理调用关系api包的作用路由梳理注册Register代码语法 2. 重构错误码 1. 构建api 首先复制project-user&#xff0c;改名为project-api&#xff0c;放在总的路径下&#xff0c;然后在工作区中进行导入。 运行命令go work use .\project-api\新建工作区之…

游戏引擎学习第145天

仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前&#xff0c;我们正在完成遗留的工作。当时我们已经将声音混合器&#xff08;sound mixer&#xff09;集成到了 SIMD 中&#xff0c;但由于一个小插曲&#xff0c;没有及时完成循环内部的部分。这个小插曲主要是…

Qt 实现绘图板(支持橡皮擦与 Ctrl+Z 撤销功能)[特殊字符]

作业&#xff1a; 1&#xff1a;实现绘图的时候&#xff0c;颜色的随时调整 2&#xff1a;追加橡皮擦功能 3&#xff1a;配合键盘事件&#xff0c;实现功能 当键盘按 ctrlz的时候&#xff0c;撤销最后一次绘图 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidge…

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果图&#xff1a; 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…

JPA编程,去重查询ES索引中的字段,对已有数据的去重过滤,而非全部字典数据

一、背景 课程管理界面&#xff0c;查询前&#xff0c;需要把查询元数据给出。 学科列表、学段列表和分类列表&#xff0c;我们把它定义为查询元数据。 一般的业务需求是&#xff1a; 系统维护好多个字典&#xff0c;比如学科、学段等等&#xff0c;相当于属性库。 但是&…

MySQL语法总结

本篇博客说明&#xff1a; &#xff01;&#xff01;&#xff01;.注意此系列都用的是MySQL语句&#xff0c;和SQLServer&#xff0c;PostgreSQL有些细节上的差别&#xff01;&#xff01;&#xff01; 1.每个操作都是先展示出语法格式 2.然后是具体例子 3.本篇注脚与文本顺讯息…

C++ Primer 交换操作

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

go切片定义和初始化

1.简介 切片是数组的一个引用&#xff0c;因此切片是引用类型&#xff0c;在进行传递时&#xff0c;遵守引用传递的机制。切片的使用和数组类似&#xff0c;遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的&#xff0c;因此切片是一个可以动态变化的数…

huggingface镜像站hf-mirror的各大AI模型文件下载

一、说明 huggingface地址&#xff1a;https://huggingface.co 但是由于需要国外网络&#xff0c;国内网络延迟较大或无法下载&#xff0c;所以使用国内镜像站&#xff1a; hf-mirror地址&#xff1a;https://hf-mirror.com/ 二、下载方法 1.本机安装了GIT 2.打开HF-Mirro…

Unity Shader 学习15:可交互式雪地流程

本质是 利用顶点变换实现的&#xff1a; 通过一个俯视整个场地的正交摄像机&#xff0c;根据绑定在移动物体身上的粒子系统&#xff0c;来获取物体移动过的位置&#xff0c;记录到一张RenderTexture上作为轨迹图&#xff0c;再通过这张图来对雪地做顶点变换。 1. 由于顶点变换需…

自由学习记录(42)

可能会出现到后面没有教程可以看&#xff0c;走不动&#xff0c;&#xff0c;但还是尝试吧 过程远比想象的要多 那连Live2d的这些脚本怎么控制的都要了解一下 ------------ 文件类型和扩展名 | 编辑手册 | Live2D Manuals & Tutorials 全部导入之后 在这下载SDK Live2D…

LeetCode - 28 找出字符串中第一个匹配项的下标

题目来源 28. 找出字符串中第一个匹配项的下标 - 力扣&#xff08;LeetCode&#xff09; 题目解析 暴力解法 本题如果采用暴力解法的话&#xff0c;可以定义两个指针 i&#xff0c;j&#xff0c;其中 i 指针用于扫描 S&#xff08;haystack&#xff09;串&#xff0c;j 指针…

windows下使用msys2编译ffmpeg

三种方法&#xff1a; 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译&#xff08;有环境变量&#xff09; 3、在msys2中使用visual studio编译&#xff08;无环境变量&#xff09; 我的环境&#xff1a; 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…

【Python 数据结构 9.树】

我装作漠视一切&#xff0c;其实我在乎的太多&#xff0c;但我知道抓得越紧越容易失去 —— 25.3.6 一、树的基本概念 1.树的定义 树是n个结点的有限集合&#xff0c;n0时为空树。当n大于0的时候&#xff0c;满足如下两个条件&#xff1a; ① 有且仅有一个特定的结点&#xff…

数据结构--AVL树

一、二叉搜索树&#xff08;Binary Search Tree, BST&#xff09; 基本性质 对于树中的每个节点&#xff0c;其左子树中的所有节点值均小于该节点值。其右子树中的所有节点值均大于该节点值。左右子树也分别是二叉搜索树。 极端场景 在极端情况下&#xff0c;如插入节点顺序…