今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)

转载请注明出处:http://www.cnblogs.com/xbinworld/p/4265530.html html

这一篇是整个第五章的精华了,会重点介绍一下Neural Networks的训练方法——反向传播算法(backpropagation,BP),这个算法提出到如今近30年时间都没什么变化,可谓极其经典。也是deep learning的基石之一。仍是老样子,下文基本是阅读笔记(句子翻译+本身理解),把书里的内容梳理一遍,也不为何目的,记下来之后本身能够翻阅用。node

 

5.2 Network Training

咱们能够把NN看作一种通用的非线性函数,把输入向量x变换成输出向量y,能够类比于第一章中的多项式曲线拟合问题。给定输入集合image,目标集合image,sum-of-squares error function定义为:算法

image

 

这一节主要主要是想说明error function也能够从最大似然估计的角度推导出来的。见(5.12-14)。这一部分从简了,有时间完善。网络

(case 1)上面的y能够是identity,即image框架

 

(case 2)固然也能够是二分类问题逻辑回归模型(能够参考第4章逻辑回归的内容),处理单一的2分类问题。dom

image

针对一个样本的类别的条件几率是一个伯努利分布Bernoulli distribution:ide

image

定义在数据集上的error function是cross-entropy:函数

image

有人证实,采用cross-entropy做为分类问题的目标函数能够比最小均方差泛化能力更强,以及训练更快。优化

(case 3)若是咱们要作的分类是K个独立二分类分体,那么上面的条件分布修改成:lua

image

error funciton:

imageimage

 

这里讲一讲参数共享,第一层的神经网络的参数实际上被output层全部神经元所贡献,这样的贡献能够减小了必定的计算量同时提升了泛化能力。

(case 4)当咱们考虑不是独立二分类,而是1-of-K的分类问题,也就是说每个结果是互斥的,咱们须要采用softmax分类:

在数据集上error function定义:

image

其中,softmax的激励函数定义为

image

 

image

上面这一段说明了softmax的一个平移不变性的特性,可是会在regularization框架下消失。

 

总结一下:

 

image

 

下面讲一讲优化的方法:

5.2.4 Gradient descent optimization

梯度降低(GD)的公式是这样的:

image

 

这个也叫作batch model,梯度是定义在整个数据集上的,也就是是每一步迭代须要整个数据集。参数优化过程当中每一步都是朝着error function降低最快的方向前进的,这样的方法就称为梯度降低算法,或者最速梯度降低。可是这样的方法比较容易找到局部最优(local optima),好比下面的图示,来自leftnoteasy

imageimage

初始的时候咱们在一个随机的位置,但愿找到目标值最低的谷底,可是事实上咱们并不知道咱们找到的是否是global optima。上述batch model的优化方法,还有更快捷的方法,如conjugate gradientsquasi-Newton methods。若是要获得足够好的最小值,就须要多进行几轮GD,每次都选用不一样的随即初始点,并在validation set中验证结果的有效性。

还有一种on-line版本的gradient descent(或者称为sequential gradient descent或者stochastic gradient descent),在训练神经网络的时候被证实很是有效。定义在数据集上的error function是每一个独立样本的error function之和:

image

那么,on-line GD的更新公式是:

image

每次更新一个样本,方式是每次sequential取一个样本,或者有放回的random取。在onlineGD和GD之间还存在着中间形态,基于一个batch的数据。onlineGD的好处有:计算量小,同时更容易从有些local optima中逃出。

 

5.3 Error Backpropagation偏差反向传导

在这一节中,咱们会讨论一种快速计算前向网络偏差函数E(w)梯度的方法——也就是著名的Error backpropagation算法,或者简称 backprop。

值得一提的是,backpropagation在其余地方也有相似的名称,好比在multilayer perceptron(MLP)常常也叫作backpropagation network。backpropagation在其中的意思是经过梯度降低的方法来训练MLP。事实上,大部分算法(训练)涉及一个迭代过程来最小化目标函数,在这个过程当中基本上有两个阶段:一是计算error function的对于参数的导数,BP正是提供了一种计算全部参数导数的快速、有效方法;二是经过求出的导数来更新原来的参数,最多见的方法就是梯度降低方法。这两个阶段是相互独立的,这意味着BP算法的思想并非只能用于MLP这样的网络,也不是只能用于均方偏差这样的error function,BP能够被用于不少其余算法。

 

5.3.1 Evaluation of error-function derivatives

接下来咱们来推导一下BP算法,条件是在一个任意拓扑结构的前向网络中,任意的可导的非线性激励函数,以及支持一系列error function(基本是很通用的了)。推导过程会用一个具备一个隐层的神经网络,以及均方偏差的error function来讲明。

常见的error function,定义在一个i.i.d(独立同分布)数据集上,有以下的形式:

image

