周志华-机器学习-笔记(四)- 神经网络

神经元模型

  神经网络中最基本的成分是神经元(neuron)模型。在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”(threshold),那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物资。
这里写图片描述
  图5.1所示的简单模型就是沿用至今的“M-P神经元模型”。在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到总输入值将与神经元的阈值进行比较,然后通过“激活函数”(activation function)处理以产生神经元的输出。
  阶跃函数是理想的激活函数,它将输出值映射为输出值“0”或“1”,“1”对应与神经元兴奋,“0”对应于神经元抑制。但阶跃函数具有不连续、不光滑等不太好的性质,因此常用Sigmoid函数作为激活函数,如下图:
这里写图片描述
  把许多这样的神经元按一定的层次结构连接起来,就得到了神经网络。

感知机与多层网络

  感知机(Perceptron)由两层神经元组成,如图5.3所示。输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic unit)。
这里写图片描述
  给定训练数据集,权重 wi(i=1,2,...,n) w i ( i = 1 , 2 , . . . , n ) 以及阈值 θ θ 都可以通过学习得到。我们把阈值 θ θ 也看做神经元的一个固定输入为 1.0 − 1.0 的“哑结点”(dummy node),其所对应的连接权重为 wn+1 w n + 1 ,这样,权重和阈值的学习就可以统一为权重的学习(因为实际阈值是 1.0×wn+1 − 1.0 × w n + 1 )。
  感知机的学习规则:对训练样例 (x,y) ( x , y ) ,若当前感知机的输出为 y^ y ^ ,则感知机权重将这样调整:

wiwi+Δwi w i ← w i + Δ w i
Δwi=η(yy^)xi Δ w i = η ( y − y ^ ) x i
其中 η(0,1) η ∈ ( 0 , 1 ) 称为学习率(learning rate)。 η η 通常设置为一个小正数,例如 0.1 0.1 。当预测正确时,感知机不发生变化,否则将根据错误的程度进行权重调整。
  若我们需要解决的问题是线性可分问题(linearly separable),就会存在一个线性超平面能将它们分开,如图5.4(a)-(c)所示,则感知机的学习过程一定会收敛(converge),从而求得适当的权重向量 w=(w1;w2;...;wn+1) w = ( w 1 ; w 2 ; . . . ; w n + 1 ) ,否则感知机学习过程将会发生振荡(fluctuation)。如图5.4(d)的非线性可分问题。
   这里写图片描述
   要解决非线性可分问题,需考虑使用多层功能神经元。如图5.5中两层感知机解决异或问题。
   这里写图片描述
  这里的输入层和输出层之间的一层神经元,被称为隐层或隐含层(hidden layer),隐含层和输出层神经元都是拥有激活函数的功能神经元。
   这里写图片描述
  我们常见的神经网络是如图5.6所示的层级结构,每层神经元与下一层神经元全互连,神经元枝江不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feed forward neural network)。由于输入层神经元仅是接受输入,不进行函数处理,隐层与输出层包含功能神经元。因此,通常被称为“两层网络”,或“单隐层网络”。
   神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”(connection weight)以及每个功能神经元的阈值。

误差逆传播算法

  欲训练多层神经网络,上述的简单感知机学习规则显然不够,我们需要更强大的学习算法。误差逆传播(error BackPropagation,简称BP)算法就是一种杰出的神经网络学习算法。
  有训练集 D={(x1,y1),(x2,y2),...,(xm,ym)},xiRd,yiRl D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , x i ∈ R d , y i ∈ R l ,即输入示例由 d d 个属性描述,输出l维实值向量。
这里写图片描述
  如图5.7是一个拥有 d d 个输入神经元、l个输出神经元、 q q 个隐层神经元的多层前馈网络结构。其中输出层第j个神经元的阈值用 θj θ j 表示,隐层第 h h 个神经元的阈值用γh;输入层第 i i 个神经元与隐层第h个神经元之间的连接权为 vih v i h ,隐层第 h h 个神经元与输出层第j个神经元之间的连接权为 whj w h j ;记隐层第 h h 个神经元接收到的输入为αh=i=1dxihxi,输出层第 j j 个神经元接收到的输入为βj=h=1qwhjbh bh b h 为隐层第 h h 个神经元的输出。并假设隐层和输出层神经元都使用图5.2(b)中的Sigmoid函数。
  对训练例(xk,yk),假定神经网络的输出为 yk^=(yk1^,yk2^,...,ykl^) y k ^ = ( y 1 k ^ , y 2 k ^ , . . . , y l k ^ ) ,即

