5.3 BP算法


一句话: BP算法是基于梯度下降算法的迭代算法,用来优化模型参数, 作用相当于梯度下降算法


感知器:
感知器使用特征向量来表示前馈神经网络,它是一种二元分类器,把矩阵上的x{\bf{x}}(实数值向量) 映射到输出 f(x)f(x)上(一个二元的值)
f(x)={1 if wx+b>00 else f(x)=\left\{\begin{array}{ll}{1} & {\text { if } w \cdot x+b>0} \\ {0} & {\text { else }}\end{array}\right.
                         在这里插入图片描述

感知器

误差逆传播算法 (error BackPropagation,简称 BP)

符号表示

给定训练集 D ,上图神经网络含有
dd 个输入神经元
ll 个输出神经元
qq 个隐层神经元
θjθ_j 表示输出层第 jj 个神经元的阈值
γh\gamma_h 表示隐层第 hh 个神经元的阈值
whjw_{hj} 表示隐层第 hh 个神经元与输出层第 jj 个神经元的连接权
vihv_{ih} 表示输入层第 ii 个神经元与隐层第 hh 个神经元的连接权

隐层第 hh 个神经元接收输入为 α=i=1dvihxi\alpha =\sum_{i=1}^dv_{ih}x_i
输出层第 jj 个神经元接收输入为 βj=h=1qwhjbh\beta_j=\sum_{h=1}^qw_{hj}b_h, 其中bhb_h为第 hh 个神经元的输出
ff 为 sigmoid 函数

神经网络的输出 y^=(y^1k,y^2k,...,y^lk){\bf{\hat{y}}}=(\hat{y}^k_1, \hat{y}^k_2, ..., \hat{y}^k_l),即
y^jk=f(βjθj)(5.3) \hat{y}^k_j=f(\beta_j-\theta_j)\tag{5.3}
其中 θj为阈值。

网络在(xk,yk)上的均方误差为
Ek=12j=1l(y^jkyjk)2(5.4) E_k=\frac12\sum_{j=1}^l(\hat{y}_j^k-y_j^k)^2\tag{5.4}
BP是一个迭代学习算法,它基于梯度下降策略,以目标的负梯度方向对参数进行调整.对式 (5.4) 的误差 Ek ,给定学习率 η ,有
Δwhj=ηEkwhj=ηEky^jky^jkβjβjwhj(5.5) \begin{aligned} \Delta w_{hj} &= -η\frac{\partial E_k}{\partial w_{hj}}\\ &= -η \frac{\partial E_k}{\partial \hat{y}^k_j }\cdot \frac{\partial \hat{y}^k_j}{\partial \beta _j }\cdot\frac{\partial \beta _j}{\partial w_{hj}}\tag{5.5} \end{aligned}
sigmoid函数有一个很好的性质:
f(x)=f(x)(1f(x))(5.6) f'(x)=f(x)\cdot (1-f(x))\tag{5.6}
于是根据式(5.4)和(5.3),令
gj=Eky^jky^jkβj=(yjk^yjk)f(βjθj)=y^jk(1y^jk)(yjky^jk)(5.7) \begin{aligned} g_j&=- \frac{\partial E_k}{\partial \hat{y}^k_j }\cdot \frac{\partial \hat{y}^k_j}{\partial \beta _j } \\&= -(\hat{y_j^k}-y_j^k)f'(\beta _j-\theta_j)\\&=\hat{y}_j^k(1-\hat{y}_j^k)(y_j^k-\hat{y}_j^k)\tag{5.7} \end{aligned}
根据 βj 的定义,显然有
βjwhj=bh(5.8) \frac{\partial \beta_j}{\partial w_{hj}}=b_h\tag{5.8}
将式(5.7),(5.8)带入式(5.5),得到:
Δwhj=ngjbh(5.9) \Delta w_{hj}=ng_jb_h\tag{5.9}
类似可得
Δθj=ηgj(5.10) \Delta \theta_j=-ηg_j\tag{5.10}
Δvih=ηehxi(5.11) \\ \Delta v_{ih}=ηe_hx_i\tag{5.11}
Δγh=ηeh(5.12) \Delta \gamma_h =-ηe_h\tag{5.12}
下图给出了 BP 算法的工作流程。对每个训练样例, BP 算法执行以下操作:先将输入实例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差(第4-5行),再将误差逆向传播至隐层神经元(第6行),最后根据隐层神经元的误差来对连接权和阈值进行调整(第7行)。该迭代过程循环进行,直到达到某些停止条件为止。


输入:训练集 D={(xk,yk)}k=1m_{k=1}^m
   学习率 η
过程:
1:在 (0,1) 范围内随机初始化网络中所有连接权和阈值
2:repeat
3: for all (xk,yk) \in D do
4:  根据当前参数和式(5.3)计算当前样本的输出 y^k\hat{y}_k
5:  计算输出层神经元的梯度项 gjg_j
6:  计算隐层神经元的梯度项 ehe_h
7:  跟新连接权 whj,vihw_{hj},v_{ih} 与阈值 θj,γh\theta_j,\gamma_h
8: end for
9:until 达到停止条件
输出:连接权与阈值确定的多层前馈神经网络



以下为吴恩达课程中的表述:

训练神经网络:
1. 参数的随机初始化
2. 利用正向传播方法计算所有的 h(x)
3. 编写计算代价函数 J 的代码
4. 利用反向传播方法计算所有偏导数
5. 利用数值检验方法检验这些偏导数
6. 使用优化算法来最小化代价函数

参考:周志华《机器学习》
   吴恩达《机器学习》

posted @ 2019-08-10 16:58  larkii  阅读(307)  评论(0编辑  收藏  举报