《机器学习》周志华--第5章神经网络。 笔记+习题

The definition of neural network:神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。

神经网络的学习过程,就是根据训练数据来调整神经元之间的连接权(connection weight)以及每个功能神经元的阈值,神经网络经过学习后的东西,蕴藏在连接权与阈值中。

5.1神经元模型

在这里插入图片描述
其最初是模拟的生物神经元。我们假设每个神经元电位高于某个“阈值”时会处于兴奋。
对于每个神经元,如图5.1所示,神经元接收到来自其他n个神经元输入的信号,这些输入信号通过带权重的连接进行传递,组成神经元的输入的线性组合量,减去阈值作为函数变量的函数来量化是否处于兴奋状态,这个函数我们常常称之为激活函数。而这个模型在业界称为**“M-P神经元模型”在这里插入图片描述
对于激活函数,理想的激活函数应当是阶跃函数,但是由于阶跃函数具有
不连续,不光滑**等不太友好的数学性质,会导致后期最优解问题的棘手,估在神经网络的激活函数不采用阶跃函数,而是采用sigmod函数,两者在坐标轴如图5.2所示。
sigmoid函数将在较大范围内变化的输入值挤压到(0,1)输出值范围内,有时其也被称为挤压函数(squashing function)。
在这里插入图片描述

5.2 神经网络的雏形-感知机与多层网络

在这里插入图片描述

perceptron(感知机)由两层神经元构成,输入层、输出层。
感知机无隐藏层。输出层是M-P神经元(阈值逻辑单元)。感知机能够实现与、或、非运算。
在这里插入图片描述
在这里插入图片描述
学习率控制算法每一轮迭代的更新步长,若太大则容易引起振荡,长时间不能收敛,太小则收敛速度同样很慢。

实际上感知机的学习能力是非常有限的,因为虽然感知机虽然是一个二层神经网络模型,但是只有一层功能神经元,即输出层。感知机只能处理线性可分问题,对于线性不可分的问题的学习中,感知机会一直振荡,不能求得合适的解,也就是权重解。

非线性可分意味着用线性超平面无法划分。对于非线性可分的问题,我们需要考虑多层功能神经元的模型,例如图5.5这个简单的两层感知机就能解决“异或”问题。在这里插入图片描述
在这里插入图片描述

multi-layer feedforward neural networks(多层前馈神经网络)不存在同层连接、跨层连接。前馈并不意味着网路中信号不能往后传播只是说在这种类型的神经网络中,网络的拓扑结构不存在环或回路。如图5.6在这里插入图片描述
(a)通常被称之为“两层网络”。西瓜书称之为“单隐层网络“。

神经网络的学习过程,就是根据训练数据来调整神经元之间的连接权(connection weight)以及每个功能神经元的阈值,神经网络经过学习后的东西,蕴藏在连接权与阈值中。

5.3误差逆传播算法(BP算法)

在这里插入图片描述

真实值与预测值比较==影响权值

对于多层神经网络的学习,我们通常通过误差逆传播(error BackPropagation,简称BP)算法进行学习。Error BackPropagation(误差逆传播)算法,是神经网络学习算法中最成功的。

误差逆传播算法适用于多种神经网络,例如常见的多层前馈神经网络,递归神经网络等。

图5.8给出了BP算法的工作流程,对于每个输入样例BP算法的工作流程如下:
1)输入层的神经元接收输入样例的属性后,按照一定的连接权将信号往输出层的方向传出,一直到输出层产生输出结果。
(2)根据样本的输出结果与样本实标的误差,也就是输出层的误差,再将误差逆向传播至隐层神经元,最后根据隐层神经元的误差来对连接权和阈值进行调整。
(3)重复步骤1和2,直至满足停止迭代的条件在这里插入图片描述

  • 标准BP算法每次更新都只针对单个样例,参数更新得非常频繁,而且对不同的样例进行更新可能出现“抵消”现象。
  • 累积BP算法直接针对累积误差最小化,其在读取整个训练集D一遍后才对参数进行更新,这样参数更新的频率低的多但是在很多任务中,累积误差在下降到一定程度后继续下降的话很缓慢,这也是累积误差一个受限的地方。
  • 这两种算法各有千秋。并不是说标准BP算法不能实现累积均方误差最小。

