神经网络-BP算法

outline

1.神经元模型

2.BP算法

  •  Cost function
  •  activation
  •  intermediate quantity ‘z’
  •  intermediate quantity ‘δ’
  •  BP1,BP2,BP3,BP4

3.SGD算法

 

1.神经元模型

图-1是1943年沿用至今的’M-P神经元模型’。在这个模型中,神经元(neuron or unit)链接受到自n个其他神经元(或输入input)传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接受到的总输入值与神经元的阈值(bias or threshold)θ进行比较,然后通过激活函数(activation function)处理,以产生神经元的输入(output or activation)o。

350px-ArtificialNeuronModel_english

(图-1)

理想中的激活函数是阶跃函数(step function),即只输出‘0’(对应神经元抑制)或‘1’(对应神经元兴奋)。然而,阶跃函数具有不连续,不光滑等不太好的兴致,因此实际常用Sigmoid函数(有时也称挤压函数-squashing function)作为激活函数, 如图-2.

-20-638

(图-2)

 

更一般的,常见的神经网络是形如图-3所示的层级结构,每层神经元与下一层神经元全互联,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络通常称为“多层前馈神经网络”(multi-layer feedforward neural netwokrs)。其中输入层神经元接收外接输入,隐层(hidden layer)与输出层神经元对信号进行加工,最终结果由输出层神经元输出。

屏幕快照 2016-08-06 下午10.04.39

(图-3)

一个常见的实例是使用神经网络识别手写数字,每个输入数字是一张28*28=784px的灰度图(黑字白底),输出结果是0-9十种,如图-4。当然,隐层的数目和每一隐层的神经元数是设计者自己决定的,不一定只有一层,也不一定是15个神经元。

屏幕快照 2016-08-06 下午10.13.11

(图-4)

那么,我们已经知道了这种模型的结构,要怎么估计(estimate)这种结构的参数呢?首先,参数主要是权重(weight)w和阈值(bias)b。图-4中每两个神经元之间的连线都对应着一个w,hidden layer和output layer中的每一个神经元都有一个b,所以在图-4中w的个数是78415 + 1510 = 11910,而b的个数是15+10=25。那么这么一万多个参数要怎么估计呢?

2.BP算法

误逆差传播(error BackPropagation  简称BP)算法是迄今最成功的神经网络学习算法。现实任务中使用神经网络时,大多是使用BP算法进行训练(参数估计)。那么接下来就来说明一下这个BP算法。

2.1Cost function

假设还是识别手写数字的案例图-5,我们有一万组数据,单个图像(input)x和它实际的数值y都是确定的。
屏幕快照 2016-08-06 下午10.41.55

(图-5)

我们要用这一万组数据训练参数模型。根据图-1我们使用任意一个数图x,使用sigmoid函数作为激活函数,假设参数已经确定,我们即可以根据这个x和w,b经过一定运算得出一个对应的模型识别值ÿ,依此,每一个x都能得到一个ÿ=f(x)。那么我们希望得到一种算法估计出w和b,使所有的ÿ=f(x)都尽量接近相应的真实值y。所以我们定义一个代价(成本)函数(cost function):

\mathnormal{C(w,b)=\frac{1}{2n}\sum_{x} ||f(x)-y||^2}            (01)

n是训练样本数(这里是10000)。

像这样的平方形式的代价函数称为quadratic cost function,后面还会介绍其他形式的代价函数,我们希望C(w,b)最小化,前面的1/2n并没有什么理论意义,n可以不要,但是如果要后期要比较不同数量的训练样本时,这个n是有意义的。但一半要1/2 ,因为这样便于求导。

我们的目标是使C(w,b)最小化,如图-6,假设我们随机初始化所有的w和b,假设 C的值在半腰的某个位置,它要去往最小值,即底部。

屏幕快照 2016-08-06 下午11.21.03

(图-6)

我们只需调整w和b,使C值朝负梯度方向运动移动即可(如果你对梯度的概念不熟悉可以学习“MIT公开课-多变量微积分”的梯度这一章   )。C(w,b)对于w,b是一个嵌套cost function 和activation function的复合函数。根据梯度知识,我们要用C对每个参数(w,b)分别求偏导数。

