机器学习模型之BP神经网络

训练神经网络的步骤

训练神经网络:

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的$h _ {\theta}(y)$
  3. 编写计算代价函数 $J$ 的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数

简单来说即是:正向传播信号,反向传播误差。通过正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的$h _ {\theta}(y)$。现在,为了计算代价函数的偏导数$\frac{\partial}{\partial\Theta^{(l)} _ {ij}}J\left(\Theta\right)$,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。

误差逆传播算法

以西瓜书为例,如图所示的神经网络:

对训练样例$(x _ k,y _ k)$,神经网络输出为$(\hat{y} _ 1^k,\hat{y} _ 2^k \cdots \hat{y} _ i^k)$,则误差为:

$$E _ k=\frac{1}{2}\sum\limits _ {j=1}^l(\hat{y} _ j^k-y _ j^k)^2$$

参数更新的公式为:

$$v \leftarrow v+\Delta v$$

参数更新过程为:从输出层到输入层依次更新

  1. $w _ {hj}$ :隐层到输出层的权重
  2. $\theta _ j$ : 输出层阈值
  3. $v _ {ij}$ : 输入层到隐层的权重
  4. $\gamma_i$ : 隐层阈值

下面将简单介绍公式推导过程中出现的参数:

  1. $x _ i$:输入层第i个输入神经元的输出
  2. $\hat{y} _ j$:输出层第j个输出神经元的输出
  3. $b _ h$:隐层第h个隐层神经元的输出
  4. $\alpha _ h$:隐层第h个隐层神经元的输入
  5. $\beta _ j$:输出层第j个输出神经元的输入
  6. $\theta _ j$:输出层第j个输出神经元的阈值
  7. $\gamma _ h$:隐层第h个隐层神经元的阈值
  8. $\eta$:神经网络步长

首先看$w _ {hj}$,$\Delta w _ {hj}=-\eta \dfrac{\partial E _ k}{\partial w _ {hj}}$,具体计算公式使用链式法则:

$$\frac{\partial E _ k}{\partial w _ {hj}}=\frac{\partial E _ k}{\partial \hat{y} _ j^k}\frac{\partial \hat{y} _ j^k}{\partial \beta _ j}\frac{\partial \beta _ j}{\partial w _ {hj}}$$

根据$\beta _ j$的定义,有
$$\frac{\partial \beta _ j}{\partial w _ {hj}}=b _ h$$

激活函数为sigmoidh函数时:
$$f(x)=\frac{1}{1+e^{-x}}$$
其导数可用自身表示为
$$f^\prime(x)=f(x)(1-f(x))$$
令输出层误差为:
$$g _ j = -\frac{\partial E _ k}{\partial \hat{y} _ j^k}\frac{\partial \hat{y} _ j^k}{\partial \beta _ j}=-(\hat{y} _ j^k-y _ j^k)f^\prime(\beta _ j-\theta _ j)=\hat{y} _ j^k(1-\hat{y} _ j^k)(y _ j^k-\hat{y} _ j^k)$$
带入链式法则得到(试了下,markdown下好像不能给公式编号)
$$\Delta w _ {hj}=\eta g _ j b _ h$$
类似有
$$\theta _ j=-\eta g _ j$$
$$\Delta v _ {ih}=\eta e _ h x _ i$$
$$\Delta \gamma _ h=-\eta e _ h$$

其中$\eta$代表步长。

$$e _ h=-\dfrac{\partial E _ k }{\partial b _ h}\cdot \dfrac{\partial b _ h}{\partial \alpha _ h}=-\sum\limits _ {j=1}^{l}\dfrac{\partial E _ k }{\partial \beta _ j}\cdot \dfrac{\partial \beta _ j}{\partial b _ h}f’(\alpha _ h-\gamma_h)=b _ h(1-b_h)\sum\limits _ {j=1}^l w _ {hj}g _ j$$
(注:隐层到输出层的参数更新时,每个权重$w _ {hj}$仅影响一个输出$y _ j$,而输入层到隐层的参数更新时,每个权重$v _ {ih}$只影响一个隐层$b _ h$,而这个$b _ h$将影响到所有的输出$y _ i$,因此$e _ h$中有个求和的符号。)

下面将简单进行推导:
$$\frac{\partial E}{\partial v _ {ih}}=\sum\limits_{k=0}^{l}\bigg(\frac{\partial E}{\partial \hat{y} _ k}\frac{\partial \hat{y} _ k}{\partial \beta _ k}\frac{\partial \beta _ k}{\partial b _ h}\bigg)\cdot\frac{\partial b _ h}{\partial \alpha _ h}\frac{\partial \alpha _ h}{\partial v _ {ih}}$$
链式公式路径为输出层输出→输出层输入→隐层输出→隐层输入→输入层到隐层权重$v _ {ih}$,其中设计输出层的参数需要考虑所有神经元,因此需要求和。

分析公式中成份,其中
$$\frac{\partial E}{\partial \hat{y} _ j}\frac{\partial \hat{y} _ j}{\partial \beta _ j}= g _ j$$
$$\beta _ k=\sum\limits _ {i=0}^l b_h w _ {hi} \rightarrow \frac{\partial \beta _ k}{\partial b _ h}=w _ {hk}$$
$$b _ h=f(\alpha _ h - \theta _ h) \rightarrow \frac{\partial b _ h }{\partial \alpha _ h}=b _ h (1-b _ h)$$
$$\alpha _ h=\sum\limits _ {i=0}^d x _ i v _ {ih} \rightarrow \frac{\partial \alpha _ k}{\partial v _ {kh}}=v _ {kh}$$
连乘即可得到最终答案。

有关误差传递的计算可以参考Charlotte77通俗理解神经网络BP传播算法。更加详细的推导过程可以参考null的专栏风翼冰舟的博客东皇Amrzs

本文标题:机器学习模型之BP神经网络

文章作者:微石

发布时间:2018年05月31日 - 15:05

最后更新:2018年07月21日 - 11:07

原始链接:akihoo.github.io/posts/76466336.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。