只需一个包含足够多神经元的隐藏层,多层前馈神经网络就能以任意精度逼近任意复杂度连续函数

由于BP神经网络过分强大的学习能力,因此往往会产生过拟合现象,常见的有两种方式降低过拟合:
(1)早停(early stopping):将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回最有最小验证集误差的连接权和阈值。

(2)“正则化”(regularization),其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分。在目标函数中引入连接权与阈值的平方和一项,训练过程中会比较偏好较小的连接权与阈值,从而使得网络输出更加光滑,对于过拟合问题有所缓解。
在这里插入图片描述

5.4全局最小与局部最小

在这里插入图片描述

神经网络在训练集上的误差E,是关于连接权w和阈值𝜽的函数。神经网络的训练可以一个参数寻优的过程,即在参数空间中,寻找一组最优参数,使得均方误差E最小

在BP学习算法中,我们要找的应当是全局最小问题,即参数空间内梯度为0,并且其误差函数值比参数空间中所有的误差函数值都要小。

对 w ∗ 和 θ ∗ , 若 存 在 ϵ > 0 , 对w^{*}和\theta^{*},若存在\epsilon >0, wθϵ>0
使得: ∀ ( w ; θ ) ∈ { ∣ ∣ ( w ; θ ) − ( w ∗ ; θ ∗ ) ∣ ∣ ≤ ϵ } \forall (w;\theta)\in \left \{ ||(w;\theta)-(w^{*};\theta^{*})|| \leq \epsilon \right \} (w;θ){(w;θ)(w;θ)ϵ}

都 有 E ( w , θ ) > = E ( w ∗ , θ ∗ ) 成 立 , 则 ( w ∗ ; θ ∗ ) 为 局 部 极 小 解 ; 都有E(w,\theta)>=E(w*,\theta*)成立,则(w*;\theta*)为局部极小解; Ew,θ>=E(w,θ)w;θ
若 对 参 数 空 间 中 的 任 意 ( w ; θ ) 都 有 E ( w ; θ ) > = E ( w ∗ ; θ ∗ ) , 则 ( w ∗ , θ ∗ ) 为 全 局 最 小 解 。 若对参数空间中的任意(w;\theta)都有E(w;\theta)>=E(w*;\theta*),则(w*,\theta*)为全局最小解。 w;θEw;θ>=Ew;θw,θ

局部极小解释参数空间中的某个点,其邻域点的误差函数值均不小于该点的函数值;全局最小解则是指参数空间中所有点的误差函数值均不小于该点的误差函数值。

对于最优解问题,我们可以有许多方法,例如基于梯度下降法和随机梯度法和模拟退火技术以及遗传方法等等。

具体问题我们要具体分析,例如我们的目标函数是一个凸函数,那我们可以选择通过基于梯度的负方向确定搜索方向,直至梯度为0的点就是我们要求的解,因为是凸函数,那么显然当前点即为全局最小的解。

但是如果不是一个凸函数呢? 梯度下降法不太适合,因为一般来说,在参数空间中,对于目标函数的局部最小解是有多个的,而梯度下降法只能够随机解出其中一个梯度为0的局部最小解.

下面我想介绍一下几种常见的逼近全局最小的算法:

(1)以多组不同参数值初始化多个神经网络,取出其中误差最小的解作为最终参数,不过这也有一定的随机成分,我们很大可能的能获得全局最小解。

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

(3)使用随机梯度下降,与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素。

单独以模拟退火技术来讲解逼近全局最小思想:

模拟退火其实就是在寻找极值的基础上,加入了随机因素。在进行迭代更新可行解时,以一定概率接受一个比当前解要差的解,因此这样是有可能能避免陷入局部最优解,达到全局最优解。

以下图为例,假定我们从A点出发,模拟退火算法会搜索到局部最优解B,但是不是就此结束,当该算法过程中按一定的概率接受了右边的移动,就有可能能够跳出这个局部最优解B,也许经过几次这样的移动后就能达到全局最优解D。

在这里插入图片描述

具体算法实现可以参考: https://blog.csdn.net/AI_BigData_wh/article/details/77943787?locationNum=2&fps=1

5.5 其他常见神经网络

