1、前向传播和反向传播
前向传播和反向传播是神经网络训练过程中两个关键的计算过程。
前向传播用于计算神经网络的输出,反向传播则用于计算损失函数相对于每个参数的梯度并更新参数。
两者结合起来,使得神经网络能够在训练过程中不断优化,提高预测精度。
1.1 前向传播(Forward Propagation)
1.1.1 定义
前向传播是指数据从输入层经过各个隐藏层,最终到达输出层的过程。在这个过程中,数据通过网络的权重和激活函数,逐层计算出预测值。
1.1.2 过程
1.输入层:接受输入数据 ( x )。
2.隐藏层:每个隐藏层中的每个神经元将输入值与相应的权重相乘,再加上偏置,然后通过激活函数进行非线性变换。公式如下:
其中,( w ) 是权重,( b ) 是偏置,( f ) 是激活函数,( z ) 是线性组合后的值,( a ) 是激活后的值。
3.输出层:最终输出层的计算方式类似于隐藏层,将最后一层隐藏层的输出值进行线性变换和激活,得到最终的预测值。
1.2 反向传播(Backpropagation)
1.2.1 定义
反向传播是计算损失函数相对于每个参数(权重和偏置)的梯度的过程。这些梯度用于调整模型参数,以最小化损失函数,从而提高模型的预测精度。
1.2.2 过程
- 计算损失:在前向传播结束后,计算模型预测值与实际值之间的损失(误差)。常用的损失函数有均方误差(MSE)、交叉熵等。
- 损失对输出层梯度的计算:
- 逐层计算梯度:使用链式法则(Chain Rule)计算损失函数对每个参数的梯度,从输出层到输入层逆向传播。具体步骤包括:
- 计算损失对激活值的梯度。
- 计算激活值对线性组合值的梯度。
- 计算线性组合值对权重和偏置的梯度。
- 更新权重和偏置:使用梯度下降算法,根据计算出的梯度调整模型参数。更新公式如下:
其中,η是学习率。
2、求导和求偏导
求导和求偏导是深度学习中的基础操作,分别用于计算单变量和多变量函数的变化率。在深度学习的训练过程中,它们通过梯度计算和反向传播算法,帮助模型不断优化和提高性能。正是由于这些数学操作的精确性和高效性,深度学习才能在复杂的任务中取得成功。
梯度提供了参数更新的方向和大小,使得每一步更新都能朝着减少误差的方向进行,从而不断优化模型的性能。
通过计算损失函数对参数的梯度,梯度下降算法可以找到使损失函数最小化的参数。沿着梯度的负方向更新参数,从而达到优化目标函数的目的。
2.1 求导
求导是对函数进行微分的过程,用来计算函数的变化率。对于一个变量的函数,例如 ( f(x) ),求导得到的是函数 ( f ) 相对于变量 ( x ) 的导数f′(x) 或 。
求导得到:
2.2 求偏导
求偏导是对多变量函数进行微分的过程,用来计算一个变量的变化对函数的影响。对于两个变量 和
的函数
,相对于
的偏导数记作
,相对于
的偏导数记作
。
例如:
求相对于
和
的偏导得到:
2.3 求导和求偏导的作用
在深度学习中,求导和求偏导是关键的操作,主要用于以下方面:
2.3.1 梯度计算
梯度是多变量函数的导数向量,表示每个变量的变化对函数的影响。深度学习模型的训练过程涉及计算损失函数相对于模型参数的梯度,用于更新模型参数,以最小化损失函数。
例如,对于一个损失函数,计算梯度
:
2.3.2 反向传播算法
反向传播(Backpropagation)是深度学习模型训练中的核心算法,用于高效地计算神经网络的梯度。它基于链式法则,通过逐层应用偏导数,计算损失函数对每个参数的梯度。
例如,对于一个神经网络,反向传播通过链式法则计算损失函数 对每一层权重
的梯度:
3、梯度下降算法
梯度下降(Gradient Descent)是一种优化算法,用于寻找函数的极小值(或极大值)。在机器学习和深度学习中,梯度下降主要用于最小化损失函数,从而优化模型参数。损失函数衡量了模型的预测输出与真实输出之间的差距,通过最小化损失函数,可以提高模型的性能。
3.1 梯度下降算法的基本步骤
3.1.1 初始化参数
随机初始化模型的参数(如权重和偏置)。
3.1.2 计算损失
使用当前参数计算损失函数值。
3.1.3 计算梯度
计算损失函数相对于每个参数的梯度,即损失函数关于每个参数的偏导数。
3.1.4 更新参数
根据梯度更新参数,更新公式为:
其中,θ表示参数,η是学习率,是损失函数关于参数的梯度。
3.1.5 重复
重复步骤3.1.2到3.1.4,直到损失函数收敛或达到预定的迭代次数。
3.2 为什么梯度下降算法可以最小化损失函数?
梯度下降算法通过沿着梯度的负方向更新参数来最小化损失函数。梯度表示了函数在给定点的最大上升方向,负梯度则表示最大下降方向。通过不断地沿着负梯度方向更新参数,梯度下降算法能够逐步接近损失函数的局部极小值,最终实现全局最小化(在凸函数的情况下)。
3.3 梯度下降算法的原理
- 梯度的含义:在多维空间中,梯度是一个向量,指向函数值增长最快的方向。负梯度则指向函数值下降最快的方向。因此,沿着负梯度方向调整参数,能够快速减少损失函数值。
- 泰勒展开:梯度下降的数学基础可以通过泰勒展开来理解。假设损失函数 (L(θ)) 可以用泰勒展开式近似:
其中, 是损失函数在点
处的梯度。选择
可以使
下降,从而实现损失函数的最小化。
3.4 梯度下降的变体
- 批量梯度下降(Batch Gradient Descent):使用整个训练集计算梯度,更新参数。
- 随机梯度下降(Stochastic Gradient Descent, SGD):每次使用一个样本计算梯度并更新参数,更新更频繁但噪声较大。
- 小批量梯度下降(Mini-batch Gradient Descent):每次使用一小部分样本计算梯度并更新参数,兼顾批量梯度下降和随机梯度下降的优点。
3.5 梯度下降示例
假设我们有一个简单的二次损失函数:
我们希望通过梯度下降找到使损失函数最小的 θ。
- 初始化参数:θ=0
- 计算梯度:
- 更新参数:
假设学习率 (η = 0.1),更新公式为:
- 重复更新:
经过多次迭代后,θ 将逐渐接近 3,损失函数 L(θ) 达到最小值 0。
4、链式法则
4.1 链式法则的数学含义
链式法则(Chain Rule)是微积分中的一个重要规则,用于求复合函数的导数。假设有两个函数 ( f ) 和 ( g ),其复合函数为 ( h(x) = f(g(x)) ),链式法则表明:
h′(x)=f′(g(x))⋅g′(x)
更一般地,对于 ( n ) 个函数的复合:
h(x)=f1(f2(…fn(x)…))
链式法则表示为:
h′(x)=f1′(f2(…fn(x)…))⋅f2′(…fn(x)…)⋅…⋅fn′(x)
4.2 链式法则在神经网络中的应用
在神经网络中,链式法则是反向传播(Backpropagation)算法的基础。神经网络可以看作是多个函数的复合,每一层都是一个函数。反向传播通过链式法则计算每个参数对最终输出的影响,从而高效地计算损失函数相对于所有参数的梯度。
具体来说,假设神经网络的输出为 ( y ),损失函数为 ( L ),网络参数为 ( θ )。反向传播通过以下步骤计算梯度:
- 前向传播:计算每层的输出,从输入层到输出层。
- 计算损失:根据预测值和真实值计算损失函数 ( L )。
- 反向传播:从输出层开始,使用链式法则逐层向后计算梯度。
- 更新参数:使用梯度下降算法更新参数。
链式法则是计算神经网络梯度的核心原理,通过反向传播算法有效地计算损失函数对所有参数的梯度,从而实现模型的优化。
4.3 链式法则在反向传播中的步骤
假设我们有一个三层神经网络,输入层 ( x )、隐藏层 ( z )、输出层 ( y ),权重分别为 ( W_1 )、( W_2 ),激活函数为 ( σ ),损失函数为 ( L )。
- 前向传播:
- 反向传播:
计算输出层的梯度:
计算隐藏层的梯度:
其中,链式法则被用于将每一层的梯度传递到前一层。
4.4 为什么使用链式法则计算神经网络的梯度?
- 高效性:链式法则允许我们通过逐层传播梯度,高效地计算损失函数对每个参数的偏导数。相对于直接计算所有参数的梯度,这种逐层传播的方法大大降低了计算复杂度。
- 可扩展性:链式法则使得反向传播算法可以应用于任意深度的神经网络,无论网络结构多么复杂,梯度计算都可以通过链式法则进行。
4.5 其他计算神经网络梯度的方法
尽管链式法则和反向传播是最常用的方法,还有其他一些方法可以计算神经网络的梯度,但它们通常在效率和可扩展性上不如反向传播:
- 数值梯度:
- 通过有限差分法(finite difference method)计算梯度。尽管这种方法简单直观,但计算成本高,不适用于大规模神经网络。
- 公式:
- 符号微分:
- 使用符号计算工具(如 Mathematica)精确求导。但符号微分不适用于大规模神经网络,且计算复杂度高。
5、学习率
学习率(Learning Rate)是一个用于控制模型参数更新步伐的超参数。在梯度下降优化算法中,学习率决定了每次参数更新的步长,即在每次迭代中权重或参数应该移动多远。
学习率是梯度下降优化算法中的一个关键超参数,它控制了每次参数更新的步长。合适的学习率选择对于训练稳定性和收敛速度至关重要。固定学习率、自适应学习率和优化算法中的动态调整都是常见的学习率控制策略。理解并合理调整学习率,可以有效提升模型训练效果。
5.1 学习率的作用
- 步长控制:学习率的值决定了参数更新的步长。如果学习率太大,可能会导致跳过最优解,甚至导致发散;如果学习率太小,收敛速度会变慢,训练时间会延长。
- 训练稳定性:适当的学习率能够确保训练过程中的稳定性和高效性,有助于快速找到全局或局部最优解。
5.2 学习率的选择和调整
5.2.1 固定学习率
- 固定学习率是指在整个训练过程中使用不变的学习率。这种方式简单易行,但不适用于所有情况,因为合适的学习率值可能会随着训练进程的变化而变化。
5.2.2 自适应学习率
- 学习率衰减:随着训练的进行,逐渐减小学习率。例如,可以按照某种预定的计划,每经过一定的迭代次数就减少学习率。
- 学习率调度器:根据训练进展动态调整学习率,例如根据验证集的表现来调整学习率。
- 自适应优化算法:如 AdaGrad、RMSprop、Adam 等,它们通过算法内部机制自动调整每个参数的学习率。这些算法在处理稀疏数据和复杂模型时表现特别优异。
5.3 学习率的计算
学习率本身通常是一个预先设定的超参数,并不需要计算。然而,优化算法可以动态调整学习率。例如,Adam 优化算法会根据过去梯度的一阶矩估计(均值)和二阶矩估计(方差)来计算参数的更新步长:
5.3.1 Adam 算法中的学习率调整
Adam 算法通过以下公式计算参数更新:
6、实例讲解
反向传播通过计算损失函数相对于每个权重的梯度,并根据这些梯度调整权重,从而使得模型预测更准确。这种方法非常高效,特别适用于深层神经网络中的大量参数优化。每一次迭代,模型都会变得越来越好,逐渐逼近最优解。
为了说明反向传播是如何优化神经网络模型的,我们可以用一个简单的例子来解释。假设我们有一个最简单的神经网络,用于预测某个单一输入 ( x ) 的输出 ( y )。
6.1 示例网络
假设我们的神经网络只有一层,具有一个输入节点 ( x )、一个输出节点 ( y ),以及一个可训练的权重 ( w )。网络结构如下:
我们使用一个非常简单的损失函数,即均方误差(Mean Squared Error, MSE):
6.2 前向传播
- 输入数据:
- 实际值:
- 初始权重(假设初始值为 1):
- 计算预测值:
- 计算损失:
6.3 反向传播
反向传播的目的是通过计算损失函数相对于权重 ( w ) 的梯度,调整权重 ( w ) 以最小化损失函数。
- 计算损失函数对预测值的梯度:
- 计算预测值对权重的梯度:
- 应用链式法则计算损失函数对权重的梯度:
- 更新权重(假设学习率为 0.1):
6.4 更新后权重的结果
我们重新用更新后的权重进行一次前向传播:
- 更新后的预测值:
- 更新后的损失:
可以看到,更新权重后,损失从 4 减少到了 0.16。这个过程会持续进行,直到损失函数达到最小值。