第五章——神经网络5.1、神经元模型
神经网络中最基本的成分为神经元模型,用M-P神经元模型来表示,如下图所示:
每个神经元接收到来自\(n\)个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将于神经元的阈值进行比较,然后通过激活函数处理以产生神经元的输出。而理想的激活函数是阶跃函数,但其数学特性不够好,不方便我们计算。因此典型的激活函数为Sigmoid函数,如下图:
那么功能神经元的输出公式为\(f(\sum_{i}\omega_ix_i-\theta)\)
此处补充Sigmoid函数的一个知识点:\(y=Sigmoid(x)\)函数的取值可以理解为标记\(y\)取1的概率。这里需要引入指数族分布来进行解释:
对于指数族分布来说,其概率密度函数可以写成
\[P(y;\eta)=b(y)exp(\eta^TT(y)-\alpha(\eta))\]
其中\(b(y)\)用来进行归一化从而可以表示成概率,其中\(T(y)\)为关于\(y\)的函数,\(y\)为标记,这一部分最关键,另外的\(\eta\)相关可以看成输入项。
那么对于二项分布来说,有
\[f(y)=\begin{cases}p \quad y=1\\1-p \quad y=0\end{cases}\]
则可以写成
\[p^y(1-p)^{1-y}=e^{ln[p^y(1-p)^{1-y}]}\\=e^{yln\frac{p}{1-p}+ln(1-p)}\]
令\(\eta=ln\frac{p}{1-p}\),则可以化简出
\[p=\frac{e^{\eta}}{1+e^{\eta}}=\frac{1}{1+e^{-\eta}}\]
因此Sigmoid函数可以看成为输入\(x\)使得输出取到1概率
5.2、感知机与多层网络
先从最简单的神经网络模式感知机来认识神经网络。
感知机由两层神经元组成,如下图所示:
输入层接受外界的输入信号后传递给输出层。注意在感知机中只有输出层的神经元是M-P神经元,会对输入进行非线性变化,而输入层的神经元并不会进行非线性变化,只是将输入接受并传递到下一层的神经元而已。而感知机模型由于只有输出层进行了激活函数处理(即只拥有单层功能神经元),因此其学习能力非常有限,只能用来处理线性可分的问题,而对于非线性可分的问题则会陷入震荡,难以收敛。
如果要处理非线性可分的问题,就需要用拥有多层功能神经元的神经网络模型,例如下图的多层前馈神经网络模型
这种模型的特点在于隐含层和输出层的神经元都是拥有激活函数的功能神经元,即会对总输入进行线性变化后再进行输出的神经元;同时每层神经元与下一层的神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这是前馈的特点。那么多层网络所需要学习的参数就包括连接神经元之间的各个权重,以及各功能神经元的阈值。
5.3、误差逆传播算法
误差逆传播算法(BP算法)可用于训练多层网络,也称为反向传播算法。其具体过程如下:
各种参数的含义在图中已表明,另外仍需补充:\(\theta_j\)为输出层第\(j\)个神经元的阈值,而\(\gamma_h\)表示隐层第\(h\)个神经元的阈值。
误差逆传播算法的思想遍历所有实例(可多次遍历),在于对每一个实例计算一次预测结果的均方误差,再对参数进行一次修正。
对于训练例子\((x_k,y_k)\),假设神经网络的输出结果为\(\hat{y}_k=(\hat{y}_1^k,\hat{y}_2^k,…\hat{y}_l^k)\)
那么在训练例子\((x_k,y_k)\)上的均方误差为:
\[E_k=\frac{1}{2}\sum_{j=1}^{l}(\hat{y}_j^k-y_j^k)^2\]
BP算法基于梯度下降策略,对目标的负梯度方向对参数进行调整,每个参数具体的更新公式如下:
任意参数的更新估计式为:
\[v\longleftarrow v+\Delta v\]
那么每次遍历一个样本对每个参数的更新量为:
\[\Delta\omega_{hj}=\eta g_jb_h\\\Delta \theta_j=-\eta g_j\\\Delta v_{ih}=\eta e_h x_i\\\Delta \gamma _h=-\eta e_h\\\]
其中 \(\quad e_h=b_h(1-b_h)\sum_{j=1}^l \omega_{hj}g_j\),而\(\eta \in (0,1)\)代表学习率,其控制着算法每一轮迭代中的更新步长,若过大则容易陷入震荡,若太小则收敛速度过慢。
下图为标准BP算法的学习过程,可文字表述为:对每一个训练样本,BP算法先将该样本提供给输入层神经元,然后逐层将信号前传直至产生输出层的结果,然后计算输出层的误差,再将误差反向传播到隐层神经元,最后再根据隐层神经元的误差来对连接权和阈值进行调整。遍历所有样本来重复以上过程,也可遍历几次样本,直至达到某种停止条件为止。
但需要注意的是,BP算法的目标实际上是最优化训练集\(D\)上的累计误差:
\[E=\frac{1}{m}\sum_{k=1}^mE_k\]
但上文介绍的标准BP算法每次仅针对一个训练样本来更新权重,因此会更新得非常频繁,并在可能在不用样本之间的参数更新出现“抵消”的情况,所以标准BP算法往往需要进行多轮循环的迭代才能够达到要求。而如果是针对累计误差的更新则称为累计BP算法,它在读取整个训练集\(D\)一遍之后计算出累计误差才对参数进行更新,虽然这样更新频率降低但是计算量相对来说会大很多,并且在很多任务中累计误差下降到一定程度后,进一步下降会非常缓慢。
对于神经网络来说,由于其强大的学习能力和表示能力,在学习过程中会经常出现过拟合的现象,对训练样本的学习程度过深,导致训练误差持续降低而测试误差反而上升。一般来说有两种缓解BP网络的过拟合的策略:
- 早停:将数据集分为训练集和验证集(不是测试集,测试集需要用来计算其泛化误差),训练集用来计算梯度、更新参数,验证集用来估计误差,若训练集误差降低而验证集误差升高则停止训练,返回具有最小验证集误差时的各参数值。
- 正则化:其思想就是在误差目标函数中加入一个用于表示模型复杂度的部分,这就可以在最小化误差函数的时候同时限制模型的复杂度。
5.4、全局最小与局部最小
对于BP网络来说,由于其是依靠梯度来进行更新的,因此在学习过程中有可能会陷入局部最优(局部最优处梯度也为0)的问题中。为了解决该问题也有以下几种策略:
- 以多组不同参数值初始化多个神经网络,并按照标准BP算法训练后选取其中误差最小的神经网络的参数做为最终参数。这就相当于从多个不用的初始点开始搜索,更有机会可以找到全局最优。
- 使用模拟退火技术:模拟退火的思想是在每一步都以一定的概率接受比当前解更差的结果,例如在误差函数下降的过程中有可能会出现接受一个新的参数使得误差函数值增加,因此这有利于跳出局部最优解。而且随着迭代过程的深入,接受次优解的概率也会逐渐下降,因此可以保证算法的稳定性。但这也有可能使算法跳出全局最优解。
- 使用随机梯度下降:其实标准BP算法的思想就是随机梯度下降的思想,因为标准BP算法每次进行更新的都是单个样本的误差,而不是全部样本的误差,这样由于不同样本的误差而导致的参数更新之间可能存在相互抵消的可能性,也就是说遍历了所有样本完成了一次循环的更新,与累计BP算法对累计误差所进行的一次更新,可能是不一样的,因此这就具有一定的随机性,就算陷入局部最小点,也可能在该点计算某个样本的误差梯度时不为0,因此跳出了局部最小点。