ykj^=f(βjθj)(5.3) (5.3) y j k ^ = f ( β j − θ j )
,则网络 (xk,yk) ( x k , y k ) 上的均方误差为
Ek=12j=1l(ykj^ykj)2(5.4) (5.4) E k = 1 2 ∑ j = 1 l ( y j k ^ − y j k ) 2
(这里的 12 1 2 是为了后续的求导便利)
  图5.7的网络中有 d×q+l×q+q+l d × q + l × q + q + l 个参数需确定。
  
   下面我们以图5.7中隐层到输出层的连接权 whj w h j 为例进行推导。
  BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向(函数值下降最快)对参数进行调整。对式(5.4)的误差 Ek E k ,给定学习率 η η ,有
Δwhj=ηEkwhj(5.6) (5.6) Δ w h j = − η ∂ E k ∂ w h j

注意到 whj w h j 先影响到第 j j 个输出层神经元的输入值βj,再影响到其输出值 y^kj y ^ j k ,然后影响到 Ek E k ,有
Ekwhj=Eky^kjy^kjβjβjwhj(5.7) (5.7) ∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j

  根据 βj=qh=1whjbh β j = ∑ h = 1 q w h j b h ,有
βjwhj=bh(5.8) (5.8) ∂ β j ∂ w h j = b h

  图5.2中的Sigmoid函数有一个很好的性质:
f(x)=f(x)(1f(x))(5.9) (5.9) f ′ ( x ) = f ( x ) ( 1 − f ( x ) )

于是根据式(5.4)和(5.3),有
gj=Eky^kjy^kjβj=(y^kjykj)f(βjθj)=y^kj(1y^kj)(ykjy^kj)(5.10) (5.10) 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)和(5.8)代入(5.7),再代入式(5.6),就得到了BP算法中关于 whj w h j 的更新公式
Δwhj=ηgjbh(5.11) (5.11) Δ w h j = η g j b h

  类似可得
Δθj=ηgj(5.12) (5.12) Δ θ j = − η g j
Δvih=ηehxi(5.13) (5.13) Δ v i h = η e h x i
Δγh=ηeh(5.14) (5.14) Δ γ h = − η e h

式(5.13)和(5.14)中
eh=Ekbhbhαh=j=1lEkβjβjbhf(αhγh)=j=1lwhjgjf(αhγh)=bh(1bh)j=1lwhjgj 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

  学习率 η(0,1) η ∈ ( 0 , 1 ) 控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。有时为了做精细调节,可令式(5.11)与(5.12)使用 η1 η 1 ,式(5.13)与(5.14)使用 η2 η 2 ,两者未必相等。
   BP算法的工作流程如图5.8所示:
这里写图片描述
  先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差(第4-5行),在将误差逆向传播至隐层神经元(第6行),最后根据隐层神经元的误差来对神经元的误差来对连接权和阈值进行调整(第7行)。直到到达某些停止条件为止,例如训练误差已达到一个很小的值。
   BP算法的目标是要最小化训练集 D D 上的积累误差
(5.16)E=1mk=1mEk

  图5.8的“标准BP算法”每次仅针对一个训练样例更新连接权和阈值,参数更新得非常频繁,而且对于不同的样例进行更新的效果可能出现“抵消”现象。积累BP算法直接针对积累误差最小化,它在读取整个训练集D一遍后才对参数进行更新。但在很多任务中,积累误差下降到一定程度后,进一步下降就非常缓慢,这是标准BP往往会更快获得较好的解,尤其是在训练集 D D 非常大时更明显。
  BP神经网络经常遭遇过拟合,此处有两种策略常用来缓解BP网络的过拟合。第一种是“早停”(early stop):将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。第二种是“正则化”(regularization):基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权和阈值的平方和。仍令Ek表示第k个训练样例上的误差, wi w i 表示连接权和阈值,则误差目标函数(5.16)可以表示为
E=λ1mk=1mEk+(1λ)iw2i E = λ 1 m ∑ k = 1 m E k + ( 1 − λ ) ∑ i w i 2
其中 λ(0,1) λ ∈ ( 0 , 1 ) 用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。

全局最小与局部极小

  若令 E E 代表神经网络在训练集上的误差,并且是关于连接权w和阈值 θ θ 的函数。那么,在神经网络训练过程可以看作寻找一组最优参数使得 E E 最小。“局部极小”(local minimum)和”全局最小“(global minimum)是我们常会提到的两种“最优”。
  局部极小:对应二维曲线中的极小值点。
  在神经网络中表示为,对w θ θ ∗ ,若存在 ϵ>0 ϵ > 0 使得

