训练神经网络的步骤
训练神经网络:
- 参数的随机初始化
- 利用正向传播方法计算所有的$h _ {\theta}(y)$
- 编写计算代价函数 $J$ 的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数
- 使用优化算法来最小化代价函数
简单来说即是:正向传播信号,反向传播误差。通过正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的$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$$
参数更新过程为:从输出层到输入层依次更新
- $w _ {hj}$ :隐层到输出层的权重
- $\theta _ j$ : 输出层阈值
- $v _ {ij}$ : 输入层到隐层的权重
- $\gamma_i$ : 隐层阈值
下面将简单介绍公式推导过程中出现的参数:
- $x _ i$:输入层第i个输入神经元的输出
- $\hat{y} _ j$:输出层第j个输出神经元的输出
- $b _ h$:隐层第h个隐层神经元的输出
- $\alpha _ h$:隐层第h个隐层神经元的输入
- $\beta _ j$:输出层第j个输出神经元的输入
- $\theta _ j$:输出层第j个输出神经元的阈值
- $\gamma _ h$:隐层第h个隐层神经元的阈值
- $\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