神经网络初探:反向传播算法

神经网络初探:反向传播算法

链式法则求导的不足

​ 上回说到用梯度下降法优化神经网络参数,使得代价函数最小,这里面的核心问题在于求解偏导。也许很多人会说求解偏微分很困难吗?用链式法则就是喽。接下来举个例子说明一下使用链式法则求解神经网络中的偏导为什么不可取。

如下图所示的两层神经网络(输入层不计入层数),

神经网络初探:反向传播算法_第1张图片

ank 代表第n层的第k个神经元的输出值, wnjk 表示第(n-1)层第k个神经元指向第(n)层第j个节点的权重(weight), bnk 表示第n层的第k个神经元的偏移量(bias)。出于简单考虑,假设就一组数据,代价函数可以作如下定义:

C=12i(a2iyi)2

于是,根据链式法则,我们可以得到如下的偏导表达式:
σ(Z)σ(Z)Zlja0alCw1nm=========11+ezdσdZ(1σ)σkwljkal1k+bljxσ(Zl)ijCa2ia2iZ2iZ2ia1ja1jZ1jZ1jw1nmij(a2iyi)σ(Z2i)w2ijσ(Z1j)δjnxmi(a2iyi)σ(Z2i)w2inσ(Z1n)xm

​ 以上只是两层的网络每,一个权重偏导的计算需要一个求和式。如果我们的网络有十层,这个表达式将会变得很长,特点是越靠前的公式越难计算,因为越靠前的式子需要越多重的求和,再加上网络中的参数可能有几百甚至几千万个,链式法则求导的方法就限制了我们的网络不能有太多层,于是我们要想在工程上实现更深层网络的训练需要寻求新的算法。

数值求导方法的不足

从偏导数的定义出发,我们完全可以用数值方法计算某一个变量的偏导,为简单起见,除了待求导变量外省略其他变量,公式如下:

Cw=C(w+Δw)C(w)Δw

数值方法的好处在于公式很简单,可是计算量更大。对比以上的链式法则,链式法则只需要计算一次网络中的各个输出值即可,对于不同权重的偏导使用的是同一套数输出值;可是数值方法不一样,每求解一个偏导就需要一组新的输出值,对于有几百万甚至几千万的大规模网络而言,这种计算量同样太大!

Hadamard乘积

​ 为了便于接下来介绍反向传播算法,有必要提前介绍一些矩阵的Hadamard运算。这是一种矩阵的二元运算方式,指的是相同大小的矩阵对应元素分别相乘得到同样大小的矩阵,即 (AB)i=AiBi ,举例如下:

234579=102136

反向传播算法

​ 以上均为铺垫,开始我们今天的正题:反向传播算法!

​ 神经网络自1945年提出以来,经历了几次大起大落,直到上世纪80年代David Rumelhart、Geoffrey Hinton及Ronald Williams等人系统性地提出backforward算法,引起了神经网络新的研究热潮。

​ 反向传播算法(backpropagation algorithm,BP algorithm)全称是误差反向传播算法(backforward propagation of errors),核心在于利用误差传播快速计算代价函数对于权重的偏导,并且利用梯度下降方法完成网络参数的优化, δn 表示第n层的误差,具体定义为 δljCZlj 。于是,BP算法包含一下四个公式:

δLδlCbCw1jk====(aLy)σ(ZL)((wl+1)Tδl+1)σ(Zl)δal1kδlj

​ 具体的推导过程明天继续,这四个公式足够简洁,并且打打简化了计算。

备注1:1974年,Paul Werbos(https://en.wikipedia.org/wiki/Paul_Werbos)首次提出了一般网络的训练方法,神经网络只是其中的特例,当时并不受到学界重视,直到Hinton(http://www.cs.toronto.edu/~hinton/)等人重新发现了这个算法。
备注2:本文参考自Machael Nielsen的博客(http://michaelnielsen.org/)

你可能感兴趣的:(函数,神经网络,算法,优化)