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

第一章:人工智能之不同数据类型及其特点梳理
第二章:自然语言处理(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)或残差连接(增加直连路径)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十一) 实现服务端和客户端socketio 连接

1.后端部分 socketIO文档参考Socket.IO 首先在lib下新建socket.js文件 参考服务器API | Socket.IO import {Server} from socket.io; import http from http import express from "express"const app express() const server http.createServer(app) const io …

Spring Boot使用JDBC /JPA访问达梦数据库

Spring Boot 是一个广泛使用的 Java 框架&#xff0c;用于快速构建基于 Spring 的应用程序。对于达梦数据库&#xff08;DMDB&#xff09;的支持&#xff0c;Spring Boot 本身并没有直接内置对达梦数据库的集成&#xff0c;但你可以通过一些配置和依赖来支持达梦数据库。 以下…

蓝桥杯嵌入式学习日记(三)——按键的长按、短按与双击(三行按键法)【STM32】【HAL库】

目录 一、查阅相关资料二、程序的编写1、创建工程2、三行按键法3、短按与长按4、双击 一、查阅相关资料 想要进行一块板子的开发&#xff0c;需要先查阅资料了解器件连接。   从CT117E-M4产品手册中不难发现&#xff0c;按键分别有PB0、PB1、PB2、PA0分别对应B1、B2、B3、B4…

【网络安全 | 漏洞挖掘】通过JWT的IDOR实现账户接管

未经许可,不得转载。 文章目录 正文正文 在审查目标平台“redirect.com”的Web应用时,我发现它使用了JSON Web Token(JWT)进行身份验证,因此决定尝试进行账户接管(ATO)攻击。 首先,我创建了一个新账户并测试了其功能。在此过程中,我尝试在“firstName”字段输入XSS(…

从0到1入门RabbitMQ

一、同步调用 优势&#xff1a;时效性强&#xff0c;等待到结果后才返回 缺点&#xff1a; 拓展性差性能下降级联失败问题 二、异步调用 优势&#xff1a; 耦合度低&#xff0c;拓展性强异步调用&#xff0c;无需等待&#xff0c;性能好故障隔离&#xff0c;下游服务故障不影响…

CST直角反射器 --- 距离多普勒(RD图), 毫米波汽车雷达ADAS

之前几期介绍了雷达是如何从频域换去时域&#xff0c;然后时域计算距离。 这期我们加上一个维度&#xff0c;既看距离&#xff0c;又看速度。速度的计算当然就是多普勒原理&#xff0c;所以距离速度的二维图又叫range-doppler图。 启用雷达ADAS Range-Doppler模板&#xff1a…

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器&#xff0c;用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂&#xff0c;但通过手写一个简易版的 Tomcat&#xff0c;我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat&#xff0c;并深…

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理

【从零开始学习计算机科学】计算机组成原理&#xff08;六&#xff09;异常事件处理 异常事件处理异常处理的数据通路异常事件入口地址 异常事件处理 异常和中断事件改变处理机正常指令的执行顺序。异常指令执行过程中&#xff0c;由于操作非法和指令非法引起的事件。陷阱指陷…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…

高效运行 QwQ-32B + 错误修复

文章目录 QwQ-32B 错误修复⚙️ 官方推荐设置&#x1f44d; 推荐的 llama.cpp 设置&#x1f4d6; 教程&#xff1a;运行和修复的 QwQ-32B1、对于 llama.cpp 及使用 llama.cpp 的引擎&#xff1a;2、下载模型 测试3、测试/评估4、尝试不使用我们的修复方案&#xff1a; &#x…

R 语言科研绘图 --- 直方图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

1.5.1 掌握Scala内建控制结构 - 条件表达式

本文介绍了 Scala 中条件表达式的使用及其在实际任务中的应用。条件表达式的语法为 if (条件) 值1 else 值2&#xff0c;其结果类型取决于值1和值2的类型。如果类型相同&#xff0c;结果类型与它们相同&#xff1b;如果不同&#xff0c;则结果类型为 Any。通过两个任务展示了条…

Linux rootfs:如何开机就自动添加某个用户?

前言 项目开发需求&#xff0c;需要开机后就自动创建某个用户密码 厂家提供的sdk&#xff0c;只有adduser命令&#xff0c; 该命令添加用户时&#xff0c;会有终端交互&#xff0c; 需要手动输入2次密码&#xff0c; 所以无法通过简单脚本方式创建。 要实现自动填充密码&…

计算机三级网络技术知识点汇总【7】

第七章 路由器配置及使用 1. 路由器的基础知识 1.1 路由器的基本概念 路由器是工作在网络层的设备&#xff0c;负责将数据分组从源端主机经最佳路径传送到目的端主机&#xff0c;实现在网络层的互联。路由器工作在 TCP/IP 网络模型的网络层&#xff0c;对应于 OSI 网络参考模…

Compounding Geometric Operations for Knowledge Graph Completion(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2023年7月 25年3月10日交 一、简介 使用知识图谱嵌入模型&#xff0c;将三元组&#xff08;h,r,t&#xff09;中关系 r 转化为平移、旋转、缩放矩阵对头节点以及尾节点进行运算&#xff0c;判定三元组的真实性。 二、原理 1.整…

mac系统安装

目录 准备工作 一、安装虚拟机 二、解锁系统 三、安装系统 四、部署系统 五、安装VMware Tools(选做) 为什么要安装VMware Tools,这是啥玩意? 六、配置共享文件夹(选做) 为什么要共享文件夹? 注意事项: 七、安装完成 准备工作 一、安装说明: 本教程分为7个部…

DNASimCLR:一种基于对比学习的基因序列数据分类的深度学习方法

摘要 DNASimCLR利用卷积神经网络和基于对比学习的SimCLR框架&#xff0c;从不同的微生物基因序列中提取复杂的特征。在包含宏基因组和病毒基因序列的两个经典的大规模未标记数据集上进行了预训练。后续的分类任务通过使用先前获得的模型对预训练的模型进行微调来完成。我们的实…

Ae 效果详解:VR 旋转球面

Ae菜单&#xff1a;效果/沉浸式视频/VR 旋转球面 Immersive Video/VR Rotate Sphere VR 旋转球面 VR Rotate Sphere效果用于对 VR 视频进行三轴旋转&#xff0c;以调整视频的视角方向。可用于校正拍摄时的角度偏差&#xff0c;或者根据创意需求模拟摄像机旋转。 本效果适用于所…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

&#xff08;1Prompt1Story&#xff09;是一种无训练的文本到图像生成方法&#xff0c;通过整合多个提示为一个长句子&#xff0c;并结合奇异值重加权&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技术&#xff0c;解决了生成图像中身份不一致…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…