最近看了BP神经网络(Back Propagation Neural Networks),对于其中误差反向传播公式的推导比较困惑,在参考周志华老师的《机器学习》和网上一些博客后,做出一个简单的还原。
1. BP网络模型及变量说明
1.1 模型简图
1.2 变量说明:
-
ml:第l层神经元个数
-
x(1)p: 输入层第p个神经元,p=1…m1;
-
yk : 输出层第k的神经元的输出,k=1…ml+1;
-
tk:输出层第k的神经元的目标值,k=1…ml+1;
-
z(l)j:第l层的第j的神经元的输入;
-
a(l)j:第l层第j个神经元的输出;
-
a(l)0:第l层的偏置项;
-
w(l)ji:第l−1层第i个神经元与第l层第j个神经元的连接权值;
-
h(.):激活函数,这里假设每一层各个神经元的激励函数相同(实际中可能不同);
-
Ep:网络在第p个样本输入下的偏差,n=1…N;
-
N:样本总数
2. 误差反向传播相关推导
2.1 正向传播(forward-propagation)
正向传播的思想比较直观,最主要的是对于激活函数的理解。对于网络中第l层的第j个神经元,它会接受来自第l-1层所有神经元的信号,即:
z(l)j=∑i=1ml−1wjia(l−1)i+a(l−1)0
<script type="math/tex; mode=display" id="MathJax-Element-3"> z_j^{(l)}=\sum_{i=1}^{m_{l-1}} w_{ji}a_i^{(l-1)}+a_0^{(l-1)} </script> 如果令
wj0=1 <script type="math/tex" id="MathJax-Element-4"> w_{j0}=1 </script>,可以将公式简写为
z(l)j=∑i=0ml−1wjia(l−1)i
<script type="math/tex; mode=display" id="MathJax-Element-5"> z_j^{(l)}=\sum_{i=0}^{m_{l-1}} w_{ji}a_i^{(l-1)} </script>
则经过该神经元后的输出值为:
a(l)j=h(z(l)j)
<script type="math/tex; mode=display" id="MathJax-Element-6"> a_j^{(l)}=h(z_j^{(l)}) </script>
对于多分类问题,网络输出层第k个神经元输出可表示为:
yk=a(l+1)k=h(z(l+1)j)=h(∑j=0mlwkja(l)j)
<script type="math/tex; mode=display" id="MathJax-Element-7"> y_k=a_k^{(l+1)}=h(z_j^{(l+1)})=h(\sum_{j=0}^{m_l} w_{kj}a_j^{(l)}) </script> 这里说明一下,BP神经网络中激活函数通常会取sigmoid函数或tanh函数,不清楚的可以百度一下这两个函数,这里不再赘述。
其中,sigmod函数的公式为
f(x)=11+e−x
<script type="math/tex; mode=display" id="MathJax-Element-8"> f(x) = \dfrac{1}{1+e^{-x}} </script> 这个函数的导数有一个性质(后面会用到):
f′(x)=f(x)(1−f(x))
<script type="math/tex; mode=display" id="MathJax-Element-9"> f'(x) = f(x)(1-f(x)) </script>
2.2 代价函数(cost function)
由2.1节公式可以得到BP网络在一个样本下的输出值,我们定义平方和误差函数(sum-of-square error function)如下:
Ep=∑k=1ml+112(yk−tk)2
<script type="math/tex; mode=display" id="MathJax-Element-10"> E_p=\sum_{k=1}^{m_{l+1}} \dfrac{1}{2}(y_k-t_k)^2 </script> 所有样本输入下,网络的总误差为:
EN=∑p=1NEp
<script type="math/tex; mode=display" id="MathJax-Element-11"> E_N=\sum_{p=1}^{N} E_p </script>
2.3 反向传播(back-propagation)
这是BP神经网络最核心的部分,误差从输出层逐层反向传播,各层权值通过梯度下降法(gradient descent algorithm)进行更新,即:
w:=w−η▽Ep(w)
<script type="math/tex; mode=display" id="MathJax-Element-12"> w:=w-\eta\bigtriangledown{E_p}(w) </script> 上式中,
η <script type="math/tex" id="MathJax-Element-13"> \eta </script>是每次更新的步长,
▽Ep(w) <script type="math/tex" id="MathJax-Element-14"> \bigtriangledown{E_p}(w) </script>是第p个样本输入下的输出偏差对某一层权值的偏导数,表示每输入一个样本更新一次参数。
下面我们以 w(l)ji <script type="math/tex" id="MathJax-Element-15"> w_{ji}^{(l)} </script>为例推导梯度项:
∂Ep∂w(l)ji=∂Ep∂z(l)j∂z(l)j∂w(l)ji=∂Ep∂z(l)ja(l−1)i
<script type="math/tex; mode=display" id="MathJax-Element-16"> \dfrac{\partial E_p}{\partial w_{ji}^{(l)}} = \dfrac{\partial E_p}{\partial z_j^{(l)}} \dfrac{\partial z_j^{(l)}}{\partial w_{ji}^{(l)}} = \dfrac{\partial E_p}{\partial z_j^{(l)}} a_i^{(l-1)} </script>
其中,
∂Ep∂z(l)j=∂Ep∂yk∂yk∂z(l)j=∂{∑ml+1k=112(yk−tk)2}∂yk∂h(z(l)j)∂z(l)j=∑k=1ml+1(yk−tk)h′(z(l)j)
<script type="math/tex; mode=display" id="MathJax-Element-17"> \dfrac{\partial E_p}{\partial z_j^{(l)}} = \dfrac{\partial E_p}{\partial y_k}\dfrac{\partial y_k}{\partial z_j^{(l)}} = \dfrac{\partial \{ \sum_{k=1}^{m_{l+1}} \dfrac{1}{2}(y_k-t_k)^2 \} }{\partial y_k}\dfrac{\partial h(z_j^{(l)})}{\partial z_j^{(l)}} = \sum_{k=1}^{m_{l+1}} (y_k-t_k) h'(z_j^{(l)}) </script> 如果激活函数h(.)为sigmod函数,则
h′(z(l)j)=h(z(l)j)(1−h(z(l)j))=yk(1−yk)
<script type="math/tex; mode=display" id="MathJax-Element-18"> h'(z_j^{(l)}) = h(z_j^{(l)}) (1-h(z_j^{(l)})) = y_k(1-y_k) </script> 则
∂Ep∂w(l)ji=∑k=1ml+1yk(1−yk)(yk−tk)a(l−1)i
<script type="math/tex; mode=display" id="MathJax-Element-19"> \dfrac{\partial E_p}{\partial w_{ji}^{(l)}} = \sum_{k=1}^{m_{l+1}} y_k(1-y_k)(y_k-t_k) a_i^{(l-1)} </script>
由此我们得到了误差从输出层向低层反向传播的递推公式,进而可以求出误差对于每一层权值的梯度 ▽Ep(w) <script type="math/tex" id="MathJax-Element-20"> \bigtriangledown{E_p}(w) </script>
3. 总结
BP神经网络是应用最多、最基本的一种人工神经网络,其精髓在于误差反向传播。后续的优化改动多在于激活函数、核函数上。
4. 参考文献
[1] 周志华,机器学习[M] , 清华大学出版社,2016.
[2] BP神经网络:误差反向传播公式的简单推导(博主:Meringue_zz)
所有评论(0)