(w;θ){(w;θ)|||(w;θ)(w;θ)||ϵ} ∀ ( w ; θ ) ∈ { ( w ; θ ) | | | ( w ; θ ) − ( w ∗ ; θ ∗ ) | | ≤ ϵ }
都有 E(w;θ)E(w;θ) E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) 成立,则 (w;θ) ( w ∗ ; θ ∗ ) 为局部极小解。
   全局最小:对应二维曲线中的最小值点。
  在神经网络中表示为,若对参数空间中的任意 (w;θ) ( w ; θ ) 都有 E(w;θ)E(w;θ) E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) ,则 (w;θ) ( w ∗ ; θ ∗ ) 为全局最小解。
这里写图片描述
  在现实任务中,我们希望参数是全局最小而非局部极小。基于梯度的搜索是使用最为广泛的参数寻优方法。在此类方法中,我们从某些初始解出发,往负梯度方向迭代寻找最优参数值。若误差函数仅有一个局部极小,那么该局部极小就是全局最小;然而,若误差函数具有多个局部极小,则不能保证找到的解是全局最小。
  以下策略常用于“跳出”局部极小,进一步接近全局最小。但这些技术大多是启发式,理论上尚缺乏保障:

  • 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。这相当于从多个不同的初始点开始搜索,这样可能陷入不同的局部极小,从中选择有可能接近全局最小的结果。

  • 使用“模拟退火”(simulated
    annealing)技术。模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。

  • 使用随即梯度下降。随机梯度下降法在计算梯度时加入了随机因素。于是,即便陷入局部极小点,他计算出的梯度仍可能不为零,这样有机会跳出局部极小继续搜索。

  • 遗传算法(genetic algorithms)。

其他常见神经网络
RBF网络

  RBF(Radial Basis Function,径向基函数)网络是一种单隐层前馈神经网络,它使用径向基函数隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。
  假定输入为 d d 维向量x,输出为实值,则RBF网络可表示为

φ(x)=i=1qwiρ(x,ci) φ ( x ) = ∑ i = 1 q w i ρ ( x , c i )
其中 q q 为隐层神经元个数,ci wi w i 分别是第 i i 个隐层神经元所对应的中心和权重,ρ(x,ci)是径向基函数,这是某种沿径向对称的标量函数,通常定义为样本 x x 到数据中心ci之间欧氏距离的单调函数。常用的高斯径向基函数如
ρ(x,ci)=eβ||xci||2 ρ ( x , c i ) = e − β | | x − c i | | 2
具有足够多隐层神经元的RBF网络能以任意精度逼近任意连续函数。
  通常采用两步过程来训练RBF网络:第一步,确定神经元中心 ci c i ,常用的方式包括随即采样、类聚等;第二步,利用BP算法等来确定参数 wi w i βi β i

ART网络

  竞争型学习(competitive learning)是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活,其他神经元的状态被抑制。
  ART(Adaptive Resonance Theory,自适应谐振理论)网络是竞争型学习的重要代表。

SOM网络

  SOM(Self-Organizing Map,自组织映射)网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间,同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点映射到网络输出层中的邻近神经元。
这里写图片描述