2.2 activation

我们使用一些具体的符号来说明:

屏幕快照 2016-08-06 下午10.35.22

屏幕快照 2016-08-06 下午10.35.43

 

如上图,我们使用\mathnormal{w^l_{jk}} 表示l-1层第j个神经元连向l层第k个神经元的权重,用\mathnormal{b^l_j} 表示第l层第j个神经元的偏置,用\mathnormal{a^l_j} 表示l层第j个神经元的激活值(activation),则第一层的a就是input(x),使用σ表示sigmoid函数(σ发音即为sigmoid)。于是有:

\mathnormal{a^l_j=\sigma(\sum_k w^l_{jk}a^{l-1}_k + b^l_j)}             (02)

如果使用向量化表示则为:

\mathnormal{a^l=\sigma(w^la^{l-1} + b^l)}            (03)

2.3 intermediate quantity ‘z’

我门引入一个中间项z:

\mathnormal{z^l= w^la^{l-1} + b^l}           (04)

则:

\mathnormal{a^l= \sigma(z^l)}            (05)
\mathnormal{z^l_j=\sum_k w^l_{jk}a^{l-1}_k + b^l_j}            (06)
\mathnormal{z^{l+1}= w^{l+1}a^l + b^{l+1}}

结合式04和05,有

\mathnormal{z^{l+1}= w^{l+1}\sigma(z^l) + b^{l+1}}            (07)

 

\mathnormal{a^L}表示output层的activations,如果output不止一个神经元则\mathnormal{a^L}是一个向量,

\mathnormal{C=\frac{1}{2n}\sum_{x} ||f(x)-a^L||^2}           (08)

假设是识别手写数字的案例,output有十个输出值,这十个输出值组成向量\mathnormal{a^L},那么相应的真实值y(假设是数字2)可以表示为(0,0,1,0,0,0,0,0,0,0)。

2.4 intermediate quantity ‘δ’

我们再引入另一个中间项 \mathnormal{\delta}(发音delta),

\mathnormal{\delta^l_j} 表示l层第j个神经元的误差。BP算法会提供一个程式来计算\mathnormal{\delta^l_j},然后使用\mathnormal{\delta^l_j}来计算\mathnormal{\partial C/\partial w^l_{jk}}\mathnormal{\partial C/\partial b^l_j}

我们用一个精灵来说明\mathnormal{\delta}

屏幕快照 2016-08-07 上午10.32.03

 

这个位于l层第j个神经元的精灵(每个神经元都有一个精灵)制造一个\mathnormal{\Delta z^l_j} 来影响相应的z,从而使\mathnormal{\sigma(z^l_j)} 变成\mathnormal{\sigma(z^l_j + \Delta z^l_j)} ,从而影响最终的C, C的改变量(根据微积分理论)则为\mathnormal{\partial C/\partial z^l_j * \Delta z^l_j} 。现在这个精灵要帮助我们使C最小化,要使C减小则\mathnormal{\partial C/\partial z^l_j * \Delta z^l_j} 应为负值,即\mathnormal{\partial C/\partial z^l_j}\mathnormal{\Delta z^l_j} 符号相反。

定义

\mathnormal{\delta^l_j = \partial C/\partial z^l_j}             (09),

向量化这个公式则为

\mathnormal{\delta^l= \partial C/\partial z^l}          (10)

2.5 BP1,BP2,BP3,BP4

结合式(08),根据链式法则,

