一、神经元模型
神经网络(neural networks) 中最基本的成分是神经元(neuron) 模型,在这个模型中,神经元接收到来自 n n n 个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection) 进行传递,神经元接收到的总输入值将于神经元的阈值进行比较,然后通过激活函数(activation function) 处理以产生神经元的输出。
理想的激活函数是阶跃函数,常用的激活函数是 Sigmoid :
把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。
二、感知机与多层网络
感知机(Perceptron) 由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是 M-P 神经元,亦称阈值逻辑单元(threshold logic unit)。
感知机能容易地实现逻辑与、或、非运算。假定 f f f 是阶跃函数, y = f ( ∑ i w i x i − θ ) y=f(\sum_iw_ix_i-\theta) y=f(∑iwixi−θ),则:
- 与( x 1 ∧ x 2 x_1\wedge x_2 x1∧x2):令 w 1 = w 2 = 1 , θ = 2 w_1=w_2=1, \theta=2 w1=w2=1,θ=2 则 y = f ( 1 ⋅ x 1 + 1 ⋅ x 2 − 2 ) y=f(1\cdot x_1+1\cdot x_2-2) y=f(1⋅x1+1⋅x2−2),仅在 x 1 = x 2 = 1 x_1=x_2=1 x1=x2=1 时, y = 1 y=1 y=1 ;
- 或( x 1 ∨ x 2 x_1\vee x_2 x1∨x2):令 w 1 = w 2 = 1 , θ = 0.5 w_1=w_2=1, \theta=0.5 w1=w2=1,θ=0.5 则 y = f ( 1 ⋅ x 1 + 1 ⋅ x 2 − 0.5 ) y=f(1\cdot x_1+1\cdot x_2-0.5) y=f(1⋅x1+1⋅x2−0.5),当 x 1 = 1 x_1=1 x1=1 或 x 2 = 1 x_2=1 x2=1 时, y = 1 y=1 y=1 ;
- 非( − x 1 -x_1 −x1):令 w 1 = − 0.6 , w 2 = 0 , θ = − 0.5 w_1=-0.6,w_2=0,\theta=-0.5 w1=−0.6,w2=0,θ=−0.5 ,则 y = f ( − 0.6 ⋅ x 1 + 0 ⋅ x 2 + 0.5 ) y=f(-0.6\cdot x_1+0\cdot x_2+0.5) y=f(−0.6⋅x1+0⋅x2+0.5) ,当 x 1 = 1 x_1=1 x1=1 时, y = 0 y=0 y=0 ;当 x 1 = 0 x_1=0 x1=0 时, y = 1 y=1 y=1 。
更一般地,给定训练数据集,权重 w i ( i = 1 , 2 , ⋯ , n ) w_i(i=1,2,\cdots,n) wi(i=1,2,⋯,n) 以及阈值 θ \theta θ 可通过学习得到。阈值 θ \theta θ 可以看作一个固定输入为 − 1.0 -1.0 −1.0 的哑结点(dummy node) 所对应的连接权重 w n + 1 w_{n+1} wn+1 ,这样,权重和阈值的学习就可统一为权重的学习。对训练样例 ( x , y ) (x,y) (x,y) ,若当前感知机的输出为 y ^ \hat y y^ ,则感知机学习规则如下:
w i ← w i + △ w i (5.1) w_i\leftarrow w_i+\triangle w_i\tag{5.1} wi←wi+△wi(5.1)
△ w i = η ( y − y ^ ) x i \triangle w_i=\eta(y-\hat y)x_i △wi=η(y−y^)xi
其中 η ∈ ( 0 , 1 ) \eta\in(0,1) η∈(0,1) 称为学习率(learning rate)。从上式中可以发现,若预测正确,则感知机不发生变化,否则将根据错误的程度进行权重调整。
由于感知机的结构过于简单,只能用于解决线性可分的问题。面对复杂的非线性问题时,需要考虑多层功能神经元。包含隐层即为多层网络,神经网络的学习过程就是根据训练数据来调整神经元之间的连接权(connection weight) 以及每个功能神经元的阈值。
三、误差逆传播算法
多层网络的学习能力比单层感知机强很多,但要训练多层网络,式 5.1 显然过于简单,因此需要使用误差逆传播(BackPropagation, BP)算法。
给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } , x i ∈ R d , y i ∈ R l D=\left\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\right\},x_i\in\mathbb R^d,y_i\in\mathbb R^l D={(x1,y1),(x2,y2),⋯,(xm,ym)},xi∈Rd,yi∈Rl ,即输入示例由 d d d 各属性描述,输出 l l l 维实值向量:
上图给出了一个拥有 d d d 各输入神经元、 l l l 个输出神经元、 q q q 个隐层神经元的多层前馈网络结构,其中输出层第 j j j 个神经元的阈值用 θ j \theta_j θj 表示,隐层第 h h h 个神经元的阈值用 γ h \gamma_h γh 表示。输入层第 i i i 个神经元与隐层第 h h h 个神经元之间的连接权维 v i h v_{ih} vih ,隐层第 h h h 个神经元与输出层第 j j j 个神经元之间的连接权为 w h j w_{hj} whj 。记隐层第 h h h 个神经元接收到的输入为 α h = ∑ i = 1 d v i h x i \alpha_h=\sum_{i=1}^dv_{ih}x_i αh=∑i=1dvihxi ,输出层第 j j j 个神经元接收到的输入为 β j = ∑ h = 1 q w h j b h \beta_j=\sum_{h=1}^qw_{hj}b_h βj=∑h=1qwhjbh ,其中 b h b_h bh 为隐层第 h h h 个神经元的输出。假设隐层和输出层神经元都是用 Sigmoid 函数。
对训练例 ( x k , y k ) (x_k,y_k) (xk,yk) ,假定神经网络的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , ⋯ , y ^ l k ) \hat y_k=(\hat y_1^k,\hat y_2^k,\cdots,\hat y_l^k) y^k=(y^1k,y^2k,⋯,y^lk) ,即输出层第 j j j 个神经元的输入与阈值的差函数:
y ^ j k = f ( β j − θ j ) (5.3) \hat y_j^k=f(\beta_j-\theta_j)\tag{5.3} y^jk=f(βj−θj)(5.3)
则网络在 ( x k , y k ) (x_k,y_k) (xk,yk) 上的均方误差为:
E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 (5.4) E_k=\frac{1}{2}\sum_{j=1}^l(\hat y_j^k-y_j^k)^2 \tag{5.4} Ek=21j=1∑l(y^jk−yjk)2(5.4)
上图网络中有 ( d + l + 1 ) q + l (d+l+1)q+l (d+l+1)q+l 个参数需确定:输入层到隐层的 d × q d\times q d×q 个权值、隐层到输出层的 q × l q\times l q×l 个权值、 q q q 个隐层神经元的阈值、 l l l 个输出层神经元的阈值。BP 是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,即与式 5.1 类似,任意参数 v v v 的更新估计式如下:
v ← v + △ v (5.5) v\leftarrow v+\triangle v\tag{5.5} v←v+△v(5.5)
以隐层到输出层的连接权 w h j w_{hj} whj 为例来进行推导,BP 算法基于梯度下降(gradient descent) 策略,以目标的负梯度方向对参数进行调整。对式 5.4 的误差 E k E_k Ek ,给定学习率 η \eta η ,有:
△ w h j = − η ∂ E k ∂ w h j (5.6) \triangle w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}}\tag{5.6} △whj=−η∂whj∂Ek(5.6)
注意到 w h j w_{hj} whj 先影响到第 j j j 个输出层神经元的输入值 β j \beta_j βj ,再影响到其输出值 y ^ j k \hat y_j^k y^jk ,然后影响到 E k E_k Ek ,有:
∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j (5.7) \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}}\tag{5.7} ∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj(5.7)
根据 β j \beta_j βj 的定义,显然有:
∂ β j ∂ w h j = b h (5.8) \frac{\partial\beta_j}{\partial w_{hj}}=b_h\tag{5.8} ∂whj∂βj=bh(5.8)
由 Sigmoid 函数的性质得:
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) (5.9) f'(x)=f(x)(1-f(x))\tag{5.9} f′(x)=f(x)(1−f(x))(5.9)
因此由式 5.3 和式 5.4 有:
g j = − ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j = − ( y ^ j k − y j k ) f ′ ( β j − θ j ) = y ^ j k ( 1 − y ^ j k ) ( y j k − y ^ j k ) (5.10) 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(1-\hat y_j^k)(y_j^k-\hat y_j^k)\tag{5.10} gj=−∂y^jk∂Ek⋅∂βj∂y^jk=−(y^jk−yjk)f′(βj−θj)=y^jk(1−y^jk)(yjk−y^jk)(5.10)
将式 5.10 和 5.8 代入式 5.7 和 5.6 ,得到 w h j w_{hj} whj 的更新公式:
△ w h j = η g j b h (5.11) \triangle w_{hj}=\eta g_jb_h\tag{5.11} △whj=ηgjbh(5.11)
类似可得:
△ θ j = − η g j (5.12) \triangle\theta_j=-\eta g_j\tag{5.12} △θj=−ηgj(5.12)
△ v i h = η e h x i (5.13) \triangle v_{ih}=\eta e_hx_i\tag{5.13} △vih=ηehxi(5.13)
△ γ h = − η e h (5.14) \triangle\gamma_h=-\eta e_h\tag{5.14} △γh=−ηeh(5.14)
式 5.13 和 5.14 中:
e h = − ∂ E k ∂ b h ⋅ ∂ b h ∂ α h = − ∑ j = 1 l ∂ E k ∂ β j ⋅ ∂ β j ∂ b h f ′ ( α h − γ h ) = ∑ j = 1 l w h j g j f ′ ( α h − γ h ) = b h ( 1 − b h ) ∑ j = 1 l w h j g j (5.15) 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}^lw_{hj}g_jf'(\alpha_h-\gamma_h)\\=b_h(1-b_h)\sum_{j=1}^lw_{hj}g_j\tag{5.15} eh=−∂bh∂Ek⋅∂αh∂bh=−j=1∑l∂βj∂Ek⋅∂bh∂βjf′(αh−γh)=j=1∑lwhjgjf′(αh−γh)=bh(1−bh)j=1∑lwhjgj(5.15)
学习率 η ∈ ( 0 , 1 ) \eta\in(0,1) η∈(0,1) 控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。在精细调解过程中,可令式 5.11 和 5.12 中的学习率不同,BP 算法的工作流程如下:
需要注意的是,BP 算法的目标是要最小化训练集 D D D 上的累计误差:
E = 1 m ∑ k = 1 m E k E=\frac{1}{m}\sum_{k=1}^mE_k E=m1k=1∑mEk
但是“标准的BP算法”每次仅针对一个训练样例更新连接权和阈值,也就是说上图中的算法更新规则是基于单个 E k E_k Ek 推导得到的。如果类似地推导出基于累计误差最小化的更新规则,就得到了累计误差逆传播算法(accumulated error backpropagation)。累计 BP 算法与标准 BP 算法都很常用。
一般来说,标准 BP 算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能相互抵消。因此为了达到同样的效果,标准 BP 算法往往需要进行更多次数的迭代。累计 BP 算法直接针对累计误差最小化,它在读取整个训练集 D D D 一遍后才对参数进行更新,其参数更新的频率较低,但是当累计误差下降到一定程度之后,进一步下降会非常缓慢,此时标准 BP 往往可以更快获得更好的解,尤其是在大样本数据的情况下。
有人已经证明,只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数,但是如何设置隐层神经元个数仍然没有定论,实际中常常采用试错法(trial-by-error)。
由于 BP 强大的表示能力,因此经常遭遇过拟合现象。为解决这个问题,一种策略是早停(early stopping):将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。第二种策略是正则化(regularization):在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。仍令 E k E_k Ek 表示第 k k k 个训练样例上的误差, w i w_i wi 表示连接权和阈值,则误差目标函数变为:
E = λ 1 m ∑ k = 1 m E k + ( 1 − λ ) ∑ i w i 2 E=\lambda\frac{1}{m}\sum_{k=1}^mE_k+(1-\lambda)\sum_iw_i^2 E=λm1k=1∑mEk+(1−λ)i∑wi2
其中 λ ∈ ( 0 , 1 ) \lambda\in(0,1) λ∈(0,1) 用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。
四、全局最小与局部极小
实际上 BP 的优化目标即为寻找一组最优参数使得 E E E 最小,在求解过程中会遇到两种“最优”:局部最优(local minimum) 和全局最优(global minimum)。对 w ∗ w^* w∗ 和 θ ∗ \theta^* θ∗ ,若存在 ϵ > 0 \epsilon>0 ϵ>0 使得:
∀ ( w ; θ ) ∈ { ( w ; θ ) ∣ ∥ ( w ; θ ) − ( w ∗ ; θ ∗ ) ∥ ≤ ϵ } \forall(w;\theta)\in\left\{(w;\theta)\mid\parallel(w;\theta)-(w^*;\theta^*)\parallel\le\epsilon\right\} ∀(w;θ)∈{(w;θ)∣∥(w;θ)−(w∗;θ∗)∥≤ϵ}
都有 E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) E(w;\theta)\ge E(w^*;\theta^*) E(w;θ)≥E(w∗;θ∗) 成立,则 ( w ∗ ; θ ∗ ) (w^*;\theta^*) (w∗;θ∗) 为局部极小解;弱队参数空间中的任意 ( w ; θ ) (w;\theta) (w;θ) 都有 E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) E(w;\theta)\ge E(w^*;\theta^*) E(w;θ)≥E(w∗;θ∗) ,则 ( w ∗ ; θ ∗ ) (w^*;\theta^*) (w∗;θ∗) 为全局最小解。
基于梯度的搜索是使用最为广泛的参数寻优方法。在此类方法中,从某些初始解出发,迭代寻找最优参数值。每次迭代中,首先计算误差函数在当前点的梯度;然后根据负梯度的方向搜索;若误差函数在当前点的梯度为零,则已达到局部极小,更新量将为零。
在实际任务中,为跳出局部极小从而接近全局最小,可以采用以下策略“
- 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。
- 模拟退火(simulated annealing):在每一步都以一定的概率接收比当前解更差的结果,迭代过程中,接收次优解的概率要逐渐降低,从而保证算法稳定。
- 使用随机梯度下降:随机梯度下降在计算梯度时加入了随机因素,因此即便在局部极小点,所计算的梯度可能不为零,因此有助于跳出局部极小继续搜索。
- 遗传算法(genetic algorithms)
五、深度学习
对神经网络模型,提高容量(capacity) 的一个简单方法是增加隐层数目。虽然单隐层的多层前馈网络已具有强大的学习能力,但从复杂度的角度来看,增加隐层数目更有效。因为增加隐层数不尽增加了拥有激活函数的神经元数目,还增加了激活函数嵌套的层数。然而多因曾神经网络难以直接用经典算法进行训练,因为误差在多隐层内逆传播时,往往会发散(diverge) 而不能收敛到稳定状态。
无监督逐层训练(unsupervised layer-wise training) 是多隐层网络训练的有效手段,其基本思想是每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为预训练(pre-training);在预训练全部完成后,在对整个网络进行微调(fine-tuning)。
预训练与微调的做法可以看作将大量参数分组,对每组先找到局部来看比较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优。这样就在利用了模型大量参数所提供的自由度的同时,有效地节省了训练开销。
另一种策略是权共享(weight sharing),即让一组神经元使用相同的连接权。这个策略在卷积神经网络(Convolutional Neural Network, CNN) 中发挥很大的作用。
通俗来看,深度学习实际上就是将低层的特征转化为高层特征后,用简单模型来完成分类等学习任务。由此可将深度学习理解为进行特征学习(feature learning) 或表示学习(representation learning)。