An introduction to deep learning Pei Li Data Mining Group @ Xiamen University Acm.lipei.2009@gmail.com http://datamining.xmu.edu.cn/main/~lipei Last updated: April 23,2013 Keywords: Deep neural network, sparse code
Outlines Background Introduction How do our brains do with feature Some basic idea of deep learning Artificial neural networks Auto encode and Sparse code Deep neural network Summary Reference 1/42
Background(Academia) Geoffrey E. Hinton,加拿大多伦多大学教授,是deep learning的开山大牛,专注于神经网络几十年,06年,hinton在science上用NN进行降维的一篇文章,开启了DL时代,并在随后的ImageNet图片识别的比赛,取得了非常有说服力的结果(74%->85%),震撼了学术界。 Andrew Ng,斯坦福大学教授,也是著名的coursera的创始人之一,万千学子的机器学习启蒙导师,他主持了著名的google brain项目,成功的让机器从大量的图片中学到了猫的感念,令人印象深刻。 至hinton06年后,整个学术界掀起了一股深度学习热,包括Andrew等人紧随其后。至06年以来,深度学习的论文量剧增,涌现了各种方法,很多在图像,语音方面的问题都被很好的解决了,其他一些领域的问题也开始尝试用其解决 Andrew Ng Geoffrey E. Hinton 2/42
Background(Industry) 2012年6月,《纽约时报》披露了Google Brain项目,吸引了公众的广泛关注。 2012年6月,《纽约时报》披露了Google Brain项目,吸引了公众的广泛关注。这个项目是由著名的斯坦福大学的机器学习教授Andrew Ng和在大规模计算机系统方面的世界顶尖专家JeffDean共同主导,用16000个CPU Core的并行计算平台训练一种称为“深度神经网络”(DNN,Deep Neural Networks)的机器学习模型(内部共有10亿个节点。这一网络自然是不能跟人类的神经网络相提并论的。要知道,人脑中可是有150多亿个神经元,互相连接的节点也就是突触数更是如银河沙数。曾经有人估算过,如果将一个人的大脑中所有神经细胞的轴突和树突依次连接起来,并拉成一根直线,可从地球连到月亮,再从月亮返回地球),在语音识别和图像识别等领域获得了巨大的成功。 2012年11月,微软在中国天津的一次活动上公开演示了一个全自动的同声传译系统,讲演者用英文演讲,后台的计算机一气呵成自动完成语音识别、英中机器翻译和中文语音合成,效果非常流畅。据报道,后面支撑的关键技术也是DNN,或者深度学习(DL,DeepLearning)。 2013年1月,在百度年会上,创始人兼CEO李彦宏高调宣布要成立百度研究院,其中第一个成立的就是“深度学习研究所”(IDL,Institue of Deep Learning)。 2012年11月,微软在中国天津的 一次活动上公开演示了一个全自动 的同声传译系统 2013年1月,在百度年会上,创始人兼 CEO李彦宏高调宣布要成立百度研究院 ,其中第一个成立的就是“深度学习研究所” 3/42
Background 为什么那么多的机器学习大牛都开始关注并花大量 时间研究它? 为什么拥有大数据的互联网公司争相投入大量资源 研发深度学习技术? 听起来感觉deeplearning很牛的样子。 那什么是deep learning?它能干什么呢? 4/42
introduction 机器学习虽然发展了几十年,但还是存在很多没有良好解决的问题 5/42 机器学习在图像识别、语音识别、自然语言理解、天气预测、基因表达、内容推荐等领域,很大程度上都是依赖手工提取特征,算法提升并不是非常卓有成效,Andrew就说过很多时候都是赢在数据上而不是算法上。然而,很多时候都要耗费大量的人力物力(很多大公司就有专门搞特征的部门),而相应的效果却没有得到的提升。 5/42
introduction 机器学习去解决这些问题的思路都是这样的: 概括起来主要由三部分组成 从开始的通过传感器(例如CMOS)来获得数据。然后经过预处理、特征提取、特征选择,再到推理、预测或者识别。最后一个部分,也就是机器学习的部分,绝大部分的工作是在这方面做的,也存在很多的paper和研究。 而中间的三部分,概括起来就是特征表达。良好的特征表达,对最终算法的准确性起了非常关键的作用,而且系统主要的计算和测试工作都耗在这一大部分。但,这块实际中一般都是人工完成的。靠人工提取特征。 而中间的特征提取部分将很大程度上决定最终的效果, 那实际中的特征提取是怎么做的? 6/42
introduction 实际中特征提取都是靠手工提取的,截止现在,也出现了不少NB的特征: 截止现在,也出现了不少NB的特征(好的特征应具有不变性(大小、尺度和旋转等)和可区分性):例如Sift的出现,是局部图像特征描述子研究领域一项里程碑式的工作。由于SIFT对尺度、旋转以及一定视角和光照变化等图像变化都具有不变性,并且SIFT具有很强的可区分性,的确让很多问题的解决变为可能。但它也不是万能的。 手工地选取特征是一件非常费力、启发式(需要专业知识) 的方法,能不能选取好很大程度上靠经验和运气!! 而且它的调节需要大量的时间。 7/42
introduction 既然手工选取特征不太好,那么能不能自动地学习 一些特征呢?答案是能! Deep Learning就是用来干这个事情的,看它的一 别名Unsupervised Feature Learning。 那它是怎么学习的呢?怎么知道哪些特征好哪些不 好呢?我们说机器学习是一门专门研究计算机怎样 模拟或实现人类的学习行为的学科。好,那我们人 的视觉系统是怎么工作的呢? 8/42
How do our brains do with feature 1958 年,DavidHubel 和Torsten Wiesel 在 JohnHopkins University,研究瞳孔区域与大脑皮层神经元的对应关系。他们在猫的后脑头骨上,开了一个3 毫米的小洞,向洞里插入电极,测量神经元的活跃程度。 然后,他们在小猫的眼前,展现各种形状、各种亮度的物体。并且,在展现每一件物体时,还改变物体放置的位置和角度。他们期望通过这个办法,让小猫瞳孔感受不同类型、不同强弱的刺激。 之所以做这个试验,目的是去证明一个猜测。位于后脑皮层的不同视觉神经元,与瞳孔所受刺激之间,存在某种对应关系。一旦瞳孔受到某一种刺激,后脑皮层的某一部分神经元就会活跃。经历了很多天反复的枯燥的试验,同时牺牲了若干只可怜的小猫,David Hubel 和Torsten Wiesel 发现了一种被称为“方向选择性细胞(Orientation Selective Cell)”的神经元细胞。当瞳孔发现了眼前的物体的边缘,而且这个边缘指向某个方向时,这种神经元细胞就会活跃。 1981 年的诺贝尔医学奖,颁发给了 David Hubel 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献, 是“发现了视觉系统的信息处理”:可视皮层是分级的: 这个发现激发了人们对于神经系统的进一步思考。 神经-中枢-大脑的工作过程,或许是一个不断迭代、不断抽象的过程。 9/42
How do our brains do with feature 这个过程关键在于抽象和 迭代。从原始信号开始, 做低级抽象,逐渐向高 级抽象迭代。 如图,从原始信号摄入开始(瞳孔摄入像素Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状),然后进一步抽象(大脑进一步判定该物体是谁的脸) 人的视觉系统的信息处理是分级的。从低级的V1区提取边缘特征,再到V2区的形状或者目标的部分等,再到更高层,整个目标、目标的行为等。也就是说高层的特征是低层特征的组合,从低层到高层的特征表示越来越抽象,越来越能表现语义或者意图。而抽象层面越高,存在的可能猜测就越少,就越利于分类。例如,单词集合和句子的对应是多对一的,句子和语义的对应又是多对一的,语义和意图的对应还是多对一的,这是个层级体系 10/41
How do our brains do with feature 大家都注意到关键词了:分层。 而Deep learning的deep是不是就表示我存在多少 层,也就是多深呢?没错。 那Deep learning是如何借鉴这个过程的呢?毕竟 是归于计算机来处理,面对的一个问题就是怎么对 这个过程建模? 11/42
Basic idea of deep learning 假设有一个系统S,它有n层(S1,…Sn),它的输入是I, 输出是O,形象地表示为: I=>S1=>S2=>…..=>Sn => O, 如果输出O等于输入I,即输入I经过这个系统变化之后没 有任何的信息损失,保持了不变,这意味着输入I经过每 一层Si都没有任何的信息损失,即在任何一层Si,它都是 原有信息(即输入I)的另外一种表示。 输入I system 输出O 现在回到我们的主题Deep Learning,我们需要自动地学习特征,假设我们有一堆输入I(如一堆图像或者文本),假设我们设计了一个系统S(有n层),我们通过调整系统中参数,使得它的输出仍然是输入I,那么我们就可以自动地获取得到输入I的一系列层次特征,即S1,…, Sn。 i=o 12/42
Basic idea of deep learning 对于深度学习来说,其思想就是堆叠多个层,也就是说这一层的输 出作为下一层的输入。通过这种方式,就可以实现对输入信息进行分 级表达了。 那它究竟是如何学习特征和训练的? 这里我们需要来了解一下神经网络,熟悉神经网络的人都知道神经网 络的隐藏层实际上就是一组特征。 13/41
Artificial neural networks 以监督学习为例,假设我们有训练样本集 ,那么神经网络算法能够提供一种复杂 且非线性的假设模型 ,它具有参数 W,b ,可以以此参数来拟合我们的数据。 以下即是一个“神经元”的图示 这个“神经元”是一个以x1,x2,x3及截距 +1为 输入值的运算单元,其输出为 函数 被称为“激活函数” 这里我们选用sigmoid函数作为激活函数 可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。 14/41
Artificial neural networks 所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个 “神经元”的输出就可以是另一个“神经元”的输入。 例如,下图就是一个简单的神经网络: 我们使用圆圈来表示神经网络的输入,标上“+1 ”的圆圈被称为偏置节点,也就是截距项。神经网络最左边的一层叫做输入层,最右的一层叫做输出层(本例中,输出层只有一个节点)。中间所有节点组成的一层叫做隐藏层,因为我们不能在训练样本集中观测到它们的值。同时可以看到,以上神经网络的例子中有3个输入单元(偏置单元不计在内),3个隐藏单元及一个输出单元。 15/42
Artificial neural networks 参数的表示 是第l 层第 j单元与第 l+1层第 i单元之间的联接参数(其实就是连接线上的权重,注意标号顺序),因而, 是第 l+1层第 i 单元的偏置项. 表示第 l层第 i单元的激活值(输出值)。当 l=1 时, ,也就是第 i个输入值(输入值的第 i个特征)。 , 因而,该神经网络的参数为: 16/41
Artificial neural networks 该神经网络的计算如下: 简化为向量表达为: 17/41
Artificial neural networks 我们将上面的计算步骤叫作前向传播。通过前向传 播我们可以计算出最终的输出。 那我们是如何训练该网络?或者说该如何调节权重以 拟合训练数据的? 18/42
Artificial neural networks 通过反向传播算法来训练神经网络 假设我们有一个固定样本集 ,它包含 m个样例。 我们可以用批量梯度下降法来求解神经网络。具体来讲,对于单个 样例 ,其代价函数为: 以上公式中的第一项J(W,b) 是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。 19/42
Artificial neural networks 梯度下降法中每一次迭代都按照如下公式对参数 和 进行更新: 其中 a是学习速率。其中关键步骤是计算偏导数 20/42
Artificial neural networks 反向传播算法的思路如下: 1、进行前馈传导计算,利用前向传导公式,得到L2,L3,… 直到输出层 Ln的激活值。 2、对于第 nl 层(输出层)的每个输出单元i ,我们根据以下公式计算残差: 3、对l=nl-1,nl-2,nl-3,… 的各个层,第l层的第 i个节点的残差计算方法如下: 给定一个样例 ,我们首先进行“前向传导”运算,计算出网络中所有的激活值,包括 h的输出值。之后,针对第l层的每一个节点 ,我们计算出其“残差” ,该残差表明了该节点对最终输出值的残差产生了多少影响,利用其来调节权重。 4、计算我们需要的偏导数,计算方法如下: 21/42
Artificial neural networks 最后,我们将对梯度下降算法做个全面总结,下面,我们实现批量梯 度下降法中的一次迭代: 1、对于所有 l,令 , , (设置为全零矩阵或全零向量) 2、对于 i=1 到 m, a、使用反向传播算法计算 和 。 b、计算 c、计算 3、更新权重参数: 22/41
Artificial neural networks 目前为止,我们已经讨论了神经网络在有监督学习中的应用。在有监 督学习中,训练样本是有类别标签的。 那如果训练样本无类别标签的,我们是否可以学习到一些有用的结构 呢?这就是自编码神经网络。 23/41
Auto encode and Sparse code 自编码神经网络是一种无监督学习算法, 它使用了反向传播算法,并让目标值等于 输入值。 事实上,通过以上的学习,隐藏单元就是 输入的另一种表示,即特征。当隐藏单元小 于输入时,其就相当于PCA进行了压缩。 现在假设我们只有一个没有带类别标签的训练样本集合。自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值。 自编码神经网络尝试学习一个 的函数。换句话说,它尝试逼近一个恒等函数,从而使得输出 接近于输入 。恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构。举例来说,假设某个自编码神经网络的输入 是一张 图像(共100个像素)的像素灰度值,于是 ,其隐藏层 中有50个隐藏神经元。注意,输出也是100维的 。由于只有50个隐藏神经元,我们迫使自编码神经网络去学习输入数据的压缩表示,也就是说,它必须从50维的隐藏神经元激活度向量 中重构出100维的像素灰度值输入 。如果网络的输入数据是完全随机的,比如每一个输入 都是一个跟其它特征完全无关的独立同分布高斯随机变量,那么这一压缩表示将会非常难学习。但是如果输入数据中隐含着一些特定的结构,比如某些输入特征是彼此相关的,那么这一算法就可以发现输入数据中的这些相关性。事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA)结果非常相似的输入数据的低维表示。 24/42
Auto encode and Sparse code 刚才的论述是基于隐藏神经元数量较小的假设。当隐藏神经元的数量 较大时,通过给自编码神经网络施加一些其他的限制条件(稀疏性) 来发现输入数据中的结构。 稀疏性可以被简单地解释如下。如果当神经元的输出接近于1的时候 我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得 神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。 具体来说,如果我们给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构。 25/42
Auto encode and Sparse code 由此,我们注意到每一层节点的输出其实就是该节点的激活度。 则自编码神经网络隐藏神经元 j的激活度为: 在此我们加入一条限制: 换句话说,我们想要让隐藏神经元 j的平均活跃度接近0.05。为了满足这一条件,隐藏神经元的活跃度必须接近于0。 其中, 是稀疏性参数,通常是一个接近于0的较小的值(如 ) 26/42
Auto encode and Sparse code 为了实现这一限制,我们将会在我们的优化目标函数中加入一个额外 的惩罚因子,惩罚因子的具体形式如下: 上面的公式可用相对熵简化为: 而这一惩罚因子将惩罚那些 和 有显著不同的情况从而使得隐藏神经元的平均活跃度保持在较小范围内。 27/42
Auto encode and Sparse code 通过相对熵的变化图,可知:当 时 , , ,并且随着 与 之间的差异 增大而单调递增。 由此可知这一惩罚因子将惩罚那些 和 有显著不同的情况从而使得隐藏神经元的平均活跃度保持在较小范围内。从而使网络变得稀疏。 28/42
Auto encode and Sparse code 加入稀疏惩罚因子后,可得,我们的总体代价函数为: 由此可推得我们的残差计算公式为: 这样利用反向传播算法,我们就可以训练稀疏自编码神经网络了。 而贝塔控制稀疏性惩罚因子的权重。 29/42
Deep neural network 在以上的稀疏自编码神经网络后,加上一个分类器(SVM,Softmax) 等,就可以进行分类了。(这是一个浅层结构) 那为何还要用深层结构呢? 30/42
Deep neural network 深度网络最主要的优势在于,它能以更加紧凑简洁的方式来表达比浅 层网络大得多的函数集合,换言之,它具有更强的表征能力。 那我们是否可以将稀疏自编码神经网络堆叠多层,然和加一个分类器, 通过反向传播算法来训练网络呢?答案是否定的。 例如,我们可以找到一些函数,这些函数可以用 k层网络简洁地表达出来(这里的简洁是指隐层单元的数目只需与输入单元数目呈多项式关系)。但是对于一个只有 k-1层的网络而言,除非它使用与输入单元数目呈指数关系的隐层单元数目,否则不能简洁表达这些函数。 31/42
Deep neural network 主要原因在于: 1、数据获取问题:使用上面提到的方法,我们需要依赖于有标签的 数据才能进行训练。然而有标签的数据通常是稀缺的,因此对于许多 问题,我们很难获得足够多的样本来拟合一个复杂模型的参数。 2、局部极值问题:由于其深度较深,使得常常会涉及到求解一个高 度非凸的优化问题,非常容易陷入很坏的局部最小。 3、梯度弥散问题:由公式我们可知,当深度较深时,残差闯到前面 的时候已经非常小了,使得前几层不能有效进行调节,训练速度很慢。 32/42
Deep neural network 那怎么解决这些问题呢? 我们知道造成神经网络容易陷入局部最小的主要原因是开始时对权的 随机初始化的问题。 那我们是否可以获得一个好的初始权重呢? 我们可以通过逐层贪婪训练方法来初始化权重。其主要思想就是:每 次只训练网络中的一层,即我们首先训练一个只含一个隐藏层的网络, 仅当这层网络训练结束之后才开始训练一个有两个隐藏层的网络,以 此类推。 33/42
Deep neural network 通过逐层贪婪训练方法,我们有效的解决数据的获取问题和获得一个 更好的局部极值。 在数据获取问题上,由于我们采用逐层贪婪训练方法,利用了大量的 无标签数据来训练网络,初始化了网络的权重,随后,利用有标签数 据进行微调,就能很快的收敛。 对于易于陷入坏的局部最优值,我们通过以上步骤,就获得了一个比 较好的起点,较为接近好的结果,这样防止了收敛于坏的结果。 34/42
Deep neural network 这样我们大概了解了深度网络的主要思想:通过无监督数据逐层贪婪 训练网络,获得一个好的初始值;之后通过有监督的数据微调整个网 络即可。 以下用一个例子来说明训练方法。 假设你想要训练一个包含两个隐含层的栈式自编码网络,用来进行 MNIST手写数字分类. 首先,你需要用原始输入 训练第一个自编码器,它 能够学习得到原始输入的 一阶特征表示 35/42
Deep neural network 把上一层的一阶特征作为另一个稀疏自编码器的输入,使用它们来学习二阶特征 36/42
Deep neural network 将些二阶特征作为softmax分类器的输入,训练得到一个能将二阶特征映射到数字标签的模型。 37/42
Deep neural network 最终,将这三层结合起来就建一个包含两个隐藏层和一个最终softmax分类器层的栈式自编码网络,这个网络能够如你所愿地对MNIST数字进行分类。 38/42
Deep neural network 通过以上例子,我们能够清楚的了解到深度网络能够获取到输入的 “层次型分组”或者“部分-整体分解”结构,具有强大的表达能力。 结合前面的稀疏因子我们将描述深度网络是如何利用有监督的数据进 行微调的? 39/42
Deep neural network 深度神经网络利用反向传播算法进行微调,具体过程如下: 1、进行一次前馈传递,对 L2层、L3 层直到输出层Lnl ,使用前向传 播步骤中定义的公式计算各层上的激活值(激励响应)。 2、对输出层( nl层),令 3、对l=nl-1,nl-2,nl-3,…,令 4、计算所需的偏导数: 40/42
Summary 深度学习主要是利用深度网络结构来抽象和迭代组合特征,充分的利 用了大量的非标记数据,有效的挖掘了数据中的层级特征,具有更强 的表征能力,尤其适合于在图像、语音等有大量的非标记数据而又非 常抽象的领域。 深度网络训练的主要思想就是利用非标记数据进行逐层贪婪训练和利 用有标记数据来进行整个网络的微调。 关于软件的话是没有的,但现成的代码是有的,主要是hinton写的关 于手写体的分类,以上讲的只是大概的步骤,其实在处理数据时要进 行一些预处理的(如PCA白化等) 41/42
Reference 推荐斯坦福大学的深度学习教程: http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6% 95%99%E7%A8%8B Hinton讲的DBN网络 http://videolectures.net/jul09_hinton_deeplearn/ Andrew Ng在清华的演讲 http://v.youku.com/v_show/id_XNTM5ODAyNDU2.html 42/42