前向传播与反向传播
在单层神经网络的优化算法里,我们讲到优化算法是为了寻找模型参数使得网络的损失值最小,这里详细介绍一下应用的基础——反向传播算法。
在神经网络中,梯度计算是通过反向传播算法来实现的。反向传播算法用于计算损失函数相对于网络参数(如权重和偏置)的梯度,从而进行参数的更新和优化。梯度计算的过程可以分为两个关键步骤:前向传播和反向传播。
前向传播:
输入数据通过网络的每一层,从输入层传递到输出层。在每个神经元中,进行线性变换和激活函数操作,计算每个神经元的输出值。
前向传播过程中,将输入数据逐层传递,直到得到最终的输出预测结果。
以前面的多层感知机为例:
其中表示激活函数。
设损失函数,记作L,真实标签是,
则
图 前向传播计算图
反向传播:
在前向传播之后,计算损失函数相对于网络参数的梯度,以衡量预测结果与实际标签之间的差异。
在计算梯度的过程中,反向传播算法的基本思想是通过计算输出误差对网络中各个权重的偏导数,然后根据这些偏导数结合使用梯度下降法则调整权重,使得网络的输出误差逐渐减小,使得网络能够更好地逼近真实标签。它使用了链式法则来计算网络中每个神经元的偏导数。涉及到每个神经元的激活函数导数、权重和偏置的导数等。
反向传播算法的关键在于通过链式法则计算每个神经元的误差贡献,并根据这些误差贡献来调整权重。它使得神经网络能够学习如何将输入映射到期望的输出,并且可以处理大量的训练样本以提高网络的泛化能力。
反向传播算法通常结合使用梯度下降法则来进行权重的调整。梯度下降法则是一种基于优化的方法,通过沿着误差曲面的负梯度方向进行迭代,以找到误差最小的权重值。反向传播算法利用了梯度下降法则来计算权重调整量,从而优化神经网络的性能。
反向传播实例计算
这是一个简单的两层神经网络,输入数据是1*2的向量,中间一个含有3个神经元的隐藏层,输出层为1*1的向量,简化起见,偏置b设为0,激活函数选择ReLu,根据前面推导的公式,
给定值,,并给定参数初始化值均为0.5;标签值(真实值)y=2;
则 ;
;
;
到了这里,神经网络的前向传播过程就已经完成了,最后输出的便是前向神经网络计算出来的预测结果,并不一定是准确值(真实的标签值y)
因此,最终输出的预测结果与y是有一定出入,然后利用上文所说的损失函数和优化算法来更新参数,使得误差最小。
最常见的损失函数就是最小二乘法损失函数:
所以这里的总损失值(误差) :
现在开始进行反向传播,反向传播的目的是为了更新权重W,至于每个权重W对最后的误差造成了多少影响,可以用整体误差对特定权重参数求偏导得出:这是根据链式法则得到的
下面分别计算上面链式当中的最后一个偏导:
到这里我们就计算出整体误差L对的偏导值,这个值的含义就是指这个参数对最后整体误差的影响程度(叫做梯度值),可正可负。
梯度更新
计算得到损失函数对参数的偏导值之后,便可以根据设置的超参数学习率η利用梯度下降法来更新参数,这里设置成0.1:
再来计算一下前面层的参数偏导数:
同上,根据学习率更新参数即可。
这就是对一个前向传播中的某个参数进行梯度更新的过程,当然这个更新过程不可能是一次完成的,在进行完一次反向传播更新梯度后紧接着会进行下一个前向传播,然后重新计算误差,这样多次循环之后会使得损失值逐渐降低,当达到某个设定值时这个循环更新梯度的过程就会停止,从而完成一整个训练流程。
总结起来,神经元梯度计算的过程是通过反向传播算法,在每一层中根据当前层的输出和上一层的梯度,计算当前层的梯度。这样,根据梯度计算的结果,可以使用特定的梯度更新算法来更新模型的参数。常用的梯度更新算法包括随机梯度下降(Stochastic Gradient Descent,SGD)、Adam等
步骤总结
以下是反向传播算法的基本步骤:
正向传播:将输入特征通过网络前向传递,输出网络的预测值。
计算预测误差:将网络的预测值与真实值(标签)代入损失函数,计算得到网络的预测误差。
反向传播:根据链式法则,将输出层的预测误差回传到前面各层,逐层计算预测误差对每个参数的导数。
计算参数更新值:根据预测误差对每个参数的导数,结合设置的超参数学习率,计算每个参数的更新量(一般是导数*学习率,这就是优化算法作用的位置,可以为梯度下降法等)。
更新权重:一般是原参数减去参数的更新量,更新它们的数值。
重复以上步骤:重复执行步骤1到步骤5,直到网络的输出误差达到可接受的范围或达到预定的训练轮数。
思考以下几个问题:
1.参数权重矩阵和个别参数更新的关系:如上图是函数的变量是以矩阵的形式体现的,但在计算参数偏导时是具体到每个参数的,所以注意求偏导时函数要展开成针对参数矩阵里特定的参数。
2.反向传播的顺序;从的计算可以看到,前面网络层的参数更新依赖后面网络层的参数,所以参数如果过小,经过连乘效应,前面的参数基本得不到更新,这就是所谓的参数消失。
3.网络保存着前向传播计算得到的值,包括隐藏层,所以在反向传播计算时候可以直接拿到这些值,不过这也需要存储空间。
参考资料
https://zh.d2l.ai/index.html