机器学习笔记三——神经网络

923 阅读5分钟

神经元模型

神经网络中最基本的成分是神经元(neuron)模型,下图展示了M-P神经元模型,其原理是神经元接收到来自其他n个神经元传递过来的输入信号,输入信号通过带权重的连接(connection)来传递,当前神经元根据接收到的信号和权重计算总输入值,将总输入值和阈值θ\theta进行对比,通过激活函数(activation function)来处理神经元的输出。

image.png

理想的激活函数如下图(a)所示的阶跃函数,对应神经元的两种状态(即有没有超过阈值),但由于其具有不连续不光滑的性质,实际中会使用Sigmoid函数来替代,如下图(b)所示。

image.png

Perceptron 感知机与多层网络

感知机由两层神经元组成,如下图所示,输入层接收到外景输入信号后传递给输出层,输出层为M-P神经元(阔值逻辑单元,threshold logic unit)。

image.png

感知机能够简单实现与、或和非的运算(假设y=f(iwixiθ)y=f(\sum_iw_ix_i-\theta)ff为跃迁函数):

  • 与运算:令w1=w2=1,θ=2w_1=w_2=1,\theta=2y(1x1+1x22)y(1*x_1+1*x_2-2)仅在x1=x2=1x_1=x_2=1时有y=1y=1
  • 或运算:令w1=w2=1,θ=0.5w_1=w_2=1,\theta=0.5y(1x1+1x20.5)y(1*x_1+1*x_2-0.5)x1=1 or x2=1x_1=1\ or\ x_2=1时有y=1y=1
  • 非运算(仅考虑x1x_1):令w1=0.6,w2=0,θ=0.5w_1=-0.6, w_2=0,\theta=-0.5y(0.6x1+0x2+0.5)y(-0.6*x_1+0*x_2+0.5)x1=1x_1=1y=0y=0x1=0x_1=0y=1y=1

一般的,给定训练集,可以学习到权重wi(i=1,2,...,n)w_i(i=1,2,...,n)和阈值θ\thetaθ\theta可看做一个固定输入为-1.0的哑结点(dummy node)所对应连接的权重wn+1w_{n+1},这样权重和阈值两个学习就能统一为单一的权重学习。

对训练样本(x,y)(\pmb{x},y),若当前感知机输出为y^\hat{y},则其权重按照下式进行调整:

wiwi+ΔwiΔwi=η(yy^)xiw_i \leftarrow w_i + \Delta w_i \\ \Delta w_i=\eta(y-\hat{y})x_i

η(0,1)\eta \in(0,1)为学习率(learning rate),从上式可以看出若预测正确即y^=y\hat{y}=yΔw\Delta w不发生变化,否则则按照误差程度进行调整。

感知机只有一层功能神经元(即只有输出层函数使用激活函数处理),其学习能力有限,与、或、非问题都是线性可分(linearly separable)的。若一个问题线性可分,则存在一个线性超平面能将不同类分开,如下图所示。这证明感知机最后一定会收敛(converge)求得合适的权重向量w\pmb{w}。不收敛的感知机会发生震荡,如下图(d)所示,这类问题就是“异或”问题或非线性可分问题。

image.png

解决非线性可分问题需要考虑使用多层功能神经元,如下图(a)所示,在输入输出层中加入一层神经元称为隐含层(hidden layer),隐含层和输出层都是拥有激活函数的功能神经元。

image.png

更常见的神经网络是如下图所示的层级结构,每层神经元与下层全部互连,不存在同层或跨层连接,称为多层前馈神经网络(multi-layer feedforward neural networks)。

image.png

神经网络的学习直观来说就是根据训练数据来调整不同层之间的连接权重(connection weight)w\pmb{w}和每个功能神经元的阈值θ\theta

error BackPropagation 误差逆传播算法

多层网络的学习能力更强,也需要更复杂的学习算法。误差拟传播(error BackPropagation, BP)算法是最杰出的代表,被广泛应用。BP神经网络一般指用BP算法训练的多层前馈神经网络。

给定数据集D={(x1,y1),...,(xm,ym)},xiRd,yiRlD=\{(\pmb{x}_1,\pmb{y}_1),...,(\pmb{x}_m,\pmb{y}_m)\},\pmb{x}_i \in \mathbb{R}^d,\pmb{y}_i \in \mathbb{R}^l。每个输入样本包含dd个特征,输出为ll维实值向量用于表达分类信息,下图给出了一个多层前馈网络结构。

image.png

