[TOC]
0. 反向传播
反向传播算法分为前向传播和后向传播两个过程, 基本原理是微积分中的链式法则. 具体而言, 假设有, 那么链式法则为:
1. 前向传播计算
首先我们对网络结构进行一个基本的假设
- 网络有层, 且
- 对于每一层的参矩阵为, 其中
- 每一层的激活函数为
样本集为, 神经网络模型为
可以用以上的计算简图表示前向传播的过程, 根据这个计算图, 前向传播的过程可以描述为:
2. 反向传播
神经网络是若干函数的嵌套模型, 我们将这个嵌套模型学习器记为, 若使用均方误差MSE作为衡量标准, 则损失函数可以定义为
采用梯度下降进行优化, 记为学习率, 参数和的迭代公式为:
由于在多层神经网络中参数参数和的个数往往是很庞大的, 直接对每一个参数求取导数是不现实的, 因此我们需要一种更快速迭代计算参数的方法, 这种方法称之为反向传播.
反向传播的主要思想是通过求取最后一层参数的梯度, 之后通过某种递归形式求取倒数第二层参数的梯度, 一直到所有参数都求取出来为止.
3. 反向传播的推导
对于任意每一个样本, 我们通过前馈传播可以得到输出值, 经过最后一层的激活函数可以得到预测结果, 单个样本的损失可以写成:
当我们计算每一个样本的损失, 再加总平均就可以求得全样本的损失, 为了简化问题, 我们只关注一个样本的情形.
对于变量, 函数对的导数根据链式法则, 可以写成以下形式:
根据递推关系, 也即
所以我们只要求取上述乘积的后两项, 就可以得到我们的递推公式
对于每一个神经单元变量, 通过激活函数可以得到对应的, 那么向量对求导可以写成
简记为:
由于, 很容易就知道:
- 递推式关系
这里的·是点乘, 即矩阵对应位置相乘
4. 结论
有了损失函数对的导数递推式, 我们想知道对于的导数和对的导数, 只要再进行一次链式分解即可, 从而可以得到
对于最后一层的导数可以直接求取, 这样整个递推求取就可连续进行.
参考: