Dive-into-DL-TensorFlow2.0 项目解析:深度学习中正向传播与反向传播的数学原理
Dive-into-DL-TensorFlow2.0 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-TensorFlow2.0
引言
在深度学习模型的训练过程中,正向传播(Forward Propagation)和反向传播(Back Propagation)是两个最核心的概念。理解这两个过程的数学原理和实现细节,对于掌握深度学习至关重要。本文将基于一个带L2正则化的单隐藏层多层感知机模型,详细解析正向传播和反向传播的计算过程。
正向传播:从输入到输出的计算过程
正向传播是指神经网络从输入层到输出层依次计算并存储中间变量的过程。让我们以一个具体的例子来说明:
1. 输入层到隐藏层的计算
假设输入是一个特征向量x ∈ ℝᵈ,隐藏层的权重参数为W⁽¹⁾ ∈ ℝʰˣᵈ(不考虑偏置项),则中间变量z的计算为:
z = W⁽¹⁾x
这里z ∈ ℝʰ是隐藏层的线性变换结果。
2. 激活函数的应用
将中间变量z输入激活函数ϕ(如ReLU、sigmoid等),得到隐藏层的输出h:
h = ϕ(z)
3. 隐藏层到输出层的计算
假设输出层权重参数为W⁽²⁾ ∈ ℝᵠˣʰ,则输出o的计算为:
o = W⁽²⁾h
4. 损失函数的计算
设损失函数为ℓ,样本标签为y,则单个样本的损失L为:
L = ℓ(o, y)
5. 正则化项的计算
加入L2正则化项,超参数为λ:
s = (λ/2)(‖W⁽¹⁾‖²_F + ‖W⁽²⁾‖²_F)
其中‖·‖_F表示矩阵的Frobenius范数。
6. 目标函数的计算
最终的目标函数J是损失项和正则化项的和:
J = L + s
计算图可视化
计算图是理解神经网络计算过程的强大工具。在我们的例子中,计算图可以清晰地展示从输入x到输出J的所有计算步骤和依赖关系:
- 输入x与权重W⁽¹⁾进行矩阵乘法得到z
- z通过激活函数ϕ得到h
- h与权重W⁽²⁾进行矩阵乘法得到o
- o与y计算损失L
- W⁽¹⁾和W⁽²⁾计算正则化项s
- 最后将L和s相加得到J
这种可视化方法帮助我们直观理解神经网络中数据的流动方向和各部分之间的依赖关系。
反向传播:梯度的计算与传递
反向传播是计算神经网络参数梯度的核心算法,它基于链式法则,从输出层向输入层反向计算梯度。
1. 目标函数梯度的初始化
首先计算目标函数J对L和s的梯度:
∂J/∂L = 1
∂J/∂s = 1
2. 输出层梯度的计算
计算J对输出o的梯度:
∂J/∂o = ∂L/∂o
3. 正则化项梯度的计算
计算正则化项对两个权重参数的梯度:
∂s/∂W⁽¹⁾ = λW⁽¹⁾
∂s/∂W⁽²⁾ = λW⁽²⁾
4. 输出层参数梯度的计算
计算J对W⁽²⁾的梯度:
∂J/∂W⁽²⁾ = (∂J/∂o)hᵀ + λW⁽²⁾
5. 隐藏层梯度的传播
计算J对隐藏层输出h的梯度:
∂J/∂h = W⁽²⁾ᵀ(∂J/∂o)
6. 激活函数梯度的计算
计算J对z的梯度(注意按元素乘):
∂J/∂z = (∂J/∂h) ⊙ ϕ'(z)
7. 输入层参数梯度的计算
最后计算J对W⁽¹⁾的梯度:
∂J/∂W⁽¹⁾ = (∂J/∂z)xᵀ + λW⁽¹⁾
训练过程中的相互依赖
在深度学习模型的训练过程中,正向传播和反向传播是相互依赖的:
- 正向传播需要当前参数值,这些参数值是由反向传播计算梯度后通过优化算法更新得到的
- 反向传播需要中间变量的当前值,这些值是通过正向传播计算得到的
这种相互依赖关系导致训练过程需要交替进行正向传播和反向传播:
- 首先进行正向传播计算当前预测值和中间变量
- 然后进行反向传播计算梯度
- 最后使用优化算法更新参数
值得注意的是,为了高效计算,反向传播会复用正向传播计算的中间结果,这导致训练过程比预测过程需要更多的内存资源。
关键点总结
- 正向传播:按从输入到输出的顺序计算并存储中间变量
- 反向传播:按从输出到输入的顺序计算并存储梯度和中间变量
- 训练过程:正向传播和反向传播交替进行,相互依赖
- 内存考虑:训练过程需要保存中间结果,因此比预测需要更多内存
理解正向传播和反向传播的数学原理和实现细节,是掌握深度学习模型训练的关键。这些知识不仅帮助我们更好地理解神经网络的工作原理,也为调试模型和优化性能提供了理论基础。
Dive-into-DL-TensorFlow2.0 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-TensorFlow2.0
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考