一、多层前馈神经网络

要解决非线性可分问题,需考虑使用多层功能神经元。

输入层和输出层之间的一层神经元,被称为隐层或隐含层(hidden layer)。

隐含层和输出层神经元都是拥有激活函数的功能神经元。

更一般的,常见的神经网络如下图所示的层级结构:

图1 多层前馈神经网络结构示意图

每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural networks),其中输入层神经元接受外界输入,隐层和输出层神经元对信号进行加工,最终结果由输出层神经元输出。

(换句话说,输入层神经元仅接受输入,不进行函数处理。)

(a)图通常称为“两层神经网络”,为避免歧义,将其命名为单隐层网络(只需包含隐层,即可称为多层网络)。

神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”以及每个功能神经元的阈值,换言之,神经网络学到的东西,蕴含在连接权和阈值中。

二、标准误差逆传播算法(标准BP算法)

BP算法亦称为“反向传播算法”。

通常说的“BP网络”一般是指BP算法训练的多层前馈神经网络。

下面讲解什么是BP算法?

BP算法的基本思想是:

(1)正向传播FP(求损失):在这个过程中,我们根据样本的输入,给定的初始化权重值W和偏置项的值b,计算最终输出值以及输出值与实际值之间的损失值。如果损失值不在给定的范围内则进行反向传播的过程,否则停止W,b的更新。

(2)反向传播BP(回传误差):将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号。此误差信号即作为修正各单元权值的依据。

以三层感知机结构为例,说明BP算法的一般计算方法

给定训练集D=\{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}, x_i \in \mathbb{R}^d,y_i \in \mathbb{R}^l

即输入示例由d个属性描述,输出l维实值向量。

为了便于讨论,给出下图:

上图给出了一个拥有d个输入神经元,l个输出神经元、q个隐层神经元的多层前馈神经网络。

输出层第j个神经元的阈值用\theta_j表示,隐层第h个神经元的阈值用\gamma_h表示。输入层第i个神经元与隐层第h个神经元之间的连接权用v_{ih}表示。隐层第h个神经元与输出层第j个神经元之间的连接权用w_{hj}表示。 

记隐层第h个神经元接收到的输入为\alpha_h = \sum_{i=1}^{d} v_{ih}x_i

输出层第j个神经元接收到的输入为\beta_j = \sum_{h=1}^{q} w_{hj} b_h,其中b_{h}为隐层第h个神经元的输出。

假设隐层和输出层都是用sigmoid函数。

对训练例(x_k,y_k),假定神经网络的输出为\hat{y}_k=(\hat{y_1}^k,\hat{y_2}^k,...,\hat{y_l}^k),即

\hat{y_j}^k=f(\beta_j-\theta_j)

则网络在(x_k,y_k)上的均方误差为:

E_k=\frac{1}{2}\sum_{j=1}^{l}(\hat{y_j}^k-y_j^k)^2

 网络中需要确定的参数为:输入层到隐层的d \times q个权值,隐层到输出层的q \times l个权值,q个隐层神经元的阈值,l个输出层神经元的阈值。一共是(d+l+1) \times q +l个参数。

BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计。

以隐层到输出层的连接权w_{hj}为例来进行推导。

BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,给定学习率η,有:

\bigtriangleup w_{hj} = - \eta \frac{\partial E_k}{\partial w_{hj}}

注意到w_{hj}先影响到第j个输出层神经元的输入值\beta_j,再影响到其输出值\hat{y}_j^k,然后影响到E_k,

根据链式法则有:

\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}}

 因为\beta_j = \sum_{h=1}^{q} w_{hj} b_h,所以:

\frac{\partial \beta_j}{\partial w_{hj}} = b_h

 Sigmoid函数有一个很好的性质为:

