在机器学习中,神经网络一般指的是“神经网络学习”,是机器学习与神经网络两个学科的交叉部分。所谓神经网络,目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应”。
5.1.1神经元模型和MP
神经网络中最基本的单元是神经元模型。在生物神经网络的原始机制中,每一个神经元通常都有多个树突,一个轴突和一个细胞体。在功能上树突用于传入其它神经元传递的神经冲动,而轴突用于将神经冲动传出到其它神经元。具体结构如下图所示。
一直沿用至今的“M-P神经元模型”正是对这一结构进行了抽象。在这个模型中,神经元接受到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将于神经元的阈值进行对比,最后通过激活函数处理产生输出。如下为M-P神经元模型:
5.1.2激活函数
5.1.2.1阶跃函数
神经元模型最理想的激活函数是阶跃函数,即将神经元输入,当输入超过0时,输出1,否则输出0。如下图所示:
由图像可知阶跃函数不连续,不光滑,所以在具体的神经网络中并不适用。但是在感知机上经常使用。
5.1.2.2sigmoid函数
与阶跃函数相对应的另一个函数就是sigmoid函数,图形如下:
相对于阶跃函数,sigmoid函数是一条平滑的曲线,输出发生的是连续的变化。而平滑性对神经网络的学习具有重要意义。二者对比如下图:
另一个不同点就是,相对于阶跃函数只能返回0或者1,sigmoid函数可以返回实数(与平滑性有关)。需要神经网络中流动的是连续的实数值信号。
5.1.2.3非线性函数
上述提到的阶跃函数和sigmoid函数均为非线性函数。所谓线性函数指的是输出值是输入值的常数倍的函数(如:y=ax),因此线性函数是一条笔直的直线,而非线性函数,指的是不像线性函数一样呈现出一条直线的函数。
神经网络的激活函数必须使用非线性函数,因为如果使用线性函数的话,加深神经网络的层数就没有意义了。例如我们使用y=ax作为激活函数,那么在三层神经网络后得到的是y(x) = h(h(h(x))),y=a*a*a*x的乘法运算。这样就失去神经网络的意义了。本身神经网络便是解决非线性问题,如果使用线性函数当作激活函数那么就会导致神经网络依旧没有办法处理非线性函数。
5.1.2.4 ReLU函数
sigmoid函数作为激活函数存在较早,而近来多用ReLU函数,尤其在CNN中。对应的式子和图像如下图所示。
总的来说我们使用的激活函数大致为sigmoid函数或者ReLU函数。
5.2.1感知机
感知机由两层神经元组成,接受多个输入信号,输出一个信号。如下图所示。
其中x1,x2是输入信号,y是输出信号,w1,w2是权重,输入信号被送往神经元时,会被分别乘以固定的权重,神经元会计算传送过来的信号的总和,只有当总和超过某个界限,才会输出1.这也被称为“神经元激活”。用数学表达式表示则如下:
同时,权重越大,对应该权重的信号的重要性就越高。
那么对于训练样本(x,y)具体的学习步骤如下(激活函数为阶跃函数如上图给定的式子):
其中η称为学习率,首先给出初始权值,逐个地输入样本数据,如果输出值与真实值相同则继续输入下一个样本,如不同则更新权重,然后再重新逐个检验,一直到每一个样本的输出值与真实标记相同。感知机经过上述的过程可以将给定的样本预测正确,然而很容易产生过拟合。同时由于只有一层功能神经元,因此只能解决线性问题,对于非线性问题则不能处理。如下图所示的异或门线性无法解决。
5.2.2多层网络
如上图中的异或问题,便不能使用感知机。此时便需要考虑多层功能神经元,即神经网络。一般的形式如下图:
上图中所示中间层又被称为隐藏层。只需包含一个隐藏层便可被称为多层神经网络。常用的神经网络被称为“多层前馈神经网络”,该结构满足以下几个特点;
*每层神经元与下一层神经元之间完全互联。
*神经元之间不存在同层连接。
*神经元之间不存在跨层连接。
这里的“前馈”指的是网络拓扑结构中不存在环或回路,而不是指该网络只能向前传播而不能向后传播(下节中的BP神经网络正是基于前馈神经网络而增加了反馈调节机制)。神经网络的学习过程就是根据训练数据来调整神经元之间的“连接权”以及每个神经元的阈值,换句话说:神经网络所学习到的东西都蕴含在网络的连接权与阈值中。
神经网络的学习主要蕴含在权重和阈值中,多层网络使用感知机的权重调整规则是不够用的。因此提出BP神经网络算法(误差反向传播算法),为学习多层前馈神经网络而设计的。
5.3.1链式法则
正向传播是将计算的结果正向(从左到右)传递。而反向传播是将局部倒数向正方向的反方向(从右向左)传递,而传递这个局部倒数的原理,是基于链式法则的。
如图所示,反向传播的计算顺序是,将信号E乘以节点的局部倒数(∂y/∂x),然后将结果传递给下一个节点,在这里说的局部倒数是指正向传播中y=f(x)的导数,也就是y关于x的倒数。eg,如果y=f(x)=x^2,则局部导数为∂y/∂x=2x。将这个局部导数乘以上游传过来的值,然后传递给前面的节点。这就是反向传播的计算顺序。而链式法则则是关于复合函数的导数的性质。即:
如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。如下:
那么可得
所以得
如上图所示,计算图的反向传播从左到右传播信号,反向传播的计算顺序是,先将节点的输入信号乘以节点的局部倒数(偏导数),然后在传递给下一个节点。比如反向传播是(从右向左),“**2”节点的输入时∂z/∂z,将乘以局部导数∂z/∂t,然后传递给下一个节点。
5.3.2误差反向传播算法
通常来说,只需包含一个足够多神经元的隐层,就能以任意精度逼近任意复杂度的连续函数,以下面的单隐层前馈神经网络为例,介绍BP神经网络的算法思想。
BP神经网络算法也使用了梯度下降算法,以单个样本的均方误差的负梯度方向对权重进行调节。由上图可知,BP算法首先将误差反向传播给隐层神经元,调节隐层到输出层的连接权重与输出层神经元的阈值,接着根据隐含层神经元的均方误差,来调节输入层到隐含层的连接权重与隐含层神经元的阈值。BP算法基本的推导过程原理是相同的。具体的推导过程如下:
由于BP本身也是使用梯度下降算法的所以也是尽量使得误差函数最小以此求得最优质。那么先得出对应的均方误差公式应当为:
而对应的梯度下降则是使用学习率和偏导求出,那么基于给定的均方误差函数我们求对应的权值实际为求对应的偏导数和学习率的乘积,以上图中给出的前馈神经网络为例,如果要求解隐藏层与输出层的权值Whj,那么给定的式子如下:
而观察后可知Whj先影响到第j个输出层神经元的输入值βj,再影响到,最后影响Ek,因此由链式法则得:
这样将得到的式子代入到给定的梯度下降算法,最后在依次求出链式求导法则下对应的几个偏导的值,最后代入可得:
同样的方法可以求得其他的参数的应当为:
注意在所有的梯度下降中学习率都是一个要考虑的问题,在BP中也是一样的。
由上述过程整理后可得对应的BP算法的一般流程应该是:
BP算法的更新规则是基于每个样本的预测值与真实类标的均方误差来进行权值调节,即BP算法每次更新只针对于单个样例。但BP算法的最终目标是要最小化整个训练集D上的累计误差,即:
如果基于累计误差最小化的更新规则,则得到了累计误差反向传播算法,具体做法为每一次读取全部的数据集一遍,进行一轮学习,从而基于当前的累计误差进行权值调整,因此参数更新的频率相比标准BP算法低了很多。
5.3.3神经网络的过拟合问题
神经网络强大的学习能力经常会导致过拟合的问题,以下两个策略来缓解BP网络的过拟合问题:
*早停:将数据分为训练集与测试集,训练集用于学习,测试集用于评估性能,若在训练过程中,训练集的累积误差降低,而测试集的累积误差升高,则停止训练。
*引入正则化:基本思想是在累积误差函数中增加一个用于描述网络复杂度的部分,例如所有权值与阈值的平方和,其中λ∈(0,1)用于对累积经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。
模型学习过程的实质就是一个寻找最优参数的过程,例如BP算法试图通过最快下降来寻找使得累积经验误差最小的权值与阈值,在谈到最优时,一般会提到局部极小和全局最小。
局部最小指的是参数空间中的某一个点,其邻域点的误差函数值均不小于改点的误差函数值。
全局最小指的是参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值。
局部最小点只要满足该点在参数空间中的梯度为零。局部极小可以有多个,而全局最小只有一个。全局最小一定是局部最小,但局部最小不一定是全局最小。在机器学习算法中更想要得到的是全局最小,梯度下降法的主要思想就是沿着负梯度方向去搜索最优解,负梯度方向是函数值下降最快的方向,若迭代到某处的梯度为0,则表示达到一个局部最小,参数更新停止。在实际的任务中通常使用以下的策略尽可能的接近全局最小。
*以多组不同参数值初始化多个神经网络,按照标准方法训练,迭代停止后,取其中误差最小的解作为最终参数
*使用“模拟退火”
*使用随机梯度下降,即在计算梯度时加入了随机因素,使得在局部最小时,计算的梯度仍可能不为0,从而迭代可以继续进行。
本章部分参考:https://blog.csdn.net/TeFuirnever/article/details/99071971
5.5.1 RBF网络
RBF网络是一种单隐层前馈神经网络,它使用径向基函数作为隐藏层神经元的激活函数。输出层则直接使用隐藏层神经元的线性组合。
5.5.2 ART网络
竞争型学习是神经网络中常用的一种无监督学习策略。使用该策略时,网络中的输出神经元相互竞争,每次只有一个竞争获胜的神经元被激活。其它输出神经元被抑制,这种机制又被称为胜者通吃。
ART网络是竞争型学习的重要代表。该网络由四部分组成:比较层,识别层,识别阈值,重置模块。比较层就是输入层,只负责把样本传递给识别层。识别层即输出层。识别层的每个神经元对应一个模式类,而且神经元的数目可以在训练过程中动态增加以增加新的模式类。
5.5.3 SOM网络
SOM网络,又称为自组织特征映射网络或者Kohonen网络。同样是一种竞争学习型无监督神经网络,只有输入层和输出层两层,输出层以矩阵形式排列。与样本距离最近的输出层神经元获胜,称为最佳匹配单元。最佳匹配单元和临近神经元的权向量会被调整,使得下次遇到相似的样本时距离更小。如此迭代,直至收敛。
5.5.4 级联相关网络
级相关网络是一种典型的结构自适应网络,这类网络不仅通过训练来学习合适的连接权和阈值等参数,还会在训练过程中找到最符合数据特点的网络结构。
级联相关神经网络两个主要成分:
*级联:指建立层次连接的层级结构。开始训练师,只有输入层和输出层,随着训练逐渐加入隐藏层的神经元。从而建立层级结构。
*相关:指通过最大化新神经元的输出与网络误差之间的相关性来训练相关的参数。
5.5.5 Elman网络
递归神经网络(RNN,或者称为循环神经网络)允许网络中出现环状结构,即一些神经元的输出可以反馈回来当作输入信号,从而处理与时间有关的动态变化。
5.5.6 Boltzmann机
神经网络中有一类基于能量的模型,把网络状态定义为一个能量,能量最小时网络达到理想状态,模型的学习过程就是最小化能量函数。Boltzmann机就是这样的模型,同时也是一种RNN。
Boltzmann机的神经元分为显层与隐层,显层用于表达数据的输入与输出,隐层则是数据的内在。没个神经元只有0,1两种状态,即抑制和激活。
标准的Boltzmann机是全连接图,即任意两个神经元之间都相连。但复杂度太高,难以解决现实中的任务。实际上使用的是受限Boltzmann机,把标准Boltzmann机退化为二部图,只保留显层和隐层之间的连接,同一层直接不相连。
理论上参数越多,模型的复杂度就越高,容量就越大,从而能完成更复杂的学习任务。深度学习正是一种极其复杂而强大的模型。
增大模型的复杂度,通常使用两个办法:①增加隐藏层的数目。②增加隐藏层神经元的数目。前者更加有效,因为不仅增加了功能神经元的数量,同时还增加了激活函数嵌套的层数。但对于多隐藏层的神经网络,经典算法如标准BP算法往往会在误差反向传播时发散,无法收敛达到稳定状态。
通常使用下面两种方法来有效的训练多隐层神经网络
*无监督逐层训练:
每次训练一层隐节点,把上一层隐节点的输出当作输入来训练,本层隐节点训练好后,输出再作为下一层的输入来训练,这称为预训练。全部预训练完成后,再对整个网络进行微调训练。一个典型例子就是深度信念网络(DBN)。这种做法其实可以视为把大量的参数进行分组,先找出每组较好的设置,再基于这些局部最优的结果来训练全局最优。
*权共享:
令同一层的神经元使用完全相同的连接权,典型的例子是卷积神经网络。这样做可以大大减少需要训练的参数数目。较为典型的就是卷积神经网络(CNN)。
深度学习可以理解为一种特征学习或者表示学习,无论是DBN还是CNN,都是通过多个隐藏层来把与输出目标联系不大的初始输入转化为与输出目标更加密切的表示,使原来只通过单层映射难以完成的任务变为可能。即通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示,从而使得最后可以用简单的模型来完成复杂的学习任务。
在传统的机器学习中,样本的特征需要人手动设计,这被称为特征工程。特征好坏对泛化性能有着较为重要的影响。而深度学习为全自动数据分析带来了可能,能够自动产生更好的特征。