在这里插入图片描述

1.RBF网络

在这里插入图片描述

radial basis function(径向基函数)网络是一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。

径向基函数是某种沿径向对称的标量函数,通常采用两步过程训练RBF网络:
(1)确定神经元中心ci,常用的方式包括聚类、随机采样等;
(2)利用BP算法确定参数wi和\belta i。

2.ART网络

在这里插入图片描述

adaptive resonance theory自适应谐振理论网络是竞争性学习的代表,该网络由比较层、识别层、识别阈值和重置模块构成。

在接收到比较层的输入信号后,识别层神经元之间相互竞争以产生获胜神经元。

竞争方式:计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者胜。获胜神经元将向其他识别层神经元发送信号,抑制其激活。

3.SOM网络

在这里插入图片描述

self organizing map(自组织映射)网络是一种竞争学习型的无监督神经网络,它可以将高维输入数据映射到低维空间,同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点映射到网络输出层中的邻近神经元。

SOM网络的训练过程:
(1)在接受到一个训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元。
(2)最佳匹配单元及其邻近神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小。
(3)不断迭代,直至收敛。

4.级联相关网络

在这里插入图片描述

级联相关网络包括两个主要部分:“级联”&“相关”。级联是指建立层次连接的层级结构,相关是指通过最大化新神经元的输出与网络误差之间的相关性来训练相关的参数。

级联相关网络不需要设置网络层数、隐层神经元数量,并且训练速度快,但在较小数据集中容易陷入过拟合。

5.Elman网络

在这里插入图片描述

Elman网络是一种递归神经网络,递归神经网络允许网络中出现环形结构,使得一部分神经元的输出反馈回来作为输入信号。

6.Boltzmann机

在这里插入图片描述

Boltzmann机中的神经元都是布尔型的,若网络中的神经元以任意不依赖输入值的顺序进行更新,则网络最终将达到Boltzmann分布。

5.6 深度学习

在这里插入图片描述
在这里插入图片描述

典型的深度学习其实就是很深层的神经网路。
在这里插入图片描述
在这里插入图片描述

补充链接: link.

习题

转载自https://zhuanlan.zhihu.com/p/47616848

5.1 试述将线性函数 ( y = w T x ) (y = w^Tx) (y=wTx)用作神经元激活函数的缺陷.

答:线性激活函数就等同于线性回归, 当样本不能线性可分的时候,不能很好的对样本分类。

5.2 试述使用图5.2(b)激活函数的神经元与对率回归的联系。
图5.2(b)是sigmoid函数
每个神经元几乎和对率回归相同,只不过对率回归在 s i g m o i d ( x ) > 0.5 sigmoid(x)>0.5 sigmoid(x)>0.5时输出为1
而神经元直接输出 s i g m o i d ( x ) sigmoid(x) sigmoid(x)

5.3 对于图5.7中的 ( v i h ) (v^{ }_{ih}) (vih)试推导出BP算法中的更
新公式5.13.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 试述式(5.6)中学习率的取值对神经网络的影响。
答:学习率设置太小,则收敛得慢,迭代次数多;
学习率设置太大则容易振荡,来回波动却找不到最优值。

5.5 试编程实现标准BP算法和累积BP算法,在西瓜数据集3.0上分别用这两个算法训练一个单隐层网络,并进行比较。
答:

标准 BP 算法和累积 BP 算法在原书(P105)中也提到过,就是对应标准梯度下降和随机梯度下降,差别就是后者每次迭代用全部数据计算梯度,前者用一个数据计算梯度。

代码在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets

具体两种情况的结果如下图:可以看出来gd的成本函数收敛过程更加稳定,而sgd每次迭代并不一定向最优方向前进,但总体方向是收敛的,且同样是迭代200次,最后结果相差不大,但由于sgd每次迭代只使用一个样本,计算量大幅度下降,显然sgd的速度会更快。

ps.关于随机梯度下降的实现,好像有两种方式,一种是每次将样本打乱,然后遍历所有样本,而后再次打乱、遍历;另一种是每次迭代随机抽取样本。这里采取的是后一种方式,貌似两种方式都可以。