f^{'}(x) =f(x)(1-f(x))

因为:\hat{y_j}^k=f(\beta_j-\theta_j),所以\frac{\partial \hat{y}_j^k}{\partial \beta_j} = f^{'}(\beta_j-\theta_j)

因为:E_k=\frac{1}{2}\sum_{j=1}^{l}(\hat{y_j}^k-y_j^k)^2,所以\frac{\partial E_k}{\partial \hat{y}_j^k} = \hat{y}_j^k-y_j^k,故:

g_j = - \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)\hat{y}_j^k(1-\hat{y}_j^k) \\=\hat{y}_j^k(1-\hat{y}_j^k)(y_j^k-\hat{y}_j^k)(输出层神经元的梯度项)

所以,\bigtriangleup w_{hj} = \eta g_j b_h

类似地,注意到\theta_j首先影响到输出值\hat{y}_j^k,再影响到E_k,所以有:

\bigtriangleup \theta_j = - \eta \frac{\partial E_k}{\partial \theta_j} \\ = -\eta (\frac{\partial E_k}{\partial \hat{y}_j^k} \cdot \frac{\partial \hat{y}_j^k}{\partial \theta_j}) \\= - \eta(-(\hat{y}_j^k-y_j^k) \hat{y}_j^k(1-\hat{y}_j^k)) \\=-\eta \hat{y}_j^k (1-\hat{y}_j^k)(y_j^k-\hat{y}_j^k) \\=-\eta g_j

类似地,隐层神经元的梯度项e_h的求解为:

首先注意到v_{ih}首先影响到第h个隐层神经元的输入值\alpha_h,在影响到隐层神经元的输出值b_h,最后影响到E_k,所以有:

\bigtriangleup v_{ih} = -\eta \frac{\partial E_k}{\partial v_{ih}} \\= -\eta(\frac{\partial E_k}{\partial b_h} \cdot \frac{\partial b_{h}}{\partial \alpha_h} \cdot \frac{\partial \alpha_h}{\partial v_{ih}})

其中,由于b_h是隐层神经元的输出,则b_h = f(\alpha_h-\gamma_h),那么 

e_h = -\frac{\partial E_k}{\partial b_h} \cdot \frac{\partial b_h}{\partial \alpha_h} \\= - \sum_{j=1}^{l} \frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h} f^{'}(\alpha_h- \gamma_h) \\= -\sum_{j=1}^{l} \frac{\partial E_k}{\partial \hat{y}_j^k }\cdot \frac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot f^{'}(\alpha_h- \gamma_h) \\= \sum_{j=1}^{l} w_{hj} g_j f^{'}(\alpha_h- \gamma_h) \\= b_h(1-b_h) \sum_{j=1}^{l} w_{hj} g_j(隐层神经元的梯度项)

所以, \bigtriangleup v_{ih} = - \eta \frac{\partial E_{k}}{\partial v_{ih}} \\= \eta e_h \cdot \frac{\partial \alpha_h}{\partial v_{ih}} \\=\eta e_h x_i

类似地,注意到\gamma_h首先影响到输出值b_h,再影响到E_k,所以有:

\bigtriangleup \gamma_h = - \eta \frac{\partial E_k}{\partial \gamma_h} \\= - \eta (\frac{\partial E_k}{\partial b_h} \cdot \frac{\partial b_h}{\partial \gamma_h}) \\=-\eta \cdot \frac{\partial E_k}{\partial b_h} \cdot (-f^{'}(\alpha_h-\gamma_h)) \\=-\eta \cdot (\sum_{j=1}^{l} \frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h}) \cdot (-f^{'}(\alpha_h-\gamma_h)) \\= \eta \sum_{j=1}^{l} \frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h}f^{'}(\alpha_h-\gamma_h) \\=-\eta e_h

经过推导,得出(标准)BP算法的步骤为:


输入:训练集D=\{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}, x_i \in \mathbb{R}^d,y_i \in \mathbb{R}^l;学习率\eta

过程:

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

repeat:

        for all(x_k,y_k\in D do

                根据当前参数和计算当前样本的输出\hat{y}_j^k;

                计算输出层神经元的梯度项g_j;

                计算隐层神经元的梯度项e_h;

                更新连接权w_{hj},v_{ih}与阈值\theta_j, \gamma_h

        end for

until 达到停止条件

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


需要注意的是,BP算法的目标是要最小化训练集D上的累积误差

E=\frac{1}{m} \sum_{k=1}^{m} E_k

但是从我们上面的BP算法过程来看,我们每次针对一个训练样例更新连接权和阈值,也就是说,上述算法的更新规则是基于单个的Ek推导而得。

如果类似地推导出基于累积误差最小化得更新规则,就得到了累积误差逆传播算法。他在读取整个数据集D一遍后,才对参数进行更新

由于BP神经网络强大得表示能力,所以其经常遭遇过拟合。即训练误差持续降低,但测试误差却可能上升。有两种策略缓解BP网络得过拟合:

(1)早停:将数据分成训练集和测试集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低,但验证集误差升高,则停止训练,同时返回最小验证集误差的连接权和阈值。

(2)正则化:在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权和阈值的平方和。仍令Ek表示第k个训练样例上的误差,wi表示连接权和阈值,则误差目标函数为:

E=\lambda \frac{1}{m} \sum_{k=1}^{m} E_k + (1-\lambda) \sum_{i} w_i^2

其中,\lambda在(0,1)中,用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法估计。

更多推荐