反向传播(英语:Backpropagation缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的用来训练人工神经网络的常见方法。该方法对网络中所有權重计算损失函数的梯度这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数 在神经网络上执行梯度下降法的主要算法。該算法会先按前向传播方式计算(并缓存)每个节点的输出值然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。
我们将以全连接层激活函数采用 Sigmoid
函数,误差函数为 Softmax+MSE
损失函数的神经网络为例推导其梯度传播方式。
可以看到,Sigmoid
函数的导数表达式最终可以表达为激活函数的输出值的简单运算,利
用这一性质,在神经网络的梯度计算中,通过缓存每层的 Sigmoid 函数输出值,即可在需
要的时候计算出其导数Sigmoid 函数导数的实现:
均方差损失函数表达式为:
号节点相关,与其他节点无关因此上式中的求和符号可以去掉,均方差的导数可以推导为
对于采用 Sigmoid
激活函数的神经元模型,它的数学模型可以写为
单个神经元模型如下图所示
下面我们来计算均方差算是函数的梯喥
由于单个神经元只有一个输出,那么损失函数可以表示为
从上式可以看到,误差对权值 \(w_{j1}\) 的偏导数只与输出值 \(o_1\) 、真实值 t
以及当前权值连接的輸 \(x_j\) 有关
我们把单个神经元模型推广到单层全连接层的网络上,如下图所示输入层通过一个全连接层得到输出向量 \(o^1\) ,与真实标签姠量 t
计算均方差。输入节点数为 \(J\) ,输出节点数为 K
由此可以看到,某条连接 \(w_{jk}\) 上面的连接,只与当前连接的输出节点 \(o_k^1\) ,对应的真实值节点的标签 \(t_k^1\) ,以及對应的输入节点 x
有关。
看到这里大家也不容易毕竟这么多16个基本导数公式推导哈哈哈,不过激动的时刻到了
先回顾下输出層的偏导数16个基本导数公式推导
多层全连接层如下图所示
仿照输出层的书写方式定义
通过定义 \(\delta\) 变量,每一层的梯度表达式变得更加清晰简潔,其中 $ \delta $ 可以简单理解为当前连接 \(w_{ij}\) 对误差函数的贡献值。
其中 \(o_n\) 为倒数第三层的输入即倒数第四层的输出
依照此规律,只需要循环迭代计算每一层每个节点的 \(\delta _k^K, \delta_j^J, \delta_i^I,...\) 等值即可求得当前层的偏导数,从而得到每层权值矩阵 \(W\) 的梯度,再通过梯度下降算法迭代优化网络参数即可。
好了反向傳播算法推导完毕,代码实现可以参考另一篇博客
反向传播(英语:Backpropagation缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的用来训练人工神经网络的常见方法。该方法对网络中所有權重计算损失函数的梯度这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数 在神经网络上执行梯度下降法的主要算法。該算法会先按前向传播方式计算(并缓存)每个节点的输出值然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。
我们将以全连接层激活函数采用 Sigmoid
函数,误差函数为 Softmax+MSE
损失函数的神经网络为例推导其梯度传播方式。
可以看到,Sigmoid
函数的导数表达式最终可以表达为激活函数的输出值的简单运算,利
用这一性质,在神经网络的梯度计算中,通过缓存每层的 Sigmoid 函数输出值,即可在需
要的时候计算出其导数Sigmoid 函数导数的实现:
均方差损失函数表达式为:
号节点相关,与其他节点无关因此上式中的求和符号可以去掉,均方差的导数可以推导为
对于采用 Sigmoid
激活函数的神经元模型,它的数学模型可以写为
单个神经元模型如下图所示
下面我们来计算均方差算是函数的梯喥
由于单个神经元只有一个输出,那么损失函数可以表示为
从上式可以看到,误差对权值 \(w_{j1}\) 的偏导数只与输出值 \(o_1\) 、真实值 t
以及当前权值连接的輸 \(x_j\) 有关
我们把单个神经元模型推广到单层全连接层的网络上,如下图所示输入层通过一个全连接层得到输出向量 \(o^1\) ,与真实标签姠量 t
计算均方差。输入节点数为 \(J\) ,输出节点数为 K
由此可以看到,某条连接 \(w_{jk}\) 上面的连接,只与当前连接的输出节点 \(o_k^1\) ,对应的真实值节点的标签 \(t_k^1\) ,以及對应的输入节点 x
有关。
看到这里大家也不容易毕竟这么多16个基本导数公式推导哈哈哈,不过激动的时刻到了
先回顾下输出層的偏导数16个基本导数公式推导
多层全连接层如下图所示
仿照输出层的书写方式定义
通过定义 \(\delta\) 变量,每一层的梯度表达式变得更加清晰简潔,其中 $ \delta $ 可以简单理解为当前连接 \(w_{ij}\) 对误差函数的贡献值。
其中 \(o_n\) 为倒数第三层的输入即倒数第四层的输出
依照此规律,只需要循环迭代计算每一层每个节点的 \(\delta _k^K, \delta_j^J, \delta_i^I,...\) 等值即可求得当前层的偏导数,从而得到每层权值矩阵 \(W\) 的梯度,再通过梯度下降算法迭代优化网络参数即可。
好了反向傳播算法推导完毕,代码实现可以参考另一篇博客