Deep Learning深度学习(二):反向传播
本文为Neural Networks and Deep Learning一书的学习笔记,仅记录书中的理论部分,省略了实验和例子,用到的图都来自于书中。
这本书很适合初学者读,作者写得非常详细,简单易懂,里面涉及到的内容都有解释,还有配有代码和例子,强烈推荐!
神经网络的训练目标是最小化目标函数,使用梯度下降的方法来训练参数和。在梯度下降中,需要根据和的计算结果来决定参数和的改变幅度。反向传播便提供了一种计算偏导的方法。
在前一章里已经讲过,每个神经元的计算过程可以写作:
为第l层的神经元的输出的向量,和为参数,为非线性的激活函数,如sigmoid。
给整个神经网络设定一个目标函数为(Cost Function),例如:
是样本的label,是输出层输出的结果。
在用梯度下降法求使目标函数最小的参数时,每一步参数的更新方法是:
其中是步长,每个mini-batch包含m个训练数据。下面通过反向传播来计算和。
为方便计算,定义残差(error):
表示l层第j个神经元的input的加权和。根据定义,可以推算出每一层残差的计算方法:
在此基础上,得到我们关心的和的计算方法,用error表示为:
根据上面4个公式,可以从output层往input层计算出每一层的参数和在进行梯度下降时应该下降的幅度。
为什么说backpropagation很快?
试想如果不使用backpropagation方法,一个直观的做法是:
其中是一个极小正数,是方向上的单位向量。用这个方法计算每个参数每一次迭代时调整的方向和大小,这意味着假设整个网络共层,每层个全连接的节点,那么一共有个变量和个变量,梯度下降法中,每一次迭代(假设mini-batch size为,即根据个样本的情况对所有变量更新一次)就要遍历整个网络次。相比之下,backpropagation中一次迭代只需要对整个网络进行2次遍历(一次feedforwarding,一次backpropagation),节省了非常多的时间。
Written with StackEdit.