BP神经网络

基本概念

1、神经元

BP神经网络

在这个模型中,神经元接收到来自n个其他神经元传递来的信号,这些输入信号通过带权的连接进行传递,神经元接收到总输入值,再与阈值进行比较,然后通过“**函数”处理以产生神经元输出。

2、**函数

为什么神经网络模型要使用**函数:

(1)引入非线性因素,解决非线性问题。

(2)可知输出范围,有限的输出范围使得网络对于一些比较大的输入也会比较稳定,这也是为什么早期的**函数都以此类函数为主,如Sigmoid、TanH。

**函数的性质要求:

(1)可微性:BP神经网络的优化方法是基于梯度的,所以必须要求**函数可微

(2)单调性:即导数符号不变。单调性使得在**函数处的梯度方向不会经常改变,从而让训练更容易收敛。

常见**函数如下:

(1)ReLu函数

该函数是工程上使用较多的**函数,其定义为:
y={0(x0)x(x>0)y=\left \{\begin{array} {lr} 0 \qquad(x\le 0)\\ x \qquad(x> 0) \end{array}\right.
BP神经网络

(2)sigmoid函数
f(x)=11+ex f(x) = \frac{1}{1+e^{-x}}
其图像如下:

BP神经网络

Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,可以用作输出层。求导容易,求导结果为f(x)(1f(x))f(x)(1-f(x)),其最大的局限性在于:当x达到一定值时,其导数值等于0,容易产生梯度消失,导致训练出现问题。

(3)tanh函数
tanh(x)=1e2x1+e2x tanh(x) = \frac{1-e^{-2x}}{1+e^{-2x}}
其图像如下:

BP神经网络

相比Sigmoid函数,其输出以0为中心而且收敛速度快。但他和sigmoid一样,也存在梯度消失问题。

神经网络模型

回顾感知机模型 ,感知机模型也可以理解为一个简单的神经网络模型,由两层神经元组成,如下图所示:
BP神经网络

需要注意的是,感知机只有输出层神经元进行**函数处理,即只拥有一层功能神经元,其学习能力非常有限。

感知机模型 中也提到过,感知机只能解决简单的二分类问题,如:“与”,“非”,“或”;不能解决异或问题,为了解决非线性问题,需要考虑使用多层功能神经元。如下图所示:

BP神经网络
那么如何训练得到这个神经网络的参数,我们使用误差逆传播(BP)算法进行学习,学习得到的神经网络称为BP神经网络。

给定训练集D={(x1,y1),(x2,y2),,(xm,ym)},xiRd,yiRlD=\{(x_1,y_1),(x_2,y_2),\ldots,(x_m,y_m)\},x_i \in \mathbf R^d,y_i \in \mathbf R^l ,即输入数据有dd个属性,输出ll维实值向量。隐层神经元个数是qq输出层第jj个神经元的阈值用θj\theta_j表示,隐层第hh个神经元的阈值用γh\gamma_h表示。**函数采用sigmoid函数。

对训练样本(xk,yk)(x_k,y_k),假定神经网络的输出为y^=(y^1k,y^2k,,y^lk)\hat {\mathbf y} =(\hat y_1^k,\hat y_2^k,\ldots,\hat y_l^k),所以有:
y^jk=f(βjθj) \hat y_j^k = f(\beta_j - \theta_j)
则网络在(xk,yk)(x_k,y_k)上的均方误差为:
Ek=12j=1l(y^jkyjk)2 E_k = \frac{1}{2}\sum_{j=1}^l(\hat y_j^k - y_j^k)^2
我们的目标是最小化这个误差函数。

待求参数:

(1)输入层到隐藏层有d×qd\times q个参数。

(2) 隐藏层到输出层有q×lq\times l个参数。

(3)隐层qq个神经元的阈值。

(4)输出层ll个神经元的阈值。

BP神经网络基于梯度下降策略,以目标的负梯度方向对参数进行调整。不断优化参数。

(1)求whj\triangle w_{hj}

对误差函数EkE_k,给定学习了η\eta,有:
whj=ηEkwhj \triangle w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}}
根据链式求导法则:
Ekwhj=Eky^jky^jkβjβjwhj \frac{\partial E_k}{\partial w_{hj}} = \frac{\partial {E_k}}{\partial{\hat{y}_j^k}} \cdot \frac{\partial{\hat{y}_j^k}}{\partial{\beta_j}} \cdot \frac{\partial{\beta_j}}{\partial{w_{hj}}}
βj=h=1qwhjbh\beta_j=\sum_{h=1}^q w_{hj}b_h得:
βjwhj=bh \frac{\partial{\beta_j}}{\partial{w_{hj}}} = b_h
sigmoid函数求导结果如下:
f(x)=f(x)(1f(x)) f'(x) = f(x)(1-f(x))

