梯度下降法(Gradient Descent)是机器学习中一种非常重要的优化算法,已知机器学习模型中有参数 ,经过初始化参数后,我们可以得到预测结果 ,通过与已知结果 对比,定义损失函数(loss function) ,通过梯度下降不断迭代模型中的参数,逐渐使损失函数的值变小,即计算:
BP算法主要用在神经网络(深度学习)中,大多数情况下,神经网络求损失函数对中间层参数的导数是一件十分困难的事情,但BP算法能很好的解决这个问题。
BP算法最重要的两个步骤分别是Forward pass和Backward pass
首先我们知道BP算法的目的是求损失函数对权重/偏置参数的导数,即求:
即,求 即可。 是代价函数,它是 和 的距离度量,将所有的训练集的代价函数求和即为损失函数
我们以对一个神经元求 为例,根据链式求导法则:
作为此神经元的最终输入, 为此神经元的初始输入(也是前一层神经元的输出) 的个数, 为偏置。
所以我们目标即转化成了求 , 。实际上Forward pass就是用来计算 的,而Backward pass是用来求 的。
Forward pass非常简单,因为根据求导公式:
所以 的值就是这个权重关联的输入 (实际上 也是中间层hidden layer的输出,后面我们把这个输出用 表示,实际上是一个东西)
我们给一个直观的前向传播图
在神经网络模型定义好后,神经元的激活函数 (activation function)已经确定,我们定义 为一个神经元的输出,那么我们根据链式求导法则:
由于 ,所以
所以目标转化为求
我们知道:
由链式法则可得:
为此神经元输出到后层神经元的个数,即与此神经元输出相关的权重个数
所以
为便于理解,我们以下图为例:
根据上图
实际上我们就是利用上式进行反向迭代(Backward pass)
之所以叫Backward pass是因为我们是从最后一层开始计算的,即从输出层开始计算。在这里我们给一个简单的网络:
该输出层的计算如下:
当我们从输出层开始计算时,由于 是可以直接求得的,所以最后一层的 是可以求得的。
所以Backward pass的原理图如下:
根据上图:
所以Backward pass就是先求出最后一层的 ,再通过上式一步步反向进行求出每一层的偏导 。
由于Forward Pass已经计算出 ,Backward pass已经求出 ,我们只要令其对应相乘即可得 。
上面的推导是非常直观的,但数学推导很不漂亮,虽然便于理解,但详细的数学推导是也是很有必要的。
我们首先给出网络中各个参数的清晰定义,我们使用 表示从第 层的第 个神经元到第 层的第 个神经元的链接上的权重;使用 表示在第 层第 个神经元的偏置;使用 表示第 层第 个神经元的激活值。
下面是直观图示:
我们知道第 层的第 个神经元的激活值 和第 层的激活值通过激活函数联系起来了,那么就有公式:
为了便于运算和公式的简洁性,我们可以将上述方程写成向量形式:
是每一层 的权重矩阵, 为偏置向量, 为激活向量。
我们再定义一个中间量 , ,称为 层的带权输入。
在这里我们定义一个参量 ,叫做第 层上第 个神经元上的误差:
我们给一个定义,Hadamard 乘积,用 表示,Hadamard 乘积实际上就是两个相同维度的向量按元素乘起来。
我们给一个例子
1) 输出层误差的方程
我们把它转化成矩阵表示的形式:
2) 使用下一层的误差 来表示当前层的误差
3) 代价函数关于网络中任意偏置的改变率
可以简写为
4) 代价函数关于任何一个权重的改变率
可以简化为
1.输入 :为输入层设置对应的激活值 。
2.前向传播:对每个 ,计算相应的 。
3.输出层误差 :计算向量 。
4.反向传播误差:对每个 ,计算 。
5.输出:代价函数的梯度由 得出