此外,BP神经网络代码在以前学吴恩达老师深度学习课程的时候就写过,这次整理了一下正好放上来,所以很多代码和课程代码类似,添加了应用多分类的情况的代码。下面的5.6题也一并在这里实现。
请添加图片描述

5.6 试设计一个BP改进算法,能通过动态调整学习率显著提高收敛速度。编程实现该算法,并选择两个UCI数据集与标准BP算法比较。
答:

动态调整学习率有很多现成的算法,RMSProp、Adam、NAdam等等。也可以手动实现一个简单指数式衰减
在这里插入图片描述
这里代码实现了Adam,下面代码和5.5一同实现,同样在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets

这里只尝试了sklearn 中自带的iris数据集试了一下。同样学习率下,两者训练时损失函数如下:
请添加图片描述
可以明显看出adam的速度更快的。

5.7 根据式5.18和5.19,试构造一个能解决异或问题的单层RBF神经网络。

这里可以使用X = array([[1, 0], [0, 1], [0, 0], [1, 1]]),y = array([[1], [1], [0], [0]])作为数据,训练一个RBF神经网络。

这里使用均方根误差作为损失函数;输出层和书上一致,为隐藏层的线性组合,且另外加上了一个偏置项(这是书上没有)。

代码在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets

最后输出是:

[[ 9.99944968e-01]
[ 9.99881045e-01]
[ 8.72381056e-05]
[ 1.26478454e-04]]
感觉,分类的时候在输出层使用sigmoid作为激活函数也可以。

5.8 从网上下载或自己编程实现一个SOM网络,并观察在西瓜数据集3.0a上产生的结果。
答:

花了挺长时间看,写完代码的发现结果和预期有点不太符合,先暂时放一下吧还是…代码不完整就不放了。

这里提一个迷惑了我很久的一点,有些博客说SOM神经网络的聚类类别不需要自己定义,其实是不对的,SOM神经网络输出聚类类别是需要自己定义,每个输出节点对应着一个类别,通过计算样本和输出节点的权重向量的相似度来确定样本属于哪个类别(节点);输入节点的数量和样本的维度一样(和BP网络相同);输出的节点常常是以二维矩阵(这里可以是正方形也可以多边形等)或者一维直线的形式,每一个输出节点对应着一个权重向量和输入节点实现全连接。

想了解SOM建议参考下面几个链接:

https://www.jianshu.com/p/41fc86728928

https://github.com/KeKe-Li/tutorial/blob/master/assets/src/SOM/SOM.md

http://www.cs.bham.ac.uk/~jxb/NN/l16.pdf

5.9 试推导用于Elman网络的BP算法。
Elman 网络在西瓜书原书上说的是“递归神经网络”,但是在网上找资料说的

“递归神经网络”是空间维度的展开,是一个树结构。
“循环神经网络”是时间维度的展开,代表信息在时间维度从前往后的的传递和积累。

从书上p111描述来看感觉更像“循环神经网络”。最近时间不多(lan…),就不去啃原论文了。关于“循环神经网络”或者递归神经网络的BP可以参考下面链接。

1、零基础入门深度学习(5) - 循环神经网络 https://zybuluo.com/hanbingtao/note/541458,网上大神写了。

另外关于循环神经网络也可以看看吴恩达老师的深度学习课程“序列模型”那部分。

5.10 实现一个卷积神经网络。
答:

正好前段时间做过Kaggle上手写数字识别的题目。这里正好放上来,CNN是用Tensorflow实现的,之前看吴恩达老师深度学习课程的时候也拿numpy实现过(课程作业),等以后有时间再整理放上来吧。

han1057578619/kaggle_competition