定义gig_i
gi=Eky^jky^jkβj=(y^jkyjk)f(βjθj)=(y^jkyjk)f(βjθj)(1f(βjθj))=y^jk(1y^jk)(yjky^jk) \begin{aligned} g_i &= - \frac{\partial {E_k}}{\partial{\hat{y}_j^k}} \cdot \frac{\partial{\hat{y}_j^k}}{\partial{\beta_j}} \\ & = -(\hat y_j^k - y_j^k)f'(\beta_j - \theta_j) \\ & = -(\hat y_j^k - y_j^k)f(\beta_j - \theta_j)(1-f(\beta_j - \theta_j))\\ &=\hat{y}_j^k(1-\hat{y}_j^k)(y_j^k-\hat{y}_j^k) \end{aligned}
gjg_j为输出神经元得梯度

所以:
whj=ηgjbh \triangle w_{hj} = \eta g_j b_h
(2)求θj\triangle \theta_j
Δθj=ηEkθj \Delta \theta_j = -\eta \cfrac{\partial E_k}{\partial \theta_j}

Ekθj=Eky^jky^jkθj=Eky^jk[f(βjθj)]θj=Eky^jkf(βjθj)×(1)=Eky^jkf(βjθj)×[1f(βjθj)]×(1)=Eky^jky^jk(1y^jk)×(1)=[12j=1l(y^jkyjk)2]y^jky^jk(1y^jk)×(1)=12×2(y^jkyjk)×1y^jk(1y^jk)×(1)=(yjky^jk)y^jk(1y^jk)=gj \begin{aligned} \cfrac{\partial E_k}{\partial \theta_j} &= \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot\cfrac{\partial \hat{y}_j^k}{\partial \theta_j} \\ &= \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot\cfrac{\partial [f(\beta_j-\theta_j)]}{\partial \theta_j} \\ &=\cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot f^{\prime}(\beta_j-\theta_j) \times (-1) \\ &=\cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot f\left(\beta_{j}-\theta_{j}\right)\times\left[1-f\left(\beta_{j}-\theta_{j}\right)\right] \times (-1) \\ &=\cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \hat{y}_j^k\left(1-\hat{y}_j^k\right) \times (-1) \\ &=\cfrac{\partial\left[ \cfrac{1}{2} \sum\limits_{j=1}^{l}\left(\hat{y}_{j}^{k}-y_{j}^{k}\right)^{2}\right]}{\partial \hat{y}_{j}^{k}} \cdot \hat{y}_j^k\left(1-\hat{y}_j^k\right) \times (-1) \\ &=\cfrac{1}{2}\times 2(\hat{y}_j^k-y_j^k)\times 1 \cdot\hat{y}_j^k\left(1-\hat{y}_j^k\right) \times (-1) \\ &=(y_j^k-\hat{y}_j^k)\hat{y}_j^k\left(1-\hat{y}_j^k\right) \\ &= g_j \end{aligned}

所以:
Δθj=ηgj \Delta \theta_j = -\eta g_j
(3)求Δvih\Delta v_{ih}

因为
Δvih=ηEkvih \Delta v_{ih} = -\eta \cfrac{\partial E_k}{\partial v_{ih}}