\mathnormal{\delta^L_j = \partial C/\partial z^L_j = \partial C/\partial z^L_j \sigma'(z^l_j)}            (BP1)

我们将这个公式记为(BP1),因为它是BP算法四个公式中的第一个,然后我们来推导(BP2)。
因式(07)(09),
\mathnormal{\delta^l_j = \partial C/\partial z^l_j = \partial C/\partial z^{l+1} \partial z^{l+1}/\partial z^l}
\mathnormal{\partial z^{l+1}/\partial z^l = w^{l+1} \sigma'(z^l)}
则,

\mathnormal{\delta^l= \delta^{l+1} w^{l+1} \sigma'(z^l)}            (BP2)

同理,根据链式法则,结合式09,06,可得

\mathnormal{\partial C/\partial b^l_j = \delta^l_j}            (BP3 )
\mathnormal{\partial C/\partial w^l_{jk} = a^{l-1}_k \delta^l_j}             (BP4)

根据梯度知识,\mathnormal{\partial C/\partial w^l_{jk}}\mathnormal{\partial C/\partial b^l_j} 分别是C 在\mathnormal{w^l_{jk}}\mathnormal{b^l_j} 上的梯度方向,给定一个学习率η(eta)则只要使\mathnormal{\Delta w^l_{jk} = -\eta \partial C/\partial w^l_{jk}} ,  \mathnormal{\Delta b^l_j = -\eta \partial C/\partial b^l_j}  ,以此调整w和b,就可以使C一步步达到最小值。

那么BP算法即可按如下步骤进行:

  1. 初始化所有的w,b ,称输入值x为a1(第一层的activation),
  2. feedforward:   从第二层开始l=2,3,…L计算\mathnormal{z^l= w^la^{l-1} + b^l} ,  \mathnormal{a^l= \sigma(z^l)}
  3. output error \mathnormal{\delta^L_j}:   \mathnormal{\delta^L_j = \partial C/\partial z^L_j \sigma'(z^l_j)}
  4. backpropagate the error:   对每一个l = L-1, L-2,…2, 计算 \mathnormal{\delta^l= \delta^{l+1} w^{l+1} \sigma'(z^l)}
  5. gradient: \mathnormal{\partial C/\partial b^l_j = \delta^l_j}\mathnormal{\partial C/\partial w^l_{jk} = a^{l-1}_k \delta^l_j}
  6. 更新w,b\mathnormal{w^l_{jk}  +=  -\eta a^{l-1}_k \delta^l_j}, \mathnormal{b^l_j  +=  -\eta\delta^l_j}

重复1-6到达停止条件即止。

 

SGD算法

以上的训练过程是一次只针对一组数据(样例sample){x,y}依次进行训练的,参数更新非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象。因此常采用 随机选取一小批样例(mini-batch)同时进行训练的方法,称为随机梯度下降法stochastic gradient descent(简称SGD),当然,严格意义上的SGD算法是取单个随机的样例进行训练,这样在开始阶段会有比较好的收敛效果(收敛速度),但实践表明基于mini-batch的SGD算法拥有更好的效果。

SGD算法即可按如下步骤进行:

1,初始化所有的w,b ,输入m组训练样例,

2,对每组训练样例{x,y} ,设x为 \mathnormal{a^{x,1}} ,并运行如下步骤:

 feedforward:   从第二层开始l=2,3,…L计算\mathnormal{z^l= w^la^{l-1} + b^l} ,  \mathnormal{a^l= \sigma(z^l)}

output error \mathnormal{\delta^L_j}:   \mathnormal{\delta^L_j = \partial C/\partial z^L_j \sigma'(z^l_j)}

backpropagate the error:   对每一个l = L-1, L-2,…2, 计算 \mathnormal{\delta^l= \delta^{l+1} w^{l+1} \sigma'(z^l)}

gradient\mathnormal{\partial C/\partial b^l_j = \delta^l_j}\mathnormal{\partial C/\partial w^l_{jk} = a^{l-1}_k \delta^l_j}

3,更新w,b: \mathnormal{w^l_{jk}  +=  -\frac{\eta}{m}a^{l-1}_k \delta^l_j}, \mathnormal{b^l_j  +=  -\frac{\eta}{m}\delta^l_j}

4,重复1-3多少轮即止,或者重复1-3到达某条件即止。

 

References

[1],http://neuralnetworksanddeeplearning.com/chap1.html

[2],http://neuralnetworksanddeeplearning.com/chap2.html

[3],《机器学习》周志华

 

标签:

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注