级联相关网络
Elman网络
Boltzmann机
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本章主要介绍了概率图模型的基本概念和常见类型,以及如何利用Python实现这些模型。下面是一些笔记和代码示例。 ## 概率图模型的基本概念 概率图模型是一种用于表示和处理不确定性的图形化模型,它能够将一个复杂的联合概率分布表示为多个简单的条件概率分布的乘积形式,从而简化概率推理和模型学习的过程。概率图模型主要包括两种类型:有向图模型和无向图模型。 有向图模型(Directed Acyclic Graph, DAG)又称为贝叶斯网络(Bayesian Network, BN),它用有向边表示变量之间的因果关系,每个节点表示一个随机变量,给定父节点的条件下,每个节点的取值都可以用一个条件概率分布来描述。有向图模型可以用贝叶斯公式进行概率推理和参数学习。 无向图模型(Undirected Graphical Model, UGM)又称为马尔可夫随机场(Markov Random Field, MRF),它用无向边表示变量之间的相互作用关系,每个节点表示一个随机变量,给定邻居节点的取值,每个节点的取值都可以用一个势函数(Potential Function)来描述。无向图模型可以用和有向图模型类似的方法进行概率推理和参数学习。 ## 概率图模型的Python实现 在Python中,我们可以使用`pgmpy`库来实现概率图模型。该库提供了一个简单而强大的接口来定义和操作概率图模型,支持有向图模型和无向图模型的构建、概率推理、参数学习等功能。 ### 有向图模型 以下是一个简单的有向图模型的示例: ```python from pgmpy.models import BayesianModel model = BayesianModel([('A', 'B'), ('C', 'B'), ('B', 'D')]) ``` 其中,`BayesianModel`是有向图模型的类,`('A', 'B')`表示A节点指向B节点,即B节点是A节点的子节点,依此类推。我们可以使用以下代码查看模型的结构: ```python print(model.edges()) # 输出:[('A', 'B'), ('B', 'D'), ('C', 'B')] ``` 接下来,我们可以为每个节点定义条件概率分布。以下是一个简单的例子: ```python from pgmpy.factors.discrete import TabularCPD cpd_a = TabularCPD(variable='A', variable_card=2, values=[[0.2, 0.8]]) cpd_c = TabularCPD(variable='C', variable_card=2, values=[[0.4, 0.6]]) cpd_b = TabularCPD(variable='B', variable_card=2, values=[[0.1, 0.9, 0.3, 0.7], [0.9, 0.1, 0.7, 0.3]], evidence=['A', 'C'], evidence_card=[2, 2]) cpd_d = TabularCPD(variable='D', variable_card=2, values=[[0.9, 0.1], [0.1, 0.9]], evidence=['B'], evidence_card=[2]) model.add_cpds(cpd_a, cpd_c, cpd_b, cpd_d) ``` 其中,`TabularCPD`是条件概率分布的类,`variable`表示当前节点的变量名,`variable_card`表示当前节点的取值个数,`values`表示条件概率分布的值。对于有父节点的节点,需要指定`evidence`和`evidence_card`参数,表示当前节点的父节点和父节点的取值个数。 接下来,我们可以使用以下代码进行概率推理: ```python from pgmpy.inference import VariableElimination infer = VariableElimination(model) print(infer.query(['D'], evidence={'A': 1})) # 输出:+-----+----------+ # | D | phi(D) | # +=====+==========+ # | D_0 | 0.6000 | # +-----+----------+ # | D_1 | 0.4000 | # +-----+----------+ ``` 其中,`VariableElimination`是概率推理的类,`query`方法用于查询给定变量的概率分布,`evidence`参数用于指定给定变量的取值。 ### 无向图模型 以下是一个简单的无向图模型的示例: ```python from pgmpy.models import MarkovModel model = MarkovModel([('A', 'B'), ('C', 'B'), ('B', 'D')]) ``` 其中,`MarkovModel`是无向图模型的类,与有向图模型类似,`('A', 'B')`表示A节点和B节点之间有相互作用关系。 接下来,我们可以为每个节点定义势函数。以下是一个简单的例子: ```python from pgmpy.factors.discrete import DiscreteFactor phi_a = DiscreteFactor(['A'], [2], [0.2, 0.8]) phi_c = DiscreteFactor(['C'], [2], [0.4, 0.6]) phi_b = DiscreteFactor(['A', 'C', 'B'], [2, 2, 2], [0.1, 0.9, 0.3, 0.7, 0.9, 0.1, 0.7, 0.3]) phi_d = DiscreteFactor(['B', 'D'], [2, 2], [0.9, 0.1, 0.1, 0.9]) model.add_factors(phi_a, phi_c, phi_b, phi_d) ``` 其中,`DiscreteFactor`是势函数的类,与条件概率分布类似,需要指定变量名、变量取值个数和势函数的值。 接下来,我们可以使用以下代码进行概率推理: ```python from pgmpy.inference import BeliefPropagation infer = BeliefPropagation(model) print(infer.query(['D'], evidence={'A': 1})) # 输出:+-----+----------+ # | D | phi(D) | # +=====+==========+ # | D_0 | 0.6000 | # +-----+----------+ # | D_1 | 0.4000 | # +-----+----------+ ``` 其中,`BeliefPropagation`是概率推理的类,与有向图模型类似,`query`方法用于查询给定变量的概率分布,`evidence`参数用于指定给定变量的取值。 ## 总结 本章介绍了概率图模型的基本概念和Python实现,包括有向图模型和无向图模型的构建、条件概率分布和势函数的定义、概率推理等。使用`pgmpy`库可以方便地实现概率图模型,对于概率模型的学习和应用都有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值