❶ 神经网络浅谈
人工智能技术是当前炙手可热的话题,而基于神经网络的深度学习技术更是热点中的热点。去年谷歌的Alpha Go 以4:1大比分的优势战胜韩国的李世石九段,展现了深度学习的强大威力,后续强化版的Alpha Master和无师自通的Alpha Zero更是在表现上完全碾压前者。不论你怎么看,以深度学习为代表的人工智能技术正在塑造未来。
下图为英伟达(NVIDIA)公司近年来的股价情况, 该公司的主要产品是“图形处理器”(GPU),而GPU被证明能大大加快神经网络的训练速度,是深度学习必不可少的计算组件。英伟达公司近年来股价的飞涨足以证明当前深度学习的井喷之势。
好,话不多说,下面简要介绍神经网络的基本原理、发展脉络和优势。
神经网络是一种人类由于受到生物神经细胞结构启发而研究出的一种算法体系,是机器学习算法大类中的一种。首先让我们来看人脑神经元细胞:
一个神经元通常具有多个树突 ,主要用来接受传入信息,而轴突只有一条,轴突尾端有许多轴突末梢,可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。
下图是一个经典的神经网络(Artificial Neural Network,ANN):
乍一看跟传统互联网的拓扑图有点类似,这也是称其为网络的原因,不同的是节点之间通过有向线段连接,并且节点被分成三层。我们称图中的圆圈为神经元,左边三个神经元组成的一列为输入层,中间神经元列为隐藏层,右边神经元列为输出层,神经元之间的箭头为权重。
神经元是计算单元,相当于神经元细胞的细胞核,利用输入的数据进行计算,然后输出,一般由一个线性计算部分和一个非线性计算部分组成;输入层和输出层实现数据的输入输出,相当于细胞的树突和轴突末梢;隐藏层指既不是输入也不是输出的神经元层,一个神经网络可以有很多个隐藏层。
神经网络的关键不是圆圈代表的神经元,而是每条连接线对应的权重。每条连接线对应一个权重,也就是一个参数。权重具体的值需要通过神经网络的训练才能获得。我们实际生活中的学习体现在大脑中就是一系列神经网络回路的建立与强化,多次重复的学习能让回路变得更加粗壮,使得信号的传递速度加快,最后对外表现为“深刻”的记忆。人工神经网络的训练也借鉴于此,如果某种映射关系出现很多次,那么在训练过程中就相应调高其权重。
1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP:
符号化后的模型如下:
Sum函数计算各权重与输入乘积的线性组合,是神经元中的线性计算部分,而sgn是取符号函数,当输入大于0时,输出1,反之输出0,是神经元中的非线性部分。向量化后的公式为z=sgn(w^T a)(w^T=(w_1,w_2,w_3),a=〖(a_1,a_2,a_3)〗^T)。
但是,MP模型中,权重的值都是预先设置的,因此不能学习。该模型虽然简单,并且作用有限,但已经建立了神经网络大厦的地基
1958年,计算科学家Rosenblatt提出了由两层神经元组成(一个输入层,一个输出层)的神经网络。他给它起了一个名字–“感知器”(Perceptron)
感知器是当时首个可以学习的人工神经网络。Rosenblatt现场演示了其学习识别简单图像的过程,在当时引起了轰动,掀起了第一波神经网络的研究热潮。
但感知器只能做简单的线性分类任务。1969年,人工智能领域的巨擘Minsky指出这点,并同时指出感知器对XOR(异或,即两个输入相同时输出0,不同时输出1)这样的简单逻辑都无法解决。所以,明斯基认为神经网络是没有价值的。
随后,神经网络的研究进入低谷,又称 AI Winter 。
Minsky说过单层神经网络无法解决异或问题,但是当增加一个计算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分类效果。
下图为两层神经网络(输入层一般不算在内):
上图中,输出层的输入是上一层的输出。
向量化后的公式为:
注意:
每个神经元节点默认都有偏置变量b,加上偏置变量后的计算公式为:
同时,两层神经网络不再使用sgn函数作为激励函数,而采用平滑的sigmoid函数:
σ(z)=1/(1+e^(-z) )
其图像如下:
理论证明: 两层及以上的神经网络可以无限逼近真实的对应函数,从而模拟数据之间的真实关系 ,这是神经网络强大预测能力的根本。但两层神经网络的计算量太大,当时的计算机的计算能力完全跟不上,直到1986年,Rumelhar和Hinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,带动了业界使用两层神经网络研究的热潮。
但好景不长,算法的改进仅使得神经网络风光了几年,然而计算能力不够,局部最优解,调参等一系列问题一直困扰研究人员。90年代中期,由Vapnik等人发明的SVM(Support Vector Machines,支持向量机)算法诞生,很快就在若干个方面体现出了对比神经网络的优势:无需调参;高效;全局最优解。
由于以上原因,SVM迅速打败了神经网络算法成为主流。神经网络的研究再一次进入低谷, AI Winter again 。
多层神经网络一般指两层或两层以上的神经网络(不包括输入层),更多情况下指两层以上的神经网络。
2006年,Hinton提出使用 预训练 ”(pre-training)和“微调”(fine-tuning)技术能优化神经网络训练,大幅度减少训练多层神经网络的时间
并且,他给多层神经网络相关的学习方法赋予了一个新名词–“ 深度学习 ”,以此为起点,“深度学习”纪元开始了:)
“深度学习”一方面指神经网络的比较“深”,也就是层数较多;另一方面也可以指神经网络能学到很多深层次的东西。研究发现,在权重参数不变的情况下,增加神经网络的层数,能增强神经网络的表达能力。
但深度学习究竟有多强大呢?没人知道。2012年,Hinton与他的学生在ImageNet竞赛中,用多层的卷积神经网络成功地对包含一千类别的一百万张图片进行了训练,取得了分类错误率15%的好成绩,这个成绩比第二名高了近11个百分点,充分证明了多层神经网络识别效果的优越性。
同时,科研人员发现GPU的大规模并行矩阵运算模式完美地契合神经网络训练的需要,在同等情况下,GPU的速度要比CPU快50-200倍,这使得神经网络的训练时间大大减少,最终再一次掀起了神经网络研究的热潮,并且一直持续到现在。
2016年基于深度学习的Alpha Go在围棋比赛中以4:1的大比分优势战胜了李世石,深度学习的威力再一次震惊了世界。
神经网络的发展历史曲折荡漾,既有被捧上神坛的高潮,也有无人问津的低谷,中间经历了数次大起大落,我们姑且称之为“三起三落”吧,其背后则是算法的改进和计算能力的持续发展。
下图展示了神经网络自发明以来的发展情况及一些重大时间节点。
当然,对于神经网络我们也要保持清醒的头脑。由上图,每次神经网络研究的兴盛期持续10年左右,从最近2012年算起,或许10年后的2022年,神经网络的发展将再次遇到瓶颈。
神经网络作为机器学习的一种,其模型训练的目的,就是使得参数尽可能的与真实的模型逼近。理论证明,两层及以上的神经网络可以无限逼近真实的映射函数。因此,给定足够的训练数据和训练时间,总能通过神经网络找到无限逼近真实关系的模型。
具体做法:首先给所有权重参数赋上随机值,然后使用这些随机生成的参数值,来预测训练数据中的样本。假设样本的预测目标为yp ,真实目标为y,定义值loss,计算公式如下:
loss = (yp -y) ^2
这个值称之为 损失 (loss),我们的目标就是使对所有训练数据的损失和尽可能的小,这就转化为求loss函数极值的问题。
一个常用方法是高等数学中的求导,但由于参数不止一个,求导后计算导数等于0的运算量很大,所以常用梯度下降算法来解决这样的优化问题。梯度是一个向量,由函数的各自变量的偏导数组成。
比如对二元函数 f =(x,y),则梯度∇f=(∂f/∂x,∂f/∂y)。梯度的方向是函数值上升最快的方向。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。下图为梯度下降的大致运行过程:
在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用 反向传播 (Back Propagation)算法。反向传播算法利用了神经网络的结构进行计算,不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。当然,梯度下降只是其中一个优化算法,其他的还有牛顿法、RMSprop等。
确定loss函数的最小值后,我们就确定了整个神经网络的权重,完成神经网络的训练。
在神经网络中一样的参数数量,可以用更深的层次去表达。
由上图,不算上偏置参数的话,共有三层神经元,33个权重参数。
由下图,保持权重参数不变,但增加了两层神经元。
在多层神经网络中,每一层的输入是前一层的输出,相当于在前一层的基础上学习,更深层次的神经网络意味着更深入的表示特征,以及更强的函数模拟能力。更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。
如上图,第一个隐藏层学习到“边缘”的特征,第二个隐藏层学习到“边缘”组成的“形状”的特征,第三个隐藏层学习到由“形状”组成的“图案”的特征,最后的隐藏层学习到由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。
前面提到, 明斯基认为Rosenblatt提出的感知器模型不能处理最简单的“异或”(XOR)非线性问题,所以神经网络的研究没有前途,但当增加一层神经元后,异或问题得到了很好地解决,原因何在?原来从输入层到隐藏层,数据发生了空间变换,坐标系发生了改变,因为矩阵运算本质上就是一种空间变换。
如下图,红色和蓝色的分界线是最终的分类结果,可以看到,该分界线是一条非常平滑的曲线。
但是,改变坐标系后,分界线却表现为直线,如下图:
同时,非线性激励函数的引入使得神经网络对非线性问题的表达能力大大加强。
对于传统的朴素贝叶斯、决策树、支持向量机SVM等分类器,提取特征是一个非常重要的前置工作。在正式训练之前,需要花费大量的时间在数据的清洗上,这样分类器才能清楚地知道数据的维度,要不然基于概率和空间距离的线性分类器是没办法进行工作的。然而在神经网络中,由于巨量的线性分类器的堆叠(并行和串行)以及卷积神经网络的使用,它对噪声的忍耐能力、对多通道数据上投射出来的不同特征偏向的敏感程度会自动重视或忽略,这样我们在处理的时候,就不需要使用太多的技巧用于数据的清洗了。有趣的是,业内大佬常感叹,“你可能知道SVM等机器学习的所有细节,但是效果并不好,而神经网络更像是一个黑盒,很难知道它究竟在做什么,但工作效果却很好”。
人类对机器学习的环节干预越少,就意味着距离人工智能的方向越近。神经网络的这个特性非常有吸引力。
1) 谷歌的TensorFlow开发了一个非常有意思的神经网络 入门教程 ,用户可以非常方便地在网页上更改神经网络的参数,并且能看到实时的学习效率和结果,非常适合初学者掌握神经网络的基本概念及神经网络的原理。网页截图如下:
2) 深度学习领域大佬吴恩达不久前发布的《 神经网络和深度学习 》MOOC,现在可以在网易云课堂上免费观看了,并且还有中文字幕。
3) 《神经网络于深度学习》(Michael Nielsen着)、《白话深度学习与TensorFlow》也是不错的入门书籍。
❷ 人工神经网络概念梳理与实例演示
人工神经网络概念梳理与实例演示
神经网络是一种模仿生物神经元的机器学习模型,数据从输入层进入并流经激活阈值的多个节点。
递归性神经网络一种能够对之前输入数据进行内部存储记忆的神经网络,所以他们能够学习到数据流中的时间依赖结构。
如今机器学习已经被应用到很多的产品中去了,例如,siri、Google Now等智能助手,推荐引擎——亚马逊网站用于推荐商品的推荐引擎,Google和Facebook使用的广告排名系统。最近,深度学习的一些进步将机器学习带入公众视野:AlphaGo 打败围棋大师李世石事件以及一些图片识别和机器翻译等新产品的出现。
在这部分中,我们将介绍一些强大并被普遍使用的机器学习技术。这当然包括一些深度学习以及一些满足现代业务需求传统方法。读完这一系列的文章之后,你就掌握了必要的知识,便可以将具体的机器学习实验应用到你所在的领域当中。
随着深层神经网络的精度的提高,语音和图像识别技术的应用吸引了大众的注意力,关于AI和深度学习的研究也变得更加普遍了。但是怎么能够让它进一步扩大影响力,更受欢迎仍然是一个问题。这篇文章的主要内容是:简述前馈神经网络和递归神经网络、怎样搭建一个递归神经网络对时间系列数据进行异常检测。为了让我们的讨论更加具体化,我们将演示一下怎么用Deeplearning4j搭建神经网络。
一、什么是神经网络?
人工神经网络算法的最初构思是模仿生物神经元。但是这个类比很不可靠。人工神经网络的每一个特征都是对生物神经元的一种折射:每一个节点与激活阈值、触发的连接。
连接人工神经元系统建立起来之后,我们就能够对这些系统进行训练,从而让他们学习到数据中的一些模式,学到之后就能执行回归、分类、聚类、预测等功能。
人工神经网络可以看作是计算节点的集合。数据通过这些节点进入神经网络的输入层,再通过神经网络的隐藏层直到关于数据的一个结论或者结果出现,这个过程才会停止。神经网络产出的结果会跟预期的结果进行比较,神经网络得出的结果与正确结果的不同点会被用来更正神经网络节点的激活阈值。随着这个过程的不断重复,神经网络的输出结果就会无限靠近预期结果。
二、训练过程
在搭建一个神经网络系统之前,你必须先了解训练的过程以及网络输出结果是怎么产生的。然而我们并不想过度深入的了解这些方程式,下面是一个简短的介绍。
网络的输入节点收到一个数值数组(或许是叫做张量多维度数组)就代表输入数据。例如, 图像中的每个像素可以表示为一个标量,然后将像素传递给一个节点。输入数据将会与神经网络的参数相乘,这个输入数据被扩大还是减小取决于它的重要性,换句话说,取决于这个像素就不会影响神经网络关于整个输入数据的结论。
起初这些参数都是随机的,也就是说神经网络在建立初期根本就不了解数据的结构。每个节点的激活函数决定了每个输入节点的输出结果。所以每个节点是否能够被激活取决于它是否接受到足够的刺激强度,即是否输入数据和参数的结果超出了激活阈值的界限。
在所谓的密集或完全连接层中,每个节点的输出值都会传递给后续层的节点,在通过所有隐藏层后最终到达输出层,也就是产生输入结果的地方。在输出层, 神经网络得到的最终结论将会跟预期结论进行比较(例如,图片中的这些像素代表一只猫还是狗?)。神经网络猜测的结果与正确结果的计算误差都会被纳入到一个测试集中,神经网络又会利用这些计算误差来不断更新参数,以此来改变图片中不同像素的重要程度。整个过程的目的就是降低输出结果与预期结果的误差,正确地标注出这个图像到底是不是一条狗。
深度学习是一个复杂的过程,由于大量的矩阵系数需要被修改所以它就涉及到矩阵代数、衍生品、概率和密集的硬件使用问题,但是用户不需要全部了解这些复杂性。
但是,你也应该知道一些基本参数,这将帮助你理解神经网络函数。这其中包括激活函数、优化算法和目标函数(也称为损失、成本或误差函数)。
激活函数决定了信号是否以及在多大程度上应该被发送到连接节点。阶梯函数是最常用的激活函数, 如果其输入小于某个阈值就是0,如果其输入大于阈值就是1。节点都会通过阶梯激活函数向连接节点发送一个0或1。优化算法决定了神经网络怎么样学习,以及测试完误差后,权重怎么样被更准确地调整。最常见的优化算法是随机梯度下降法。最后, 成本函数常用来衡量误差,通过对比一个给定训练样本中得出的结果与预期结果的不同来评定神经网络的执行效果。
Keras、Deeplearning4j 等开源框架让创建神经网络变得简单。创建神经网络结构时,需要考虑的是怎样将你的数据类型匹配到一个已知的被解决的问题,并且根据你的实际需求来修改现有结构。
三、神经网络的类型以及应用
神经网络已经被了解和应用了数十年了,但是最近的一些技术趋势才使得深度神经网络变得更加高效。
GPUs使得矩阵操作速度更快;分布式计算结构让计算能力大大增强;多个超参数的组合也让迭代的速度提升。所有这些都让训练的速度大大加快,迅速找到适合的结构。
随着更大数据集的产生,类似于ImageNet 的大型高质量的标签数据集应运而生。机器学习算法训练的数据越大,那么它的准确性就会越高。
最后,随着我们理解能力以及神经网络算法的不断提升,神经网络的准确性在语音识别、机器翻译以及一些机器感知和面向目标的一些任务等方面不断刷新记录。
尽管神经网络架构非常的大,但是主要用到的神经网络种类也就是下面的几种。
3.1前馈神经网络
前馈神经网络包括一个输入层、一个输出层以及一个或多个的隐藏层。前馈神经网络可以做出很好的通用逼近器,并且能够被用来创建通用模型。
这种类型的神经网络可用于分类和回归。例如,当使用前馈网络进行分类时,输出层神经元的个数等于类的数量。从概念上讲, 激活了的输出神经元决定了神经网络所预测的类。更准确地说, 每个输出神经元返回一个记录与分类相匹配的概率数,其中概率最高的分类将被选为模型的输出分类。
前馈神经网络的优势是简单易用,与其他类型的神经网络相比更简单,并且有一大堆的应用实例。
3.2卷积神经网络
卷积神经网络和前馈神经网络是非常相似的,至少是数据的传输方式类似。他们结构大致上是模仿了视觉皮层。卷积神经网络通过许多的过滤器。这些过滤器主要集中在一个图像子集、补丁、图块的特征识别上。每一个过滤器都在寻找不同模式的视觉数据,例如,有的可能是找水平线,有的是找对角线,有的是找垂直的。这些线条都被看作是特征,当过滤器经过图像时,他们就会构造出特征图谱来定位各类线是出现在图像的哪些地方。图像中的不同物体,像猫、747s、榨汁机等都会有不同的图像特征,这些图像特征就能使图像完成分类。卷积神经网络在图像识别和语音识别方面是非常的有效的。
卷积神经网络与前馈神经网络在图像识别方面的异同比较。虽然这两种网络类型都能够进行图像识别,但是方式却不同。卷积神经网络是通过识别图像的重叠部分,然后学习识别不同部分的特征进行训练;然而,前馈神经网络是在整张图片上进行训练。前馈神经网络总是在图片的某一特殊部分或者方向进行训练,所以当图片的特征出现在其他地方时就不会被识别到,然而卷积神经网络却能够很好的避免这一点。
卷积神经网络主要是用于图像、视频、语音、声音识别以及无人驾驶的任务。尽管这篇文章主要是讨论递归神经网络的,但是卷积神经网络在图像识别方面也是非常有效的,所以很有必要了解。
3.3递归神经网络
与前馈神经网络不同的是,递归神经网络的隐藏层的节点里有内部记忆存储功能,随着输入数据的改变而内部记忆内容不断被更新。递归神经网络的结论都是基于当前的输入和之前存储的数据而得出的。递归神经网络能够充分利用这种内部记忆存储状态处理任意序列的数据,例如时间序列。
递归神经网络经常用于手写识别、语音识别、日志分析、欺诈检测和网络安全。
递归神经网络是处理时间维度数据集的最好方法,它可以处理以下数据:网络日志和服务器活动、硬件或者是医疗设备的传感器数据、金融交易、电话记录。想要追踪数据在不同阶段的依赖和关联关系需要你了解当前和之前的一些数据状态。尽管我们通过前馈神经网络也可以获取事件,随着时间的推移移动到另外一个事件,这将使我们限制在对事件的依赖中,所以这种方式很不灵活。
追踪在时间维度上有长期依赖的数据的更好方法是用内存来储存重要事件,以使近期事件能够被理解和分类。递归神经网络最好的一点就是在它的隐藏层里面有“内存”可以学习到时间依赖特征的重要性。
接下来我们将讨论递归神经网络在字符生成器和网络异常检测中的应用。递归神经网络可以检测出不同时间段的依赖特征的能力使得它可以进行时间序列数据的异常检测。
递归神经网络的应用
网络上有很多使用RNNs生成文本的例子,递归神经网络经过语料库的训练之后,只要输入一个字符,就可以预测下一个字符。下面让我们通过一些实用例子发现更多RNNs的特征。
应用一、RNNs用于字符生成
递归神经网络经过训练之后可以把英文字符当做成一系列的时间依赖事件。经过训练后它会学习到一个字符经常跟着另外一个字符(“e”经常跟在“h”后面,像在“the、he、she”中)。由于它能预测下一个字符是什么,所以它能有效地减少文本的输入错误。
Java是个很有趣的例子,因为它的结构包括很多嵌套结构,有一个开的圆括号必然后面就会有一个闭的,花括号也是同理。他们之间的依赖关系并不会在位置上表现的很明显,因为多个事件之间的关系不是靠所在位置的距离确定的。但是就算是不明确告诉递归神经网络Java中各个事件的依赖关系,它也能自己学习了解到。
在异常检测当中,我们要求神经网络能够检测出数据中相似、隐藏的或许是并不明显的模式。就像是一个字符生成器在充分地了解数据的结构后就会生成一个数据的拟像,递归神经网络的异常检测就是在其充分了解数据结构后来判断输入的数据是不是正常。
字符生成的例子表明递归神经网络有在不同时间范围内学习到时间依赖关系的能力,它的这种能力还可以用来检测网络活动日志的异常。
异常检测能够使文本中的语法错误浮出水面,这是因为我们所写的东西是由语法结构所决定的。同理,网络行为也是有结构的,它也有一个能够被学习的可预测模式。经过在正常网络活动中训练的递归神经网络可以监测到入侵行为,因为这些入侵行为的出现就像是一个句子没有标点符号一样异常。
应用二、一个网络异常检测项目的示例
假设我们想要了解的网络异常检测就是能够得到硬件故障、应用程序失败、以及入侵的一些信息。
模型将会向我们展示什么呢?
随着大量的网络活动日志被输入到递归神经网络中去,神经网络就能学习到正常的网络活动应该是什么样子的。当这个被训练的网络被输入新的数据时,它就能偶判断出哪些是正常的活动,哪些是被期待的,哪些是异常的。
训练一个神经网络来识别预期行为是有好处的,因为异常数据不多,或者是不能够准确的将异常行为进行分类。我们在正常的数据里进行训练,它就能够在未来的某个时间点提醒我们非正常活动的出现。
说句题外话,训练的神经网络并不一定非得识别到特定事情发生的特定时间点(例如,它不知道那个特殊的日子就是周日),但是它一定会发现一些值得我们注意的一些更明显的时间模式和一些可能并不明显的事件之间的联系。
我们将概述一下怎么用 Deeplearning4j(一个在JVM上被广泛应用的深度学习开源数据库)来解决这个问题。Deeplearning4j在模型开发过程中提供了很多有用的工具:DataVec是一款为ETL(提取-转化-加载)任务准备模型训练数据的集成工具。正如Sqoop为Hadoop加载数据,DataVec将数据进行清洗、预处理、规范化与标准化之后将数据加载到神经网络。这跟Trifacta’s Wrangler也相似,只不过它更关注二进制数据。
开始阶段
第一阶段包括典型的大数据任务和ETL:我们需要收集、移动、储存、准备、规范化、矢量话日志。时间跨度的长短是必须被规定好的。数据的转化需要花费一些功夫,这是由于JSON日志、文本日志、还有一些非连续标注模式都必须被识别并且转化为数值数组。DataVec能够帮助进行转化和规范化数据。在开发机器学习训练模型时,数据需要分为训练集和测试集。
训练神经网络
神经网络的初始训练需要在训练数据集中进行。
在第一次训练的时候,你需要调整一些超参数以使模型能够实现在数据中学习。这个过程需要控制在合理的时间内。关于超参数我们将在之后进行讨论。在模型训练的过程中,你应该以降低错误为目标。
但是这可能会出现神经网络模型过度拟合的风险。有过度拟合现象出现的模型往往会在训练集中的很高的分数,但是在遇到新的数据时就会得出错误结论。用机器学习的语言来说就是它不够通用化。Deeplearning4J提供正则化的工具和“过早停止”来避免训练过程中的过度拟合。
神经网络的训练是最花费时间和耗费硬件的一步。在GPUs上训练能够有效的减少训练时间,尤其是做图像识别的时候。但是额外的硬件设施就带来多余的花销,所以你的深度学习的框架必须能够有效的利用硬件设施。Azure和亚马逊等云服务提供了基于GPU的实例,神经网络还可以在异构集群上进行训练。
创建模型
Deeplearning4J提供ModelSerializer来保存训练模型。训练模型可以被保存或者是在之后的训练中被使用或更新。
在执行异常检测的过程中,日志文件的格式需要与训练模型一致,基于神经网络的输出结果,你将会得到是否当前的活动符合正常网络行为预期的结论。
代码示例
递归神经网络的结构应该是这样子的:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder(
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
.weightInit(WeightInit.XAVIER)
.updater(Updater.NESTEROVS).momentum(0.9)
.learningRate(0.005)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.(0.5)
.list()
.layer(0, new GravesLSTM.Builder().activation("tanh").nIn(1).nOut(10).build())
.layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.activation("softmax").nIn(10).nOut(numLabelClasses).build())
.pretrain(false).backprop(true).build();
MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();
下面解释一下几行重要的代码:
.seed(123)
随机设置一个种子值对神经网络的权值进行初始化,以此获得一个有复验性的结果。系数通常都是被随机的初始化的,以使我们在调整其他超参数时仍获得一致的结果。我们需要设定一个种子值,让我们在调整和测试的时候能够用这个随机的权值。
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
决定使用哪个最优算法(在这个例子中是随机梯度下降法)来调整权值以提高误差分数。你可能不需要对这个进行修改。
.learningRate(0.005)
当我们使用随机梯度下降法的时候,误差梯度就被计算出来了。在我们试图将误差值减到最小的过程中,权值也随之变化。SGD给我们一个让误差更小的方向,这个学习效率就决定了我们该在这个方向上迈多大的梯度。如果学习效率太高,你可能是超过了误差最小值;如果太低,你的训练可能将会永远进行。这是一个你需要调整的超参数。
❸ 神经网络的发展趋势如何
神经网络的云集成模式还不是很成熟,应该有发展潜力,但神经网络有自己的硬伤,不知道能够达到怎样的效果,所以决策支持系统中并不是很热门,但是神经网络无视过程的优点也是无可替代的,云网络如果能够对神经网络提供一个互补的辅助决策以控制误差的话,也许就能使神经网络成熟起来
1 人工神经网络产生的背景
自古以来,关于人类智能本源的奥秘,一直吸引着无数哲学家和自然科学家的研究热情。生物学家、神经学家经过长期不懈的努力,通过对人脑的观察和认识,认为人脑的智能活动离不开脑的物质基础,包括它的实体结构和其中所发生的各种生物、化学、电学作用,并因此建立了神经元网络理论和神经系统结构理论,而神经元理论又是此后神经传导理论和大脑功能学说的基础。在这些理论基础之上,科学家们认为,可以从仿制人脑神经系统的结构和功能出发,研究人类智能活动和认识现象。另一方面,19世纪之前,无论是以欧氏几何和微积分为代表的经典数学,还是以牛顿力学为代表的经典物理学,从总体上说,这些经典科学都是线性科学。然而,客观世界是如此的纷繁复杂,非线性情况随处可见,人脑神经系统更是如此。复杂性和非线性是连接在一起的,因此,对非线性科学的研究也是我们认识复杂系统的关键。为了更好地认识客观世界,我们必须对非线性科学进行研究。人工神经网络作为一种非线性的、与大脑智能相似的网络模型,就这样应运而生了。所以,人工神经网络的创立不是偶然的,而是20世纪初科学技术充分发展的产物。
2 人工神经网络的发展
人工神经网络的研究始于40年代初。半个世纪以来,经历了兴起、高潮与萧条、高潮及稳步发展的远为曲折的道路。
1943年,心理学家W.S.Mcculloch和数理逻辑学家W.Pitts 提出了M—P模型,这是第一个用数理语言描述脑的信息处理过程的模型, 虽然神经元的功能比较弱,但它为以后的研究工作提供了依据。1949年,心理学家D.O.Hebb提出突触联系可变的假设,根据这一假设提出的学习规律为神经网络的学习算法奠定了基础。 1957 年, 计算机科学家Rosenblatt提出了着名的感知机模型,它的模型包含了现代计算机的一些原理,是第一个完整的人工神经网络,第一次把神经网络研究付诸工程实现。由于可应用于模式识别,联想记忆等方面,当时有上百家实验室投入此项研究,美国军方甚至认为神经网络工程应当比“原子弹工程”更重要而给予巨额资助,并在声纳信号识别等领域取得一定成绩。1960年,B.Windrow和E.Hoff提出了自适应线性单元, 它可用于自适应滤波、预测和模式识别。至此,人工神经网络的研究工作进入了第一个高潮。
1969年,美国着名人工智能学者M.Minsky和S.Papert编写了影响很大的Perceptron一书,从理论上证明单层感知机的能力有限,诸如不能解决异或问题,而且他们推测多层网络的感知机能力也不过如此,他们的分析恰似一瓢冷水,很多学者感到前途渺茫而纷纷改行,原先参与研究的实验室纷纷退出,在这之后近10年,神经网络研究进入了一个缓慢发展的萧条期。这期间,芬兰学者T.Kohonen 提出了自组织映射理论,反映了大脑神经细胞的自组织特性、记忆方式以及神经细胞兴奋刺激的规律;美国学者S.A.Grossberg的自适应共振理论(ART );日本学者K.Fukushima提出了认知机模型;ShunIchimari则致力于神经网络有关数学理论的研究等,这些研究成果对以后的神经网络的发展产生了重要影响。
美国生物物理学家J.J.Hopfield于1982年、1984年在美国科学院院刊发表的两篇文章,有力地推动了神经网络的研究,引起了研究神经网络的又一次热潮。 1982 年, 他提出了一个新的神经网络模型——hopfield网络模型。他在这种网络模型的研究中,首次引入了网络能量函数的概念,并给出了网络稳定性的判定依据。1984年,他又提出了网络模型实现的电子电路,为神经网络的工程实现指明了方向,他的研究成果开拓了神经网络用于联想记忆的优化计算的新途径,并为神经计算机研究奠定了基础。1984年Hinton等人将模拟退火算法引入到神经网络中,提出了Boltzmann机网络模型,BM 网络算法为神经网络优化计算提供了一个有效的方法。1986年,D.E.Rumelhart和J.LMcclelland提出了误差反向传播算法,成为至今为止影响很大的一种网络学习方法。1987年美国神经计算机专家R.Hecht—Nielsen提出了对向传播神经网络,该网络具有分类灵活,算法简练的优点,可用于模式分类、函数逼近、统计分析和数据压缩等领域。1988年L.Ochua 等人提出了细胞神经网络模型,它在视觉初级加工上得到了广泛应用。
为适应人工神经网络的发展,1987年成立了国际神经网络学会,并决定定期召开国际神经网络学术会议。1988年1月Neural Network 创刊。1990年3月IEEE Transaction on Neural Network问世。 我国于1990年12月在北京召开了首届神经网络学术大会,并决定以后每年召开一次。1991 年在南京成立了中国神经网络学会。 IEEE 与INNS 联合召开的IJCNN92已在北京召开。 这些为神经网络的研究和发展起了推波助澜的作用,人工神经网络步入了稳步发展的时期。
90年代初,诺贝尔奖获得者Edelman提出了Darwinism模型,建立了神经网络系统理论。同年,Aihara等在前人推导和实验的基础上,给出了一个混沌神经元模型,该模型已成为一种经典的混沌神经网络模型,该模型可用于联想记忆。 Wunsch 在90OSA 年会上提出了一种AnnualMeeting,用光电执行ART,学习过程有自适应滤波和推理功能,具有快速和稳定的学习特点。1991年,Hertz探讨了神经计算理论, 对神经网络的计算复杂性分析具有重要意义;Inoue 等提出用耦合的混沌振荡子作为某个神经元,构造混沌神经网络模型,为它的广泛应用前景指明了道路。1992年,Holland用模拟生物进化的方式提出了遗传算法, 用来求解复杂优化问题。1993年方建安等采用遗传算法学习,研究神经网络控制器获得了一些结果。1994年Angeline等在前人进化策略理论的基础上,提出一种进化算法来建立反馈神经网络,成功地应用到模式识别,自动控制等方面;廖晓昕对细胞神经网络建立了新的数学理论和方法,得到了一系列结果。HayashlY根据动物大脑中出现的振荡现象,提出了振荡神经网络。1995年Mitra把人工神经网络与模糊逻辑理论、 生物细胞学说以及概率论相结合提出了模糊神经网络,使得神经网络的研究取得了突破性进展。Jenkins等人研究光学神经网络, 建立了光学二维并行互连与电子学混合的光学神经网络,它能避免网络陷入局部最小值,并最后可达到或接近最理想的解;SoleRV等提出流体神经网络,用来研究昆虫社会,机器人集体免疫系统,启发人们用混沌理论分析社会大系统。1996年,ShuaiJW’等模拟人脑的自发展行为, 在讨论混沌神经网络的基础上提出了自发展神经网络。1997、1998年董聪等创立和完善了广义遗传算法,解决了多层前向网络的最简拓朴构造问题和全局最优逼近问题。
随着理论工作的发展,神经网络的应用研究也取得了突破性进展,涉及面非常广泛,就应用的技术领域而言有计算机视觉,语言的识别、理解与合成,优化计算,智能控制及复杂系统分析,模式识别,神经计算机研制,知识推理专家系统与人工智能。涉及的学科有神经生理学、认识科学、数理科学、心理学、信息科学、计算机科学、微电子学、光学、动力学、生物电子学等。美国、日本等国在神经网络计算机软硬件实现的开发方面也取得了显着的成绩,并逐步形成产品。在美国,神经计算机产业已获得军方的强有力支持,国防部高级研究计划局认为“神经网络是解决机器智能的唯一希望”,仅一项8 年神经计算机计划就投资4亿美元。在欧洲共同体的ESPRIT计划中, 就有一项特别项目:“神经网络在欧洲工业中的应用”,单是生产神经网络专用芯片这一项就投资2200万美元。据美国资料声称,日本在神经网络研究上的投资大约是美国的4倍。我国也不甘落后,自从1990 年批准了南开大学的光学神经计算机等3项课题以来, 国家自然科学基金与国防预研基金也都为神经网络的研究提供资助。另外,许多国际着名公司也纷纷卷入对神经网络的研究,如Intel、IBM、Siemens、HNC。神经计算机产品开始走向商用阶段,被国防、企业和科研部门选用。在举世瞩目的海湾战争中,美国空军采用了神经网络来进行决策与控制。在这种刺激和需求下,人工神经网络定会取得新的突破,迎来又一个高潮。自1958年第一个神经网络诞生以来,其理论与应用成果不胜枚举。人工神经网络是一个快速发展着的一门新兴学科,新的模型、新的理论、新的应用成果正在层出不穷地涌现出来。
3 人工神经网络的发展前景
针对神经网络存在的问题和社会需求,今后发展的主要方向可分为理论研究和应用研究两个方面。
(1)利用神经生理与认识科学研究大脑思维及智能的机理、 计算理论,带着问题研究理论。
人工神经网络提供了一种揭示智能和了解人脑工作方式的合理途径,但是由于人类起初对神经系统了解非常有限,对于自身脑结构及其活动机理的认识还十分肤浅,并且带有某种“先验”。例如, Boltzmann机引入随机扰动来避免局部极小,有其卓越之处,然而缺乏必要的脑生理学基础,毫无疑问,人工神经网络的完善与发展要结合神经科学的研究。而且,神经科学,心理学和认识科学等方面提出的一些重大问题,是向神经网络理论研究提出的新挑战,这些问题的解决有助于完善和发展神经网络理论。因此利用神经生理和认识科学研究大脑思维及智能的机理,如有新的突破,将会改变智能和机器关系的认识。
利用神经科学基础理论的研究成果,用数理方法探索智能水平更高的人工神经网络模型,深入研究网络的算法和性能,如神经计算、进化计算、稳定性、收敛性、计算复杂性、容错性、鲁棒性等,开发新的网络数理理论。由于神经网络的非线性,因此非线性问题的研究是神经网络理论发展的一个最大动力。特别是人们发现,脑中存在着混沌现象以来,用混沌动力学启发神经网络的研究或用神经网络产生混沌成为摆在人们面前的一个新课题,因为从生理本质角度出发是研究神经网络的根本手段。
(2)神经网络软件模拟, 硬件实现的研究以及神经网络在各个科学技术领域应用的研究。
由于人工神经网络可以用传统计算机模拟,也可以用集成电路芯片组成神经计算机,甚至还可以用光学的、生物芯片的方式实现,因此研制纯软件模拟,虚拟模拟和全硬件实现的电子神经网络计算机潜力巨大。如何使神经网络计算机与传统的计算机和人工智能技术相结合也是前沿课题;如何使神经网络计算机的功能向智能化发展,研制与人脑功能相似的智能计算机,如光学神经计算机,分子神经计算机,将具有十分诱人的前景。
4 哲理
(1)人工神经网络打开了认识论的新领域
认识与脑的问题,长期以来一直受到人们的关注,因为它不仅是有关人的心理、意识的心理学问题,也是有关人的思维活动机制的脑科学与思维科学问题,而且直接关系到对物质与意识的哲学基本问题的回答。人工神经网络的发展使我们能够更进一步地既唯物又辩证地理解认识与脑的关系,打开认识论的新领域。人脑是一个复杂的并行系统,它具有“认知、意识、情感”等高级脑功能,用人工进行模拟,有利于加深对思维及智能的认识,已对认知和智力的本质的研究产生了极大的推动作用。在研究大脑的整体功能和复杂性方面,人工神经网络给人们带来了新的启迪。由于人脑中存在混沌现象,混沌可用来理解脑中某些不规则的活动,从而混沌动力学模型能用作人对外部世界建模的工具,可用来描述人脑的信息处理过程。混沌和智能是有关的,神经网络中引入混沌学思想有助于提示人类形象思维等方面的奥秘。人工神经网络之所以再度兴起,关键在于它反映了事物的非线性,抓住了客观世界的本质,而且它在一定程度上正面回答了智能系统如何从环境中自主学习这一最关键的问题,从认知的角度讲,所谓学习,就是对未知现象或规律的发现和归纳。由于神经网络具有高度的并行性,高度的非线性全局作用,良好的容错性与联想记忆功能以及十分强的自适应、自学习功能,而使得它成为揭示智能和了解人脑工作方式的合理途径。但是,由于认知问题的复杂性,目前,我们对于脑神经网的运行和神经细胞的内部处理机制,如信息在人脑是如何传输、存贮、加工的?记忆、联想、判断是如何形成的?大脑是否存在一个操作系统?还没有太多的认识,因此要制造人工神经网络来模仿人脑各方面的功能,还有待于人们对大脑信息处理机理认识的深化。
(2)人工神经网络发展的推动力来源于实践、 理论和问题的相互作用
随着人们社会实践范围的不断扩大,社会实践层次的不断深入,人们所接触到的自然现象也越来越丰富多彩、纷繁复杂,这就促使人们用不同的原因加以解释不同种类的自然现象,当不同种类的自然现象可以用同样的原因加以解释,这样就出现了不同学科的相互交叉、综合,人工神经网络就这样产生了。在开始阶段,由于这些理论化的网络模型比较简单,还存在许多问题,而且这些模型几乎没有得到实践的检验,因而神经网络的发展比较缓慢。随着理论研究的深入,问题逐渐地解决特别是工程上得到实现以后,如声纳识别成功,才迎来了神经网络的第一个发展高潮。可Minisky认为感知器不能解决异或问题, 多层感知器也不过如此,神经网络的研究进入了低谷,这主要是因为非线性问题没得到解决。随着理论的不断丰富,实践的不断深入, 现在已证明Minisky的悲观论调是错误的。今天,高度发达的科学技术逐渐揭示了非线性问题是客观世界的本质。问题、理论、实践的相互作用又迎来了人工神经网络的第二次高潮。目前人工神经网络的问题是智能水平不高,还有其它理论和实现方面的问题,这就迫使人们不断地进行理论研究,不断实践,促使神经网络不断向前发展。总之,先前的原因遇到了解释不同的新现象,促使人们提出更加普遍和精确的原因来解释。理论是基础,实践是动力,但单纯的理论和实践的作用还不能推动人工神经网络的发展,还必须有问题提出,才能吸引科学家进入研究的特定范围,引导科学家从事相关研究,从而逼近科学发现,而后实践又提出新问题,新问题又引发新的思考,促使科学家不断思考,不断完善理论。人工神经网络的发展无不体现着问题、理论和实践的辩证统一关系。
(3 )人工神经网络发展的另一推动力来源于相关学科的贡献及不同学科专家的竞争与协同
人工神经网络本身就是一门边缘学科,它的发展有更广阔的科学背景,亦即是众多科研成果的综合产物,控制论创始人Wiener在其巨着《控制论》中就进行了人脑神经元的研究;计算机科学家Turing就提出过B网络的设想;Prigogine提出非平衡系统的自组织理论,获得诺贝尔奖;Haken研究大量元件联合行动而产生宏观效果, 非线性系统“混沌”态的提出及其研究等,都是研究如何通过元件间的相互作用建立复杂系统,类似于生物系统的自组织行为。脑科学与神经科学的进展迅速反映到人工神经网络的研究中,例如生物神经网络理论,视觉中发现的侧抑制原理,感受野概念等,为神经网络的发展起了重要的推动作用。从已提出的上百种人工神经网络模型中,涉及学科之多,令人目不暇接,其应用领域之广,令人叹为观止。不同学科专家为了在这一领域取得领先水平,存在着不同程度的竞争,所有这些有力地推动了人工神经网络的发展。人脑是一个功能十分强大、结构异常复杂的信息系统,随着信息论、控制论、生命科学,计算机科学的发展,人们越来越惊异于大脑的奇妙,至少到目前为止,人类大脑信号处理机制对人类自身来说,仍是一个黑盒子,要揭示人脑的奥秘需要神经学家、心理学家、计算机科学家、微电子学家、数学家等专家的共同努力,对人类智能行为不断深入研究,为人工神经网络发展提供丰富的理论源泉。另外,还要有哲学家的参与,通过哲学思想和自然科学多种学科的深层结合,逐步孕育出探索人类思维本质和规律的新方法,使思维科学从朦胧走向理性。而且,不同领域专家的竞争与协调同有利于问题清晰化和寻求最好的解决途径。纵观神经网络的发展历史,没有相关学科的贡献,不同学科专家的竞争与协同,神经网络就不会有今天。当然,人工神经网络在各个学科领域应用的研究反过来又推动其它学科的发展,推动自身的完善和发展。
❹ 第五章 神经网络
神经网络 :神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
神经网络中最基本的成分便是 神经元模型 。
M-P神经元模型:
感知机由两层神经元组成,分别为输入层、输出层。
以下是具体过程:
多层神经网络的拓扑结构如图:
如上图可知,多层网络由输入层、隐含层和输出层组成,顶层是输出层,底层是输入层,中间的便是隐含层。隐含层与输出层都具有功能神经元。
多层前馈神经网络的结构需要满足:
1、每层神经元必须与下一层完全互连
2、神经元之间不存在同层连接
3、神经元不可跨层连接
只需包含一个足够多神经元的隐层,就能以任意精度逼近任意复杂度的连续函数
BP神经网络由于学习能力太强大比较荣誉造成过拟合问题,故有两种策略来减缓过拟合的问题:
1、早停:将数据分成训练集和验证集,训练集学习,验证集评估性能,在训练过程中,若训练集的累积误差降低,而验证集的累积误差提高,则终止训练;
2、引入正则化:其基本思想是在误差目标函数中增加一个用于描述网络复杂程度的部分,有如连接权和阈值的平方和:
其中λ∈(0,1)用于对累积经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。
神经网络的训练过程可看作一个参数寻优的过程,即寻找到适当的参数使得E最小。于是我们时常会谈及“全局最小”和“局部最小”。
1、全局最小:即全局最小解,在参数空间中,所有其他点的误差函数值均大于该点;
2、局部最小:即局部最小解,在参数空间中,其邻近的点的误差函数值均大于该点。
我们要达到局部极小点,很容易,只要满足梯度为零的点便是了,局部极小点可以有多个,但全局最小点只有一个。显然,我们追求的是全局最小,而非局部极小,于是人们通常采用以下策略来试图“跳出”局部极小,使其接近全局最小:
1、以多组不同参数值初始化多个神经网络,按标准方法训练,在迭代停止后,取其中误差最小的解作为最终参数;
2、使用随机梯度下降(在计算梯度时加入了随机因素),使得在局部最小时,计算的梯度仍可能不为0,从而可能跳出局部极小,继续进行迭代;
3、“模拟退火”技术,在每一步都以一定的概率接受比当前解更差的结果,但接受“次优解”的概率要随着迭代进行,时间推移而逐渐减低以确保算法的稳定。
1、RBF网络
单隐层前馈神经网络 ,使用径向基函数作为隐层神经元激活函数,输出层是对隐层神经元输出的线性组合。RBF网络可表示为:
2、ART网络
竞争型学习 (神经网络中一种常用的 无监督学习 策略),由 比较层、识别层、识别阈值和重置模块 组成。接收到比较层的输入信号后,识别层神经元相互竞争以产生获胜神经元,最简单的方式就是计算输入向量与每个识别层神经元所对应的模式类代表向量间的距离,距离小者获胜。若获胜神经元对应的代表向量与输入向量间 相似度大于识别阈值 ,则将输入样本归为该代表向量所属类别,网络 连接权 也会进行 更新 以保证后面接收到相似的输入样本时该模式类会计算出更大的相似度,使得这样的样本能够归于一类;如果 相似度不大于识别阈值 ,则 重置模块 会在 识别层 加一个神经元,其 代表向量 就 设置 为当前 输入向量 。
3、SOM网络
竞争型学习的无监督神经网络 ,将高维输入数据映射到低维空间(通常是二维),且保持输入数据在高维空间的拓扑结构。
4、级联相关网络
结构自适应网络 。
5、Elman网络
递归神经网络 。
6、Boltzmann机
基于能量的模型,其神经元分为显层与隐层,显层用于数据输入输出,隐层被理解为数据的内在表达。其神经元皆为布尔型,1为激活,0为抑制。
理论上,参数越多的模型其复杂程度越高,能完成更加复杂的学习任务。但是复杂模型的训练效率低下,容易过拟合。但由于大数据时代、云计算,计算能力大幅提升缓解了训练效率低下,而训练数据的增加则可以降低过拟合风险。
于是如何增加模型的复杂程度呢?
1、增加隐层数;
2、增加隐层神经元数.
如何有效训练多隐层神经网络?
1、无监督逐层训练:每次训练一层隐节点,把上一层隐节点的输出当作输入来训练,本层隐结点训练好后,输出再作为下一层的输入来训练,这称为预训练,全部预训练完成后,再对整个网络进行微调。“预训练+微调”即把大量的参数进行分组,先找出每组较好的设置,再基于这些局部最优的结果来训练全局最优;
2、权共享:令同一层神经元使用完全相同的连接权,典型的例子是卷积神经网络。这样做可以大大减少需要训练的参数数目。
深度学习 可理解为一种特征学习或者表示学习,是通过 多层处理 ,逐渐将初始的 低层特征表示 转化为 高层特征表示 后,用 简单模型 即可完成复杂的分类等 学习任务 。