对于训练样本(xk,yk)(\pmb{x}_k,\pmb{y}_k),假定神经网络输出为y^k=(y^1k,...,y^lk)\hat{\pmb{y}}_k=(\hat{y}^k_1,...,\hat{y}^k_l),则有:

y^jk=f(βjθj)\hat{y}^k_j = f(\beta_j-\theta_j)

其均方误差为:

Ek=12j=1l(y^jkyjk)2E_k=\frac{1}{2}\sum^l_{j=1}(\hat{y}^k_j-y^k_j)^2

上图的网络中有(d+l+1)q+l(d+l+1)q+l个参数(所有的边+除输入层以外的节点数)需确定,BP是迭代学习算法,每一轮中采用广义的感知学习规则来更新估计参数,任意参数vv的更新估计表达式为:

vv+Δvv \leftarrow v+\Delta v

以隐含层到输出层的连接权重whjw_{hj}为例,BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向来调整参数,对于误差EkE_k和学习率η\eta得到:

Δwhj=ηEkwhj \Delta w_{hj}=-\eta \frac{\partial E_k}{\partial w_{hj}}

whjw_{hj}先影响第jj个输出层神经元的输入值βj\beta_j再影响输出值y^jk\hat{y}^k_j最后影响EkE_k,可得:

Ekwhj=Eky^jky^jkβjβjwhj\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}}

根据βj\beta_j的定义(可见上图5.7中的βj\beta_j公式),显然:

βjwhj=bh\frac{\partial \beta_j}{\partial w_{hj}}=b_h

其中bhb_h为隐含层第hh个神经元的输出。Sigmoid函数有以下性质:

f(x)=f(x)(1f(x))f'(x)=f(x)(1-f(x))

于是可以推出:

gj=Eky^jky^jkβj=(y^jkyjk)f(βjθj)=y^jk(1y^jk)(yjky^jk)g_j=-\frac{\partial E_k}{\partial \hat{y}^k_j}\cdot \frac{\partial \hat{y}^k_j}{\partial \beta_j} \\ =-(\hat{y}^k_j-y^k_j)f'(\beta_j-\theta_j) \\ =\hat{y}^k_j(1-\hat{y}^k_j)(y^k_j-\hat{y}^k_j)

综上可得BP算法中whjw_{hj}的更新公式:

Δwhj=ηgjbh\Delta w_{hj}=\eta g_j b_h

类似的方法可求出其他参数的更新公式。学习率η\eta控制着算法每一轮迭代的更新步长,若太大容易震荡,太小有可能导致收敛速度过慢。

BP算法的伪码如下所示: image.png

一个案例如下所示:

image.png

global minimum and local minimum 全局最小和局部极小

神经网络的学习过程其实可以看做为一个参数寻优的过程,“最优”的定义通常有两种:局部极小和全局最小,对于w,θw^*,\theta^*,若存在ϵ>0\epsilon>0使得:

(w;θ){(w;θ) (w;θ)(w;θ)ϵ}\forall (\pmb{w};\theta) \in \{(\pmb{w};\theta)|\ ||(\pmb{w};\theta)-(\pmb{w}^*;\theta^*)||\leq \epsilon\}
  • 都有E(w;θ)E(w;θ)E (\pmb{w};\theta) \geq E(\pmb{w}^*;\theta^*)成立,则(w;θ)(\pmb{w}^*;\theta^*)局部最小解
  • 若对参数空间中的任意(w;θ)(\pmb{w};\theta)都有E(w;θ)E(w;θ)E (\pmb{w};\theta) \geq E(\pmb{w}^*;\theta^*)成立,则(w;θ)(\pmb{w}^*;\theta^*)全局最小解image.png

现实任务中人们最希望能找到全局最下值,但有时候误差函数有多个局部最小梯度下降法找到其中一个便停止寻优,这显然不是最优的,因此一些研究者设计了几个策略来试图“跳出”局部极小进而进一步寻找“全局最小”:

  1. 以多组不同的参数值初始化多个神经网络,训练后取其误差最小的解作为最终参数,这种做法相当于从不同的初始点开始搜索,这样就可能陷入不同的局部最小从而接近全局最小。
  2. 使用模拟退火(simulated annealing)技术,在每一步迭代中以一定的概率接受比当前解更差的结果(即选择次优解),从而有助于跳出局部最小,接受次优解的概率随着时间推移要逐渐降低从而保持算法的稳定性。
  3. 使用随机梯度下降,在计算梯度时加入随机因素,让陷入局部最小点时计算的梯度仍可能不为0,从而可以继续搜索。
  4. 遗传算法(genetic algorithms)。