1. (七)神经网络基本结构
目前为止,我们已经学习了2个机器学习模型。线性回归一般用来处理线性问题,逻辑回归用来处理2分类问题。虽然逻辑回归也可以处理非线性的分类问题,但是当我们有非常多的特征时,例如大于100个变量,将会有数量非常惊人的特征组合。这对于一般的逻辑回归来说需要计算的特征太多了,负荷太大。而神经网络既可以解决复杂的非线性分类问题,又可以避免庞大的计算量。
人工神经网络是由很多神经元(激活单元)构成的,神经元是神经网络的基本元素。
实际上,可以这样理解神经元工作过程,当将输入送进神经元后,神经元将输入与权值线性组合(实际上就是θ T X)输出一个线性表达式,再将这个表达式送入激活函数中,便得到了神经元的真实输出。
神经网络由好多个激活单元构成,如下图所示:
激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。
(1) 线性函数( Liner Function )
(2) 斜面函数( Ramp Function )**
(3) 阈值函数( Threshold Function )**
以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数。
(4) S形函数( Sigmoid Function )
S形函数与双极S形函数的图像如下:
双极S形函数与S形函数主要区别在于函数的值域,双极S形函数值域是(-1,1),而S形函数值域是(0,1)。由于S形函数与双极S形函数都是 可导的 (导函数是连续函数),因此适合用在BP神经网络中。(BP算法要求激活函数可导)
人工神经网络中,最常用的激活函数就是sigmoid函数
神经网络是由大量的神经元互联而构成的网络。根据网络中神经元的互联方式,常见网络结构主要可以分为下面3类:
前馈网络也称前向网络,是最常见的神经网络,前文提到的都是前馈网络。称之为前馈是因为它在输出和模型本身之间没有反馈,数据只能向前传送,直到到达输出层,层间没有向后的反馈信号。
反馈型神经网络是一种从输出到输入具有反馈连接的神经网络,其结构比前馈网络要复杂得多。
自组织神经网络是一种无监督学习网络。它通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。
2. 一文读懂神经网络
要说近几年最引人注目的技术,无疑的,非人工智能莫属。无论你是否身处科技互联网行业,随处可见人工智能的身影:从 AlphaGo 击败世界围棋冠军,到无人驾驶概念的兴起,再到科技巨头 All in AI,以及各大高校向社会输送海量的人工智能专业的毕业生。以至于人们开始萌生一个想法:新的革命就要来了,我们的世界将再次发生一次巨变;而后开始焦虑:我的工作是否会被机器取代?我该如何才能抓住这次革命?
人工智能背后的核心技术是深度神经网络(Deep Neural Network),大概是一年前这个时候,我正在回老家的高铁上学习 3Blue1Brown 的 Neural Network 系列视频课程,短短 4 集 60 多分钟的时间,就把神经网络从 High Level 到推导细节说得清清楚楚,当时的我除了获得新知的兴奋之外,还有一点新的认知,算是给头脑中的革命性的技术泼了盆冷水:神经网络可以解决一些复杂的、以前很难通过写程序来完成的任务——例如图像、语音识别等,但它的实现机制告诉我,神经网络依然没有达到生物级别的智能,短期内期待它来取代人也是不可能的。
一年后的今天,依然在这个春运的时间点,将我对神经网络的理解写下来,算是对这部分知识的一个学习笔记,运气好的话,还可以让不了解神经网络的同学了解起来。
维基网络这样解释 神经网络 :
这个定义比较宽泛,你甚至还可以用它来定义其它的机器学习算法,例如之前我们一起学习的逻辑回归和 GBDT 决策树。下面我们具体一点,下图是一个逻辑回归的示意图:
其中 x1 和 x2 表示输入,w1 和 w2 是模型的参数,z 是一个线性函数:
接着我们对 z 做一个 sigmod 变换(图中蓝色圆),得到输出 y:
其实,上面的逻辑回归就可以看成是一个只有 1 层 输入层 , 1 层 输出层 的神经网络,图中容纳数字的圈儿被称作 神经元 ;其中,层与层之间的连接 w1、w2 以及 b,是这个 神经网络的参数 ,层之间如果每个神经元之间都保持着连接,这样的层被称为 全连接层 (Full Connection Layer),或 稠密层 (Dense Layer);此外,sigmoid 函数又被称作 激活函数 (Activation Function),除了 sigmoid 外,常用的激活函数还有 ReLU、tanh 函数等,这些函数都起到将线性函数进行非线性变换的作用。我们还剩下一个重要的概念: 隐藏层 ,它需要把 2 个以上的逻辑回归叠加起来加以说明:
如上图所示,除输入层和输出层以外,其他的层都叫做 隐藏层 。如果我们多叠加几层,这个神经网络又可以被称作 深度神经网络 (Deep Neural Network),有同学可能会问多少层才算“深”呢?这个没有绝对的定论,个人认为 3 层以上就算吧:)
以上,便是神经网络,以及神经网络中包含的概念,可见,神经网络并不特别,广义上讲,它就是
可见,神经网络和人脑神经也没有任何关联,如果我们说起它的另一个名字—— 多层感知机(Mutilayer Perceptron) ,就更不会觉得有多么玄乎了,多层感知机创造于 80 年代,可为什么直到 30 年后的今天才爆发呢?你想得没错,因为改了个名字……开个玩笑;实际上深度学习这项技术也经历过很长一段时间的黑暗低谷期,直到人们开始利用 GPU 来极大的提升训练模型的速度,以及几个标志性的事件:如 AlphaGo战胜李世石、Google 开源 TensorFlow 框架等等,感兴趣的同学可以翻一下这里的历史。
就拿上图中的 3 个逻辑回归组成的神经网络作为例子,它和普通的逻辑回归比起来,有什么优势呢?我们先来看下单逻辑回归有什么劣势,对于某些情况来说,逻辑回归可能永远无法使其分类,如下面数据:
这 4 个样本画在坐标系中如下图所示
因为逻辑回归的决策边界(Decision Boundary)是一条直线,所以上图中的两个分类,无论你怎么做,都无法找到一条直线将它们分开,但如果借助神经网络,就可以做到这一点。
由 3 个逻辑回归组成的网络(这里先忽略 bias)如下:
观察整个网络的计算过程,在进入输出层之前,该网络所做的计算实际上是:
即把输入先做了一次线性变换(Linear Transformation),得到 [z1, z2] ,再把 [z1, z2] 做了一个非线性变换(sigmoid),得到 [x1', x2'] ,(线性变换的概念可以参考 这个视频 )。从这里开始,后面的操作就和一个普通的逻辑回归没有任何差别了,所以它们的差异在于: 我们的数据在输入到模型之前,先做了一层特征变换处理(Feature Transformation,有时又叫做特征抽取 Feature Extraction),使之前不可能被分类的数据变得可以分类了 。
我们继续来看下特征变换的效果,假设 为 ,带入上述公式,算出 4 个样本对应的 [x1', x2'] 如下:
再将变换后的 4 个点绘制在坐标系中:
显然,在做了特征变换之后,这两个分类就可以很容易的被一条决策边界分开了。
所以, 神经网络的优势在于,它可以帮助我们自动的完成特征变换或特征提取 ,尤其对于声音、图像等复杂问题,因为在面对这些问题时,人们很难清晰明确的告诉你,哪些特征是有用的。
在解决特征变换的同时,神经网络也引入了新的问题,就是我们需要设计各式各样的网络结构来针对性的应对不同的场景,例如使用卷积神经网络(CNN)来处理图像、使用长短期记忆网络(LSTM)来处理序列问题、使用生成式对抗网络(GAN)来写诗和作图等,就连去年自然语言处理(NLP)中取得突破性进展的 Transformer/Bert 也是一种特定的网络结构。所以, 学好神经网络,对理解其他更高级的网络结构也是有帮助的 。
上面说了,神经网络可以看作一个非线性函数,该函数的参数是连接神经元的所有的 Weights 和 Biases,该函数可以简写为 f(W, B) ,以手写数字识别的任务作为例子:识别 MNIST 数据集 中的数字,数据集(MNIST 数据集是深度学习中的 HelloWorld)包含上万张不同的人写的数字图片,共有 0-9 十种数字,每张图片为 28*28=784 个像素,我们设计一个这样的网络来完成该任务:
把该网络函数所具备的属性补齐:
接下来的问题是,这个函数是如何产生的?这个问题本质上问的是这些参数的值是怎么确定的。
在机器学习中,有另一个函数 c 来衡量 f 的好坏,c 的参数是一堆数据集,你输入给 c 一批 Weights 和 Biases,c 输出 Bad 或 Good,当结果是 Bad 时,你需要继续调整 f 的 Weights 和 Biases,再次输入给 c,如此往复,直到 c 给出 Good 为止,这个 c 就是损失函数 Cost Function(或 Loss Function)。在手写数字识别的列子中,c 可以描述如下:
可见,要完成手写数字识别任务,只需要调整这 12730 个参数,让损失函数输出一个足够小的值即可,推而广之,绝大部分神经网络、机器学习的问题,都可以看成是定义损失函数、以及参数调优的问题。
在手写识别任务中,我们既可以使用交叉熵(Cross Entropy)损失函数,也可以使用 MSE(Mean Squared Error)作为损失函数,接下来,就剩下如何调优参数了。
神经网络的参数调优也没有使用特别的技术,依然是大家刚接触机器学习,就学到的梯度下降算法,梯度下降解决了上面迭代过程中的遗留问题——当损失函数给出 Bad 结果时,如何调整参数,能让 Loss 减少得最快。
梯度可以理解为:
把 Loss 对应到 H,12730 个参数对应到 (x,y),则 Loss 对所有参数的梯度可以表示为下面向量,该向量的长度为 12730:
$$
abla L(w,b) = left[
frac{partial L}{partial w_1},
frac{partial L}{partial w_2},...,
frac{partial L}{partial b_{26}}
ight] ^ op
$$
所以,每次迭代过程可以概括为
用梯度来调整参数的式子如下(为了简化,这里省略了 bias):
上式中, 是学习率,意为每次朝下降最快的方向前进一小步,避免优化过头(Overshoot)。
由于神经网络参数繁多,所以需要更高效的计算梯度的算法,于是,反向传播算法(Backpropagation)呼之欲出。
在学习反向传播算法之前,我们先复习一下微积分中的链式法则(Chain Rule):设 g = u(h) , h = f(x) 是两个可导函数,x 的一个很小的变化 △x 会使 h 产生一个很小的变化 △h,从而 g 也产生一个较小的变化 △g,现要求 △g/△x,可以使用链式法则:
有了以上基础,理解反向传播算法就简单了。
假设我们的演示网络只有 2 层,输入输出都只有 2 个神经元,如下图所示:
其中 是输入, 是输出, 是样本的目标值,这里使用的损失函数 L 为 MSE;图中的上标 (1) 或 (2) 分别表示参数属于第 (1) 层或第 (2) 层,下标 1 或 2 分别表示该层的第 1 或 第 2 个神经元。
现在我们来计算 和 ,掌握了这 2 个参数的偏导数计算之后,整个梯度的计算就掌握了。
所谓反向传播算法,指的是从右向左来计算每个参数的偏导数,先计算 ,根据链式法则
对左边项用链式法则展开
又 是输出值, 可以直接通过 MSE 的导数算出:
而 ,则 就是 sigmoid 函数的导数在 处的值,即
于是 就算出来了:
再来看 这一项,因为
所以
注意:上面式子对于所有的 和 都成立,且结果非常直观,即 对 的偏导为左边的输入 的大小;同时,这里还隐含着另一层意思:需要调整哪个 来影响 ,才能使 Loss 下降得最快,从该式子可以看出,当然是先调整较大的 值所对应的 ,效果才最显着 。
于是,最后一层参数 的偏导数就算出来了
我们再来算上一层的 ,根据链式法则 :
继续展开左边这一项
你发现没有,这几乎和计算最后一层一摸一样,但需要注意的是,这里的 对 Loss 造成的影响有多条路径,于是对于只有 2 个输出的本例来说:
上式中, 都已经在最后一层算出,下面我们来看下 ,因为
于是
同理
注意:这里也引申出梯度下降的调参直觉:即要使 Loss 下降得最快,优先调整 weight 值比较大的 weight。
至此, 也算出来了
观察上式, 所谓每个参数的偏导数,通过反向传播算法,都可以转换成线性加权(Weighted Sum)计算 ,归纳如下:
式子中 n 代表分类数,(l) 表示第 l 层,i 表示第 l 层的第 i 个神经元。 既然反向传播就是一个线性加权,那整个神经网络就可以借助于 GPU 的矩阵并行计算了 。
最后,当你明白了神经网络的原理,是不是越发的认为,它就是在做一堆的微积分运算,当然,作为能证明一个人是否学过微积分,神经网络还是值得学一下的。Just kidding ..
本文我们通过
这四点,全面的学习了神经网络这个知识点,希望本文能给你带来帮助。
参考:
3. 图神经网络是怎么炼成的:GNN基本原理简介
此文算是对Google Research这篇 A Gentle Introction to Graph Neural Networks 神作的阅读笔记.
十多年来,研究人员开发了一种称之为图神经网络(Graph Neural Networks,GNNs)的技术,旨在将如今在深度学习的诸多任务中摧枯拉朽的神经网络,应用到图结构之上,从而让神经网络捕捉到更错综复杂的交叉特征,以期待在一些任务上取得更佳的效果。鉴于操作图数据结构的复杂性,尽管已经发展了十几年,它在实际应用中却刚刚起步,即时是google也才开始研究将其被应用到药品研发、物理模拟、假新闻检测、交通预测和推荐系统等领域。
尽管GNN是一个新兴的研究领域,但图结构的数据其实在我们身边无处不在。那么什么是图呢?
这个理科生应该都清楚,图有点(Vertex)和边(Edge)两部分组成,一个图就代表了各个实体节点(node)之间的关系(edge):
每个节点或者边都可以包含它的一些属性信息,比如如果一个节点表示一个人,那么就可以包含这个人的姓名、性别、身高、体重之类的..我们研究需要的信息。
而这些信息,都可以用通用的向量的形式存入其中:
还有别忘了一点,边是可以有方向的,按此我们还能分为有向图或是无向图。边的方向代表了信息的传递方向,例如a是b的微信好友,那b也是a的微信好友,好友关系自然是没方向的,而比如a是b的爹,那显然b就不是a的爹,此时叫爹的关系就是有有方向的。
图结构的构建是非常灵活的,可以根据个人的设计构建出各种不一样的图。而作为开发者显然要结合实际解决的问题来构建合适的图。
正如前面所提到的,图无处不在。你可能已经熟悉例如知识图谱、社交网络之类的图数据。当时显然,图是一种极其强大的通用数据表示,传统神经网络中用到的欧式空间的数据,同样可以用图来表示,例如可以将图像和文本建模为图结构数据。
比如,我们可以将一张图片的每个像素作为图的节点,再将相邻的像素用边连接起来,就构造了一个该图像的图。
如上图展示了一个5*5的图片的邻接矩阵表示和图表示。
我们将每个单词作为节点,并将每个节点连接到下一个节点,就得到了一个文本的图:
当然,在实践中我们并不会这样来编码文本和图像,因为所有的图和文本都是非常规则的结构,表示成图就多此一举了。
我们再来看一些例子,这些数据的结构更加复杂,除了图之外很难用其他方式来表达。
分子是构成物质的基石,我们可以用节点来表示它的原子和电子,用边来表示共价键,这样便将一个分子表示成了一个图:
不同的图可以表示出不同的分子结构:
都说社会是一个大熔炉,身处其中的人和事物之间会发生极其复杂的关系。这种关系的表示用普通的表格数据是很难表示的,而图却能很好的展现。
下图是将莎士比亚歌剧《奥赛罗》中的任务关系表示成图:
怎么样,如果没看过歌剧能推测出那些是主角吗?
下面是将一个空手道竞标赛的对战关系构建为图:
类似的可以表示为图的数据还有很多很多,比如论文的引用之类统统都可以表示为图,下面是现实世界中不同规模的数据图表示的统计数据:
可见,各种各样规模的数据都可以轻松的用图来表示。
在上面我们列举了这么多的图,那么我们该对这些图数据执行什么任务呢?
图上的预测任务一般分为三类:
下面我们通过具体的示例来说明GNN怎么来解决上述的三个级别的预测问题。
在图级别的任务中,我们的目标是预测整个图的属性。例如我们通过分子图,来预测该分子的气味或是者它是否是与某些疾病有关的受体。
它的输入是完整的图:
输出是图的分类:
节点级任务一般就是预测每个节点的类型。
一个经典的例子就是Zach的空手道俱乐部。该数据集市一个单一的社交网络图,犹豫政治分歧,讲师Hi先生和管理员John之间不和导致空手道俱乐部分裂,其中的学员一部分效忠于Hi先生,一部分效忠于John。每个节点代表空手道联系着,边代表空手道之外这些成员的互动,预测问题就是判断这些节点是效忠于谁的。
边级任务其实就是预测每个边的属性.
在目标检测的语义分割任务中,我们也许不止要识别每个目标的类型,还需要预测各个目标之间的关系.我们可以将其描述为边级别的分类任务:给定表示图像中的对象的节点,我们希望预测哪些节点共享一条边,或者该边的值是多少。如果我们希望发现实体之间的连接,我们可以考虑图是完全连通的,并根据它们的预测值修剪边来得到一个稀疏图。
用图表示就是这样的过程:
那么我们要如何使用神经网络来处理上述各种类型的任务呢?
首先要考虑的是如何将图结构数据适配到神经网络.
回想一下啊,传统的神经网络输入的往往是矩阵形式的数据,那么要如何把图作为输入呢?
图表示有四种类型的信息:节点(nodes),边(edges),全局上下文(global-context),联通性(connectivity).对于前三种信息,有一个非常简单的方案,比如将节点排序,然后每个节点表示为一个向量,所有节点就得到了一个节点的矩阵,同理,边和上下文也可以这么搞.
但是要标识连通性就没有这么简单了,也许你会想到用临街矩阵来表示,但是这样表示会有明显的缺陷,因为节点数的规模往往是巨大的,对于一个数百万节点的图,那将耗费大量的空间,而且得到的矩阵往往也十分的稀疏,可以说空间利用率会很低.
当然,你也许会想,可以用稀疏矩阵来存储,这样就只需要存储连通的情况,空间利用率将大大提升,但是我们还要考虑到一点,就是稀疏矩阵的高性能计算一直是个艰难的,尤其是在用到GPU的情况.
并且,使用邻接矩阵还有一个问题就是各种不同的邻接矩阵可以标识相同的连通性,而这些矩阵并不能保证在神经网络中取的相同的效果.比如,同样的连通性,通过调换列的顺序,就能得到不同的邻接矩阵:
现在,我们成功的将图结构成功表示成了置换不变的矩阵格式,终于可以使用图形神经网络(GNN)来做图形预测任务了。
GNN是对保持图对称性(置换不变性)的图的所有属性(节点、边、全局上下文)的可优化变换。
我们将使用Gilmer等人提出的“消息传递神经网络”框架构建GNN,并使用Battaglia等人介绍的图网络网络架构示意图。GNNS采用“图输入,图输出”架构,这意味着这些模型类型接受图作为输入,其中包含节点,边和全局上下文的信息,并逐步地转换这些图嵌入,而不会更改输入的连接图结构。
我们使用最开始提到的那个图来构建一个最简单的GNN,输入的图是相应节点,边,全局信息的向量,我们针对每个向量使用一个MLP层来作变换,于是得到一个新的图.
针对上述构建的最简单的GNN,我们如何在上面描述的任何任务中进行预测呢?这里我们仅仅考虑二进制分类的情况,但这个框架可以很容易地扩展到多类或回归的情况。
如果是对节点分类,我们只要在最后一层接一个线性类器就可以了:
但是上面的预测过程有点过于简单了,完全没有用到图的结构信息,我们在此基础上增加一个pooling操作,以增加它的边缘信息:
具体操作是把待预测节点的邻居节点以及全局的信息进行聚合再做预测,即将这些embedding向量加到一起得到一个新的向量,再输入到最后的线性分类器.
同理,如果我们只有节点相应边的信息的话,也可以用类似的方式pooling,然后得到节点的向量表示再输入分类器:
反之,如果我们只有节点的信息,那么也可以用边所连接的两个节点来pooling出边的向量,然后将器输入到分类器预测边的类型:
显然,不管是哪种任务,整个GNN的推理过程都是一样的,可以表示为这样一个端到端的过程:
不过,显而易见的,这个简单的GNN在分类前只是对每个向量进行了一个变换,而没有用到图结构的任何信息,虽然在最后做预测的时候做了一些pooling的聚合,但也始终没有用到adjacency的信息,因此这个GNN的作用相当有限,但是它为我们提供了一个图结构层变换和堆叠的基本思路.
针对上面最简单GNN的不足,我们可以在其中根据连通性增加更加复杂的变换从而引入整个图结构的信息,我们将这个过程称之为信息传递.
信息传递包含三个步骤:
这个过程有点类似于卷积操作,每个节点汇聚了其邻居的节点,经过多个层的变换,它将涵盖全图的信息.
于是我们可以将这个节点信息传递应用到上述的图变换过程中:
然后,我们发现它并没用用上边的信息,于是可以把边信息也加上,变成这样:
既然把边的信息加上了,那怎么可以漏掉全局信息呢,于是完整的信息传递就可以表示成这样:
以上,我们梳理了最简单的GNNs是怎么完成的,你应该已经对GNN有了一个基本的了解,就像学会了传统神经网络中最简单的全连接网络类似,关于GNN还有更多不同种类的更复杂的图需要取了解和学习,但你只要掌握了以上的思想,学习起来也是十分容易的.
4. GNN(一) 图神经网络基本知识
图是由点和边构成的,它可以分为两种表示方法分别是: 1. 有向图 2. 无向图
图像的度分为两种:1. 有向图的度 2. 无向图的度
①度 可以理解为点之间的连接线 ②入度指向当前节点的连线, 出度当前节点连出去的连线
子图表示某张图的子集
对于一个无向图,如果任意的节点i能够通过一些边达到节点j,则称之为连通图
其中对于图中任意两点都可以 相互 到达,我们称之为强连通图,反之称为弱连通图。
可以理解为所有的连通在一起的图算一个连通分量。如上图左边连通分量是1, 右边连通分量是2。
图中的两个节点所能达到的最短路径。
图中的两两节点最短路径最大的值称之为图直径。
在图论和网络分析中,中心性(Centrality)是判断网络中节点重要性/影响力的指标。在社会网络分析中,一项基本的任务就是鉴定一群人中哪些人比其他人更有影响力,从而帮助我们理解他们在网络中扮演的角色。
公式:
重要的节点就是拥有许多连接的节点, 你的社会关系越多, 你的影响力就越强
思想就是与你连接的人越重要,你也就越重要
公式:
中间成员对路径两端的成员具有“更大的人际关系影响”。
接近中心性高的节点一般扮演的是八婆的角色(gossiper)。他们不一定是名人,但是乐于在不同的人群之间传递消息。
指出去的为hub, 被指的为authority
5. 如何用matlab做神经网络结构图
给你一个实例,希望通过该例子对实现神经网络应用有一定的了解。
%x,y分别为输入和目标向量
x=1:5;
y=[639 646 642 624 652];
%创建一个前馈网络
net=newff(minmax(x),[20,1],{'tansig','purelin'});
%仿真未经训练的网络net并画图
y1=sim(net,x);plot(x,y1,':');
%采用L-M优化算法
net.trainFcn='trainlm';
%设置训练算法
net.trainParam.epochs=500;net.trainParam.goal=10^(-6);
%调用相应算法训练BP网络
[net,tr,]=train(net,x,y);
%对BP网络进行仿真
y1=sim(net,x);
%计算仿真误差
E=y-y1;MSE=mse(E)
hold on
%绘制匹配结果曲线
figure;
plot(x,y1,'r*',x,y,'b--')
执行结果
6. 一文看懂四种基本的神经网络架构
原文链接:
http://blackblog.tech/2018/02/23/Eight-Neural-Network/
更多干货就在我的个人博客 http://blackblog.tech 欢迎关注
刚刚入门神经网络,往往会对众多的神经网络架构感到困惑,神经网络看起来复杂多样,但是这么多架构无非也就是三类,前馈神经网络,循环网络,对称连接网络,本文将介绍四种常见的神经网络,分别是CNN,RNN,DBN,GAN。通过这四种基本的神经网络架构,我们来对神经网络进行一定的了解。
神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
一般来说,神经网络的架构可以分为三类:
前馈神经网络:
这是实际应用中最常见的神经网络类型。第一层是输入,最后一层是输出。如果有多个隐藏层,我们称之为“深度”神经网络。他们计算出一系列改变样本相似性的变换。各层神经元的活动是前一层活动的非线性函数。
循环网络:
循环网络在他们的连接图中定向了循环,这意味着你可以按照箭头回到你开始的地方。他们可以有复杂的动态,使其很难训练。他们更具有生物真实性。
循环网络的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。
循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
对称连接网络:
对称连接网络有点像循环网络,但是单元之间的连接是对称的(它们在两个方向上权重相同)。比起循环网络,对称连接网络更容易分析。这个网络中有更多的限制,因为它们遵守能量函数定律。没有隐藏单元的对称连接网络被称为“Hopfield 网络”。有隐藏单元的对称连接的网络被称为玻尔兹曼机。
其实之前的帖子讲过一些关于感知机的内容,这里再复述一下。
首先还是这张图
这是一个M-P神经元
一个神经元有n个输入,每一个输入对应一个权值w,神经元内会对输入与权重做乘法后求和,求和的结果与偏置做差,最终将结果放入激活函数中,由激活函数给出最后的输出,输出往往是二进制的,0 状态代表抑制,1 状态代表激活。
可以把感知机看作是 n 维实例空间中的超平面决策面,对于超平面一侧的样本,感知器输出 1,对于另一侧的实例输出 0,这个决策超平面方程是 w⋅x=0。 那些可以被某一个超平面分割的正反样例集合称为线性可分(linearly separable)样例集合,它们就可以使用图中的感知机表示。
与、或、非问题都是线性可分的问题,使用一个有两输入的感知机能容易地表示,而异或并不是一个线性可分的问题,所以使用单层感知机是不行的,这时候就要使用多层感知机来解决疑惑问题了。
如果我们要训练一个感知机,应该怎么办呢?
我们会从随机的权值开始,反复地应用这个感知机到每个训练样例,只要它误分类样例就修改感知机的权值。重复这个过程,直到感知机正确分类所有的样例。每一步根据感知机训练法则来修改权值,也就是修改与输入 xi 对应的权 wi,法则如下:
这里 t 是当前训练样例的目标输出,o 是感知机的输出,η 是一个正的常数称为学习速率。学习速率的作用是缓和每一步调整权的程度,它通常被设为一个小的数值(例如 0.1),而且有时会使其随着权调整次数的增加而衰减。
多层感知机,或者说是多层神经网络无非就是在输入层与输出层之间加了多个隐藏层而已,后续的CNN,DBN等神经网络只不过是将重新设计了每一层的类型。感知机可以说是神经网络的基础,后续更为复杂的神经网络都离不开最简单的感知机的模型,
谈到机器学习,我们往往还会跟上一个词语,叫做模式识别,但是真实环境中的模式识别往往会出现各种问题。比如:
图像分割:真实场景中总是掺杂着其它物体。很难判断哪些部分属于同一个对象。对象的某些部分可以隐藏在其他对象的后面。
物体光照:像素的强度被光照强烈影响。
图像变形:物体可以以各种非仿射方式变形。例如,手写也可以有一个大的圆圈或只是一个尖头。
情景支持:物体所属类别通常由它们的使用方式来定义。例如,椅子是为了让人们坐在上面而设计的,因此它们具有各种各样的物理形状。
卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。
卷积神经网络由三部分构成。第一部分是输入层。第二部分由n个卷积层和池化层的组合组成。第三部分由一个全连结的多层感知机分类器构成。
这里举AlexNet为例:
·输入:224×224大小的图片,3通道
·第一层卷积:11×11大小的卷积核96个,每个GPU上48个。
·第一层max-pooling:2×2的核。
·第二层卷积:5×5卷积核256个,每个GPU上128个。
·第二层max-pooling:2×2的核。
·第三层卷积:与上一层是全连接,3*3的卷积核384个。分到两个GPU上个192个。
·第四层卷积:3×3的卷积核384个,两个GPU各192个。该层与上一层连接没有经过pooling层。
·第五层卷积:3×3的卷积核256个,两个GPU上个128个。
·第五层max-pooling:2×2的核。
·第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入。
·第二层全连接:4096维
·Softmax层:输出为1000,输出的每一维都是图片属于该类别的概率。
卷积神经网络在模式识别领域有着重要应用,当然这里只是对卷积神经网络做了最简单的讲解,卷积神经网络中仍然有很多知识,比如局部感受野,权值共享,多卷积核等内容,后续有机会再进行讲解。
传统的神经网络对于很多问题难以处理,比如你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。
这是一个简单的RNN的结构,可以看到隐藏层自己是可以跟自己进行连接的。
那么RNN为什么隐藏层能够看到上一刻的隐藏层的输出呢,其实我们把这个网络展开来开就很清晰了。
从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。
如果反复把式2带入到式1,我们将得到:
在讲DBN之前,我们需要对DBN的基本组成单位有一定的了解,那就是RBM,受限玻尔兹曼机。
首先什么是玻尔兹曼机?
[图片上传失败...(image-d36b31-1519636788074)]
如图所示为一个玻尔兹曼机,其蓝色节点为隐层,白色节点为输入层。
玻尔兹曼机和递归神经网络相比,区别体现在以下几点:
1、递归神经网络本质是学习一个函数,因此有输入和输出层的概念,而玻尔兹曼机的用处在于学习一组数据的“内在表示”,因此其没有输出层的概念。
2、递归神经网络各节点链接为有向环,而玻尔兹曼机各节点连接成无向完全图。
而受限玻尔兹曼机是什么呢?
最简单的来说就是加入了限制,这个限制就是将完全图变成了二分图。即由一个显层和一个隐层构成,显层与隐层的神经元之间为双向全连接。
h表示隐藏层,v表示显层
在RBM中,任意两个相连的神经元之间有一个权值w表示其连接强度,每个神经元自身有一个偏置系数b(对显层神经元)和c(对隐层神经元)来表示其自身权重。
具体的公式推导在这里就不展示了
DBN是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和 P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。
DBN由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成,一个典型的神经网络类型如图所示。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。
生成对抗网络其实在之前的帖子中做过讲解,这里在说明一下。
生成对抗网络的目标在于生成,我们传统的网络结构往往都是判别模型,即判断一个样本的真实性。而生成模型能够根据所提供的样本生成类似的新样本,注意这些样本是由计算机学习而来的。
GAN一般由两个网络组成,生成模型网络,判别模型网络。
生成模型 G 捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声 z 生成一个类似真实训练数据的样本,追求效果是越像真实样本越好;判别模型 D 是一个二分类器,估计一个样本来自于训练数据(而非生成数据)的概率,如果样本来自于真实的训练数据,D 输出大概率,否则,D 输出小概率。
举个例子:生成网络 G 好比假币制造团伙,专门制造假币,判别网络 D 好比警察,专门检测使用的货币是真币还是假币,G 的目标是想方设法生成和真币一样的货币,使得 D 判别不出来,D 的目标是想方设法检测出来 G 生成的假币。
传统的判别网络:
生成对抗网络:
下面展示一个cDCGAN的例子(前面帖子中写过的)
生成网络
判别网络
最终结果,使用MNIST作为初始样本,通过学习后生成的数字,可以看到学习的效果还是不错的。
本文非常简单的介绍了四种神经网络的架构,CNN,RNN,DBN,GAN。当然也仅仅是简单的介绍,并没有深层次讲解其内涵。这四种神经网络的架构十分常见,应用也十分广泛。当然关于神经网络的知识,不可能几篇帖子就讲解完,这里知识讲解一些基础知识,帮助大家快速入(zhuang)门(bi)。后面的帖子将对深度自动编码器,Hopfield 网络长短期记忆网络(LSTM)进行讲解。
7. 如何通过人工神经网络实现图像识别
人工神经网络(Artificial Neural Networks)(简称ANN)系统从20 世纪40 年代末诞生至今仅短短半个多世纪,但由于他具有信息的分布存储、并行处理以及自学习能力等优点,已经在信息处理、模式识别、智能控制及系统建模等领域得到越来越广泛的应用。尤其是基于误差反向传播(Error Back Propagation)算法的多层前馈网络(Multiple-Layer Feedforward Network)(简称BP 网络),可以以任意精度逼近任意的连续函数,所以广泛应用于非线性建模、函数逼近、模式分类等方面。
目标识别是模式识别领域的一项传统的课题,这是因为目标识别不是一个孤立的问题,而是模式识别领域中大多数课题都会遇到的基本问题,并且在不同的课题中,由于具体的条件不同,解决的方法也不尽相同,因而目标识别的研究仍具有理论和实践意义。这里讨论的是将要识别的目标物体用成像头(红外或可见光等)摄入后形成的图像信号序列送入计算机,用神经网络识别图像的问题。
一、BP 神经网络
BP 网络是采用Widrow-Hoff 学习算法和非线性可微转移函数的多层网络。一个典型的BP 网络采用的是梯度下降算法,也就是Widrow-Hoff 算法所规定的。backpropagation 就是指的为非线性多层网络计算梯度的方法。一个典型的BP 网络结构如图所示。
六、总结
从上述的试验中已经可以看出,采用神经网络识别是切实可行的,给出的例子只是简单的数字识别实验,要想在网络模式下识别复杂的目标图像则需要降低网络规模,增加识别能力,原理是一样的。