很高兴为您解答这个问题!本次我们将学习如何用 Python 实现《机器学习周志华教授第十四中的概率图模型习题。在这里,我们将使用 Python 的 pgmpy 库来构建和分析概率图模型。 首先,我们需要安装 pgmpy。可以使用 pip 安装: ```python pip install pgmpy ``` 安装完成后,我们就可以开始实现习题了。 #### 习题 14.1 考虑一个三元组 $(X, Y, Z)$,其中 $X$ 是二元随机变量,$Y, Z$ 是一元随机变量,试构造一个无向图结构,使其成为正态分布的一个合法图模型。 我们可以使用 pgmpy 来创建这个无向图模型。代码如下: ```python from pgmpy.models import MarkovModel # 创建一个空的无向图模型 model = MarkovModel() # 添加变量节点 model.add_nodes_from(['X', 'Y', 'Z']) # 添加边 model.add_edges_from([('X', 'Y'), ('X', 'Z')]) # 将模型转换成正态分布模型 from pgmpy.factors.continuous import ContinuousFactor from pgmpy.inference import Inference # 定义正态分布的 mean 和 covariance mean = [0, 0, 0] covariance = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 创建正态分布因子 factor = ContinuousFactor(['X', 'Y', 'Z'], mean, covariance) # 将因子添加到模型中 model.add_factors(factor) # 执行因子分解 inference = Inference(model) factors = inference.factors() ``` 在上面的代码中,我们首先创建了一个空的无向图模型,然后添加了三个变量节点 $X, Y, Z$ 和两条边 $(X, Y), (X, Z)$。接着,我们使用 `pgmpy.factors.continuous.ContinuousFactor` 来定义正态分布的 mean 和 covariance,并将其添加到模型中。最后,我们使用 `pgmpy.inference.Inference` 来执行因子分解,得到了模型中的所有因子。 #### 习题 14.2 考虑一个四元组 $(X_1, X_2, X_3, X_4)$,它们之间的关系如下图所示。试构造这个有向图结构的贝叶斯网模型。 ![image.png](attachment:image.png) 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X3', 'X2'), ('X4', 'X2')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了四个变量节点 $X_1, X_2, X_3, X_4$ 和四条边 $(X_2, X_1), (X_3, X_1), (X_3, X_2), (X_4, X_2)$。最后,我们打印出了模型的边结构。 #### 习题 14.3 考虑一个五元组 $(X_1, X_2, X_3, X_4, X_5)$,它们之间的关系如下图所示。试构造这个有向图结构的贝叶斯网模型。 ![image-2.png](attachment:image-2.png) 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4', 'X5']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X4', 'X2'), ('X5', 'X2'), ('X5', 'X3')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了五个变量节点 $X_1, X_2, X_3, X_4, X_5$ 和五条边 $(X_2, X_1), (X_3, X_1), (X_4, X_2), (X_5, X_2), (X_5, X_3)$。最后,我们打印出了模型的边结构。 #### 习题 14.4 考虑一个六元组 $(X_1, X_2, X_3, X_4, X_5, X_6)$,它们之间的关系如下图所示。试构造这个有向图结构的贝叶斯网模型。 ![image-3.png](attachment:image-3.png) 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4', 'X5', 'X6']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X4', 'X2'), ('X5', 'X3'), ('X6', 'X4'), ('X6', 'X5')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了六个变量节点 $X_1, X_2, X_3, X_4, X_5, X_6$ 和六条边 $(X_2, X_1), (X_3, X_1), (X_4, X_2), (X_5, X_3), (X_6, X_4), (X_6, X_5)$。最后,我们打印出了模型的边结构。 #### 习题 14.5 考虑一个二元组 $(X, Y)$,其中 $X$ 是一元随机变量,$Y$ 是二元随机变量,试构造一个有向图结构,使其成为正态分布的一个合法图模型。 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X', 'Y1', 'Y2']) # 添加边 model.add_edges_from([('X', 'Y1'), ('X', 'Y2')]) # 将模型转换成正态分布模型 from pgmpy.factors.continuous import ContinuousFactor from pgmpy.inference import Inference # 定义正态分布的 mean 和 covariance mean = [0, 0, 0] covariance = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 创建正态分布因子 factor = ContinuousFactor(['X', 'Y1', 'Y2'], mean, covariance) # 将因子添加到模型中 model.add_factors(factor) # 执行因子分解 inference = Inference(model) factors = inference.factors() ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了三个变量节点 $X, Y_1, Y_2$ 和两条边 $(X, Y_1), (X, Y_2)$。接着,我们使用 `pgmpy.factors.continuous.ContinuousFactor` 来定义正态分布的 mean 和 covariance,并将其添加到模型中。最后,我们使用 `pgmpy.inference.Inference` 来执行因子分解,得到了模型中的所有因子。 以上就是本次的答案,希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪呀呀呀呀呀呀呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值