下面咱们会考虑针对error function其中的一项来求梯度,image。这个结果能够直接用于序列优化(sequential optimization),或者把结果累加起来用于batch优化。(注:其实这个所谓序列优化就是如今广为人知的随机梯度降低。)

 

首先,咱们先来考虑最为简单的线性output函数的状况:

image

y_k是对样本x的第k个输出(假设输出层有多个node),是x全部维度的一个线性组合。更通常性而言,咱们定义在任意一个样本x_n上error function:

image

其中image,上面error function针对参数image的梯度是:

image

 

这个结果能够看作是一种“局部计算”——这个乘积一部分是偏差image链接在权重image的输出端,另外一部分是变量image链接在权重image的输入端。上面的形式在逻辑回归中也出现过(章节4.3.2),在softmax中也是相似,下面来看在更通常的多层前向网络中是怎么样的。

在一个通常结构的前向网络中,每一个神经元(不算输入层)计算它输入的加权和:

image

 

其中zi是前面一个神经元(后面叫作节点或者node之类的都是同一个意思)的激励值输出,也是一个输入值输入到了节点j,image是这个链接的权重。在前面一篇今天开始学PRML-5.1节,咱们介绍过,能够经过引入一个额外的输入节点且固定激励值是+1,咱们能够把bias项合并在上面的累加中。所以,咱们对待bias项是和对待其余的待估权重是同样的。而后获得节点j的激励函数的形式:

image

上面两个式子就说明了一个神经元得到输入值而后获得激励值输出的过程。对于训练集合中的任何一个样本,咱们都反复经过上面两个式子,计算出全部隐藏神经元和输出神经元的激励值。这个过程就叫作向前传播,就像是一个向前的流通过网络同样。

下面来推导error function对image的导数,下面每个节点的值都依赖于具体的样本n,可是为了清晰表达,省去了n这个标记。权重image只能经过输入网络image的值来影响神经元j,所以经过链式法则能够获得推导:

image

image

这个表示很重要,通常能够称为error(偏差或者残差);从(5.48)能够获得:

image

因而能够获得:

image

和前面提到的线性模型同样,上面的导数也是由链接image的输出端的偏差和输入端输入值的成绩获得(z=1是bias项)。所以,关键就是计算网络中隐藏神经元和输出神经元的image的值了。

 

对于输出层,任何一个神经元k能够获得:

image

注:这个推导是直接从(5.46)来的,在书中用的是线性输出来推导的,即y_k=a_k。若是不是线性输出,而是个f(a_k),那么还要乘以一项f(a_k)的导数。

 

对于隐藏层,咱们用链式法则:

image

k表明全部j神经元的下一层神经元。这个式子的意思是说,j神经元对目标error function的影响是只能经过全部的全部image来实现的。经过(5.51)(5.48-49),能够获得

image

称为反向传导法则。到这里,大概能够看到为何叫作“反向传导”了,能够从图5.7进一步了解:偏差的传播是从输出层逐层回传的。先经过output层计算残差并求出最后一层参数,而后往回传播。

 

image

最后来总结一下BP算法的过程:(这里偷懒一下直接借用书上的总结啦:))

 

image

思路很清晰。若是用传统的梯度降低来求解,须要对全部的样本求出来的导数作累加,而后用于传统的梯度降低的公式中。

image


5.3.2 A simple example

下面来就一个稍微具体一点的例子说明一下:一个两层神经网络(如图5.1),输出层是线性输出,而且采用sum-of-squares偏差,激励函数采用双曲正切函数tanh,

 

image

而且导数:

image

定义在一个样本n上面的偏差函数:

image
其中yk是输出值,tk是目标值;向前传播的过程能够描述为:

image

而后计算每个输出神经元的残差和隐层神经元的残差:

image

image

最后获得第一层参数和第二层参数的导数,分别用于梯度降低计算。

image

 


5.3.3 Efficiency of backpropagation

神经网络计算的一个主要问题是计算量大,在以前的模型中,若是有W数量的链接(神经元突触),那么一次前向传播的复杂度是O(W),而通常来讲W是远远大于神经元节点数量的。

在5.48能够看到,每个参数须要有一次乘法和一次加法。

另一种求倒数的方式是用数值方法,

image

其中image;数值方法计算精度是一个问题,咱们能够把image变的很是小,直到接近于精度的极限。采用symmetrical central differences能够大大盖上上述的精度问题:

image

可是计算量差很少是(5.68)的两倍。实际上数值方法的计算不能利用前面的有用信息,每一次导数都须要独立计算,计算上并不能简化。

 

可是有意思的是数值导数在另一个地方有用武之地——gradient check!咱们能够用central differences的结果和BP算法中的导数进行比较,以此来判断BP算法执行是不是正确的。

相关文章
相关标签/搜索