文章目录
1、神经元模型
神经网络方面的研究很早就已经出现,现如今神经网络已是一个相当大的、多学科交叉的学科领域。对神经网络的定义多种多样,我们采用“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反映”这一说法。
神经网络中最基本的成分是神经元模型:
神经元接受到n个来自其他神经元的输入信号,每个信号都带有一定的权重,神经元接收到的总输入值与神经元的阈值进行对比,然后通过“激活函数”处理以产生神经元的输出。
理想中的激活函数是阶跃函数,它将输入值映射为输出值0或1,值为1时,神经元兴奋,但阶跃函数不连续,不光滑,因此实际中常用
S
i
g
m
o
i
d
Sigmoid
Sigmoid函数作为激活函数,它可以将在较大范围变化的输入值挤压到(0,1)范围内,因此也称为“挤压函数”。
把许多这样的神经元按一定的层次结构连接起来,就得到了神经网络。
2、感知机与多层网络
感知机由两层神经元组成,输入层接受外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”,感知机能实现逻辑或、与、非运算。
y
=
f
(
∑
i
w
i
x
i
−
θ
)
y=f(\sum_iw_ix_i-\theta)
y=f(∑iwixi−θ),假设
f
f
f是阶跃函数,
- 假设 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*x_1+1*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,这样,我们就可以实现与操作。
- “或”,令 w 1 = w 2 = 1 , θ = 0.5 w_1=w_2=1,\theta=0.5 w1=w2=1,θ=0.5,就可以实现或操作了,当 x 1 = 1 或 x 2 = 1 x_1=1或x_2=1 x1=1或x2=1时, y = 1 y=1 y=1。
- “非”,令 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,我们就可以实现非操作,当 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
w_i
wi以及阈值
θ
\theta
θ可通过学习得到,可以将阈值
θ
\theta
θ看作输入值固定为
−
1.0
-1.0
−1.0的结点上的权重
w
n
+
1
w_{n+1}
wn+1。对训练样例
(
x
,
y
)
(x,y)
(x,y),若当前感知机的输出为
y
^
\hat y
y^,则调整感知机的权重为
w
i
←
w
i
+
Δ
w
i
,
w_i\leftarrow w_i+\Delta w_i,
wi←wi+Δwi,
Δ
w
i
=
η
(
y
−
y
^
)
x
i
\Delta w_i=\eta(y-\hat y)x_i
Δwi=η(y−y^)xi其中,
η
\eta
η称为学习率,其范围为
(
0
,
1
)
(0,1)
(0,1)。若感知机预测正确,即
y
^
=
y
\hat y=y
y^=y,则不对感知机进行调整。
感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,导致它只能处理一些简单的线性可分问题,如上图最后一个异或问题它就无法解决。要解决非线性问题,就要用到多层功能神经元,如上面的异或问题用两层感知机就能解决。在输入层与输出层之间新增一层神经元,该层被称为隐层或隐含层。隐含层与输出层均是具有激活函数的功能神经元。
常见的神经网络如上图所示,每层神经元与下一层神经元完全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络结构通常被称为“多岑和前馈神经网络”,输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出。
3、误差逆传播算法
多层网络的学习能力比单层感知机强得多,在训练多层网络时,我们需要更强大的学习算法,误差逆传播算法(BP)就是其中的最杰出的代表。下面来具体了解一下它。
给定训练集
D
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
…
,
(
x
m
,
y
m
)
D=(x_1,y_1),(x_2,y_2),……,(x_m,y_m)
D=(x1,y1),(x2,y2),……,(xm,ym)每个输入示例由d个属性描述,输出l维实值向量。如下图:
可以看出,输入神经元有d个,输出神经元有l个,隐层神经元有q个,定义输出层第j个神经元的阈值为
θ
j
\theta_j
θj,隐层第h个神经元的阈值用
γ
h
\gamma_h
γh表示,输入层第i个神经元与隐层第h个神经元的连接权为
v
i
h
v_{ih}
vih,隐层第h个神经元与输出层第j个神经元之间的连接权为
w
h
j
w_{hj}
whj。则隐层第h个神经元接收到的输入为
α
h
=
∑
i
=
1
d
v
i
h
x
i
\alpha_h=\sum_{i=1}^{d}v_{ih}x_i
αh=∑i=1dvihxi输出层第j个神经元接受到的输入为
β
j
=
∑
h
=
1
q
w
h
j
b
h
\beta_j=\sum_{h=1}^{q}w_{hj}b_h
βj=∑h=1qwhjbh,其中
b
h
b_h
bh为隐层第h个神经元的输出。假设隐层和输出层的激活函数均为
S
i
g
m
o
i
d
Sigmoid
Sigmoid函数。
因为神经网络的输出
y
=
f
(
∑
i
w
i
x
i
−
θ
)
y=f(\sum_iw_ix_i-\theta)
y=f(∑iwixi−θ),假设此神经网络的输出
y
^
j
k
=
f
(
β
j
−
θ
j
)
\hat y_j^k=f(\beta_j-\theta_j)
y^jk=f(βj−θj)则神经网络在
(
x
k
,
y
k
)
(x_k,y_k)
(xk,yk)上的均方误差为
E
k
=
1
2
∑
j
=
1
l
(
y
^
j
k
−
y
j
k
)
2
E_k=\frac{1}{2}\sum\limits_{j=1}^{l}(\hat y_j^k-y_j^k)^2
Ek=21j=1∑l(y^jk−yjk)2
那怎么计算网络中的权重、阈值等参数呢?
以隐层到输出层的连接权 w h j w_{hj} whj为例,若误差为 E k E_k Ek,给定学习率 η \eta η,则 Δ w h j = − η ∂ E k ∂ w h j \Delta w_{hj}=-\eta\frac{ \partial E_k}{ \partial w_{hj}} Δwhj=−η∂whj∂Ek可以看出, w h j w_{hj} whj先影响输出层神经元的输入值继而影响其输出,故 ∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ∗ ∂ y ^ j k ∂ β j ∗ ∂ β j ∂ w h j \frac{ \partial E_k}{ \partial w_{hj}}=\frac{ \partial E_k}{ \partial \hat y_j^k}*\frac{ \partial \hat y_j^k}{ \partial \beta_j}*\frac{ \partial \beta_j}{ \partial w_{hj}} ∂whj∂Ek=∂y^jk∂Ek∗∂βj∂y^jk∗∂whj∂βj因为 E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 E_k=\frac{1}{2}\sum\limits_{j=1}^{l}(\hat y_j^k-y_j^k)^2 Ek=21j=1∑l(y^jk−yjk)2,故可以求得 ∂ E k ∂ y ^ j k = y ^ j k − y j k \frac{ \partial E_k}{ \partial \hat y_j^k}=\hat y_j^k-y_j^k ∂y^jk∂Ek=y^jk−yjk又 β j = ∑ h = 1 q w h j b h \beta_j=\sum_{h=1}^{q}w_{hj}b_h βj=∑h=1qwhjbh,因此 ∂ β j ∂ w h j = b h \frac{ \partial \beta_j}{ \partial w_{hj}}=b_h ∂whj∂βj=bh对于Sigmoid函数,它有一个很好的性质 f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f^{'}(x)=f(x)(1-f(x)) f′(x)=f(x)(1−f(x))于是 ∂ y ^ j k ∂ β j = f ′ ( β j − θ j ) = f ( β j − θ j ) ( 1 − f ( β j − θ j ) ) = y ^ j k ( 1 − y j k ) \frac{ \partial \hat y_j^k}{ \partial \beta_j}=f^{'}(\beta_j-\theta_j)=f(\beta_j-\theta_j)(1-f(\beta_j-\theta_j))=\hat y_j^k(1-y_j^k) ∂βj∂y^jk=f′(βj−θj)=f(βj−θj)(1−f(βj−θj))=y^jk(1−yjk)最终我们可以求出 Δ w h j = η ( y ^ j k − y j k ) y ^ j k ( 1 − y j k ) b h \Delta w_{hj}=\eta (\hat y_j^k-y_j^k)\hat y_j^k(1-y_j^k)b_h Δwhj=η(y^jk−yjk)y^jk(1−yjk)bh类似地,可以求出 Δ θ j = − η ( y ^ j k − y j k ) y ^ j k ( 1 − y j k ) \Delta \theta_j=-\eta(\hat y_j^k-y_j^k)\hat y_j^k(1-y_j^k) Δθj=−η(y^jk−yjk)y^jk(1−yjk) Δ v i h = η b h ( 1 − b h ) ∑ j = 1 l w h j ( y ^ j k − y j k ) y ^ j k ( 1 − y j k ) x i \Delta v_{ih}=\eta b_h(1-b_h)\sum\limits_{j=1}^{l}w_{hj}(\hat y_j^k-y_j^k)\hat y_j^k(1-y_j^k)x_i Δvih=ηbh(1−bh)j=1∑lwhj(y^jk−yjk)y^jk(1−yjk)xi Δ γ h = − η b h ( 1 − b h ) ∑ j = 1 l w h j ( y ^ j k − y j k ) y ^ j k ( 1 − y j k ) \Delta\gamma_h=-\eta b_h(1-b_h)\sum\limits_{j=1}^{l}w_{hj}(\hat y_j^k-y_j^k)\hat y_j^k(1-y_j^k) Δγh=−ηbh(1−bh)j=1∑lwhj(y^jk−yjk)y^jk(1−yjk)学习率控制着算法每一轮迭代的更新步长,太大容易震荡,太小则收敛速度又会过慢。在做精细调节的时,上面各式可以使用不同的 η \eta η值。
BP算法的具体工作流程为:将输入示例传给输入层神经元,逐层传递直到产生输出结果,然后计算误差,再将误差逆向传播至隐层神经元,最后根据隐层神经元的误差对连接权和阈值进行调整,不断重复上述过程,直到达到我们的需求。
BP算法的目标是最小化训练集上的累计误差,但上面介绍的"标准BP算法"每次只针对一个训练样例更新连接权和阈值,如果类似地推导出基于累计误差最小化的更新规则,就得到了累计误差逆传播算法。标准BP算法只针对一个样例,参数更新地非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象。为达到累计误差最小点,标准BP算法往往需要进行更多次数的迭代。累计BP算法直接对累计误差求最小,在读取整个训练集D一遍后才对参数进行更新,更新频率低的多,但在很多任务中,累计误差下降到一定程度后,进一步下降会非常缓慢,这时标准BP往往会更快获得较好的解。
4、全局最小与局部极小
若用E表示神经网络在训练集上的误差,则它显然是关于连接权
w
w
w和阈值
θ
\theta
θ的函数。此时,神经网络的训练过程可看作一个参数寻优过程,即在参数空间中寻找一组最优参数使得E最小。
“最优”有两种:局部极小和全局最小。对
w
∗
w^*
w∗和
θ
∗
\theta^*
θ∗,若存在
ε
\varepsilon
ε使得任意
(
w
,
θ
)
∈
(w,\theta)\in
(w,θ)∈{
∣
∣
(
w
;
θ
)
−
(
w
∗
;
θ
∗
)
∣
∣
≤
ε
||(w;\theta)-(w^*;\theta^*)|| \leq\varepsilon
∣∣(w;θ)−(w∗;θ∗)∣∣≤ε},都有
E
(
w
;
θ
)
≥
E
(
w
∗
;
θ
∗
)
E(w;\theta) \geq E(w^*;\theta^*)
E(w;θ)≥E(w∗;θ∗)成立,则
(
w
∗
;
θ
∗
)
(w^*;\theta^*)
(w∗;θ∗)为局部极小解;若对参数空间中的任意
(
w
;
θ
)
(w;\theta)
(w;θ)都有
E
(
w
;
θ
)
≥
E
(
w
∗
;
θ
∗
)
E(w;\theta) \geq E(w^*;\theta^*)
E(w;θ)≥E(w∗;θ∗)则
(
w
∗
;
θ
∗
)
(w^*;\theta^*)
(w∗;θ∗)为全局最小解。很明显,全局最小一定是局部极小,我们在寻优过程中希望找到全局最小点。
基于梯度的搜索时使用最为广泛的参数寻优方法,在此类方法中,我们先设定一个初始点,计算误差函数在当前点的梯度,然后寻找下降最快的方向,不停地重复这一操作,直到当前点的梯度为零,这样我们就找到了一个局部极小值。当只有一个局部极小时,它就是我们要找的全局最小,但当误差函数有多个局部极小时,我们称参数寻优陷入了局部极小,很明显,我们无法找到全局最小了,这显然不是我们希望的。
在现实任务中,常采用以下策略来“跳出”局部极小:
- 采用多个不同的初始值,取误差最小的作为最终参数,这可以使我们的结果更接近全局最小。
- 采用模拟退火算法,每一次搜索时都设定一定的概率接受更差的结果,比如我们要下山,每一次都有一定的概率向上走,帮助我们来跳出局部极小。
- 使用随机梯度下降,每次只从训练集中选取一个样本来进行学习,这样即使陷入了局部极小点,我们仍有机会向全局最小点的方向前进。
要注意的是,上面这些技术大多具有一定的缺点,如模拟退火算法,在帮助我们跳出局部极小的同时可能造成跳出全局最小。
5、其他常见神经网络
5.1 RBF网络
RBF神将网络是一种三层神经网络,其包括输入层、隐层、输出层。从输入空间到隐层空间的变换是非线性的,而从隐层空间到输出层空间变换是线性的。
它使用径向基函数作为隐层神经元激活函数,假设输入为d维向量
x
i
x_i
xi,则RBF网络可表示为
ϕ
(
x
)
=
∑
i
=
1
q
w
i
ρ
(
x
,
c
i
)
\phi(x)=\sum\limits_{i=1}^{q}w_i\rho(x,c_i)
ϕ(x)=i=1∑qwiρ(x,ci)
ρ
(
x
,
c
i
)
\rho(x,c_i)
ρ(x,ci)是径向基函数,径向基函数是一个取值仅仅依赖于离原点距离的实值函数,也就是
Φ
(
x
)
=
Φ
(
‖
x
‖
)
Φ(x)=Φ(‖x‖)
Φ(x)=Φ(‖x‖),或者还可以是到任意一点c的距离,c点称为中心点,也就是
Φ
(
x
,
c
)
=
Φ
(
‖
x
−
c
‖
)
Φ(x,c)=Φ(‖x-c‖)
Φ(x,c)=Φ(‖x−c‖)。任意一个满足
Φ
(
x
)
=
Φ
(
‖
x
‖
)
Φ(x)=Φ(‖x‖)
Φ(x)=Φ(‖x‖)特性的函数
Φ
Φ
Φ都叫做径向基函数,常用的高斯径向基函数形如
ρ
(
x
,
c
i
)
=
e
−
β
i
∣
∣
x
−
c
i
∣
∣
2
\rho(x,c_i)=e^{-\beta_i||x-c_i||^2}
ρ(x,ci)=e−βi∣∣x−ci∣∣2训练RBF网络的过程主要有两步:确定神经元中心,然后利用BP算法等来确定算法参数
w
i
w_i
wi和
β
i
\beta_i
βi.
5.2 ART网络
竞争型学习是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出网络元相互竞争,每个时刻仅有一个竞争获取的神经元被激活,其他神经元的状态被抑制。这种机制亦称“胜者通吃”原则。
ART网络是竞争型学习的重要代表。该网络由比较层C、识别层R、识别阈值和重置模块构成。其网络结构如图所示:
其中,比较层负责接收输入样本,并将其传递给识别层神经元。识别层每个神经元对应一个模式类,神经元数目可在训练过程中动态增长以增加新的模式类。
在接收到比较层的输入信号后,识别层神经元之间相互竞争以产生获胜神经元。竞争的最简单方式是,计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者胜。获胜神经元将向其他识别层神经元发送信号,抑制其激活。若输入向量与获胜神经元所对应的代表向量之间的相似度大于识别阈值,则当前输入样本将被归为该代表向量所属类别;若相似度不大于识别阈值,则重置模块将在识别层增设一个新的神经元,其代表向量就设置为当前输入向量。
显然,识别阈值对ART网络的性能有重要影响。当识别阈值较高时,输入样本将会被分成的模式类就比较多,类内的样本相似度较高,而如果识别阈值较低,则产生的模式类就会比较少、比较粗略。
5.3 SOM网络
SOM网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间,同时保持输入数据在高维空间的拓扑结构。
如上图所示,SOM网络中的输出层神经元以矩阵方式排列在二维空间中,每个神经元都都拥有一个权向量,网络在接收输入向量后,将会确定输出层获胜神经元,它决定了该输入向量在低维空间中的位置。SOM神经网络训练的目的就是为每个输出层神经元找到合适的权向量,以达到保持拓扑结构的目的。SOM的训练过程其实很简单,就是接收到一个训练样本后,每个输出层神经元都会计算该样本与自身携带的权向量之间的距离,距离短者获胜,然后获胜的神经元及其邻近神经元的权向量将会进行调整,以使得这些权向量与当前输入样本的距离缩小。
5.4 级联相关网络
一般的神经网络通常已经事先设定好网络结构,训练过程只需确定连接权、阈值等参数即可,但结构自适应网络先从一个小网络开始,自动训练和添加隐含单元,最终形成一个多层的结构。
具体的步骤如下:
在开始训练时,网络只有输入层和输出层,随着训练的进行,新的隐层神经元加入,候选神经元连结到所有其他的输入和隐含神经元,其他权重不变,只训练候选神经元的连接权,训练完成后连接输出层神经元,然后训练所有输出连接权。
5.5 Elman网络
递归神经网络允许网络中出现环形结构,可以让一些神经元的输出反馈回来作为输入信号,这样的结构使得网络的输出不仅与输入有关,还与上一时刻的输出有关。
Elman网络是最常用的递归神经网络之一,其结构如下图:
其输入层、隐层和输出层的连接类似于前馈网络,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起作为隐层神经元下一时刻的输入。输入层的单元仅起到信号传输作用,输出层单元起到加权作用。隐层单元的激励函数一般取Signmoid非线性函数,训练算法通常为BP算法。
5.6 Boltzmann机
神经网络中有一类模型是为网络状态定义一个能量,能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。Boltzmann机就是一种“基于能量的模型”,常见结构如下图所示:
神经元分为两层:显层与隐层。显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。在Boltzmann机中,神经元是布尔型的,只能取0、1两种状态,1表示激活,0表示抑制。令向量
s
∈
(
0
,
1
)
n
s\in(0,1)^n
s∈(0,1)n表示n个神经的状态
w
i
j
w_{ij}
wij表示神经元i与j之间的连接权,
θ
i
\theta_i
θi表示神经元i的阈值。则向量
s
s
s所对应的Boltzmann机能量定义为
E
(
s
)
=
−
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
w
i
j
s
i
s
j
−
∑
i
=
1
n
θ
i
s
i
E(s)=-\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n}w_{ij}s_is_j-\sum\limits_{i=1}^{n}\theta_is_i
E(s)=−i=1∑n−1j=i+1∑nwijsisj−i=1∑nθisi若网络中的神经元以任意不依赖于输入值的顺序进行更新,则网络最终将达到平稳分布,此时状态向量
s
s
s出现的概率为
P
(
s
)
=
e
−
E
(
s
)
∑
t
e
−
E
(
t
)
P(s)=\frac{e^{-E(s)}}{\sum_te^{-E (t)}}
P(s)=∑te−E(t)e−E(s)Boltzmann机的训练目标就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。标准的Boltzmann机是一个全连接图,训练复杂度很高,难以用来解决现实任务,现实中常采用受限Boltzmann机。
受限Boltzmann机常用“对比散度”算法来进行训练,假设网络中有d个显层神经元和q个隐层神经元,
v
v
v和
h
h
h分别为显层和隐层的状态向量,则对每个训练样本
v
v
v,根据式
P
(
h
∣
v
)
=
∏
j
=
1
q
P
(
h
j
∣
v
)
P(h|v)=\prod_{j=1}^{q}P(h_j|v)
P(h∣v)=j=1∏qP(hj∣v)计算出隐层神经元的激活概率,然后再根据这个概率分布采样得出
h
h
h,然后根据式
P
(
v
∣
h
)
=
∏
i
=
1
d
P
(
v
i
∣
h
)
P(v|h)=\prod_{i=1}^{d}P(v_i|h)
P(v∣h)=i=1∏dP(vi∣h)反计算显层,记为
v
2
v_2
v2,再根据
v
2
v_2
v2计算
h
2
h_2
h2。连接权的更新为
Δ
w
=
η
(
v
h
T
−
v
2
h
2
T
)
\Delta w=\eta(vh^T-v_2h_2^T)
Δw=η(vhT−v2h2T)
6、深度学习
典型的深度学习就是很深层的神经网络,对神经网络模型,提高容量的一个简单且有效的方法是增加隐层的数目。和增加神经元数目相比,增加隐层数目不仅增加了神经元数目,还增加了激活函数嵌套的层数。然而,多层的神经网络难以直接用经典算法进行训练,误差在多隐层内逆传播时,往往会发散而不能收敛到稳定状态。
无监督逐层训练是多隐层网络训练的有效手段,每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为“预训练",在云训练全部完成后,再对整个网络进行”微调“。预训练+微调的做法可以理解为先将大量参数分组,对每组先找到局部比较好的设置,然后将这些结果联合起来进行全局寻优。另一种节省训练开销的方式是“权共享”,让一组神经元使用共同的连接权。这种方法在卷积神经网络中发挥了重要作用,
总的来说,深度学习是对输入信号进行逐层加工,把初始的、与输出目标之间联系不太密切的输入表示转化成与输入目标联系更密切的表示,通过多层处理,将初始的“低层”特征表示转化为“高层”特征表示后,用简单模型即可完成复杂的分类等学习任务。