所以:
Ekvih=j=1lEky^jky^jkβjβjbhbhαhαhvih=j=1lEky^jky^jkβjβjbhbhαhxi=j=1lEky^jky^jkβjβjbhf(αhγh)xi=j=1lEky^jky^jkβjwhjf(αhγh)xi=j=1l(gj)whjf(αhγh)xi=f(αhγh)j=1lgjwhjxi=bh(1bh)j=1lgjwhjxi=ehxi \begin{aligned} \cfrac{\partial E_k}{\partial v_{ih}} &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \alpha_h} \cdot \cfrac{\partial \alpha_h}{\partial v_{ih}} \\&= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \alpha_h} \cdot x_i \\ &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot x_i \\&= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot x_i \\&= \sum_{j=1}^{l} (-g_j) \cdot w_{hj} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot x_i \\&= -f^{\prime}(\alpha_h-\gamma_h) \cdot \sum_{j=1}^{l} g_j \cdot w_{hj} \cdot x_i\\&= -b_h(1-b_h) \cdot \sum_{j=1}^{l} g_j \cdot w_{hj} \cdot x_i \\&= -e_h \cdot x_i\end{aligned}
eh=j=1lEky^jky^jkβjβjbhbhαhe_h= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \alpha_h}为隐层神经元得梯度项

所以:
Δvih=ηEkvih=ηehxi \Delta v_{ih} =-\eta \cfrac{\partial E_k}{\partial v_{ih}} =\eta e_h x_i
(4)求Δγh\Delta \gamma_h

因为:
Δγh=ηEkγh \Delta \gamma_h = -\eta \cfrac{\partial E_k}{\partial \gamma_h}
所以:
Ekγh=j=1lEky^jky^jkβjβjbhbhγh=j=1lEky^jky^jkβjβjbhf(αhγh)(1)=j=1lEky^jky^jkβjwhjf(αhγh)=j=1lEky^jky^jkβjwhjbh(1bh)=j=1lgjwhjbh(1bh)=eh \begin{aligned} \cfrac{\partial E_k}{\partial \gamma_h} &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \gamma_h} \\ &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot (-1) \\ &= -\sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot f^{\prime}(\alpha_h-\gamma_h)\\ &= -\sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot b_h(1-b_h)\\ &= \sum_{j=1}^{l}g_j\cdot w_{hj} \cdot b_h(1-b_h)\\ &=e_h \end{aligned}
所以:
Δγh=ηEkγh=ηeh \Delta \gamma_h=-\eta\cfrac{\partial E_k}{\partial \gamma_h} = -\eta e_h
注:学习了η(0,1)\eta \in (0,1) 控制每一轮迭代中得更新步长,太大容易震荡太小收敛速度很慢。

误差逆传播算法如下:

输入:训练集D={(xk,yk)}k=1mD=\{(\mathbf x_k,\mathbf y_k)\}_{k=1}^m ,学习率 η\eta

输出:连接全与阈值确定的多层前馈神经网络。

过程:

  1. 在(0,1)范围内随机初始神经网络中得所有连接权和阈值

  2. repeat:

    ​ for all (xk,yk)(\mathbf x_k,\mathbf y_k) do

    ​ 根据当前参数计算当前得样本输出yk^\hat {\mathbf y_k}

    ​ 计算输出神经元梯度项 gjg_j

    ​ 计算隐层神经元得梯度项ehe_h

    ​ 根据求导的最终结果:
    whj=ηgjbhΔθj=ηgjΔvih=ηehxiΔγh=ηeh \triangle w_{hj} = \eta g_j b_h \\ \Delta \theta_j = -\eta g_j \\ \Delta v_{ih} =\eta e_h x_i \\ \Delta \gamma_h = -\eta e_h
    ​ 更新权值whj,vihw_{hj},v_{ih} 与阈值θj,γh\theta_j,\gamma_h

    ​ end for

    util 达到条件

这个过程中,需要注意BP算法的目标是要最小化训练集D上的累计误差:
E=1mk=1mEk E = \frac{1}{m} \sum_{k=1}^mE_k
最小化并非累积误差为0,若累积误差为0,会导致过拟合现象;因此通常采用“正则化”的策略,即在误差目标函数中增加一项用于描述网络复杂度的部分,例如连接权与阈值的平方和;则误差目标函数可以改为:
E=λ1mk=1mEk+(1λ)iwi2 E = \lambda \frac{1}{m} \sum_{k=1}^mE_k + (1-\lambda) \sum_{i} w_i^2
其中 λ(0,1)λ ∈(0,1),其作用是对经验误差与网络复杂度这两项进行折中。 由上式可知,误差E是连接权和阀值的函数,此时,神经网络可以看做一个参数寻优的过程,即在参数空间中寻找一组最优的参数使得误差最小。