其他分享
首页 > 其他分享> > 李宏毅深度学习笔记-为什么要深度?

李宏毅深度学习笔记-为什么要深度?

作者:互联网

问题:越深越好?

image-20200602210107035

层数越多,参数越多,model比较复杂,数据又多的话,本来误差就越小,这为什么归因于”深“呢?

矮胖结构 v.s. 高瘦结构

image-20200602210346131

真正要比较”深“和”浅“的model的时候,要让它们的参数一样多。

“浅”的model就会是一个矮胖的model,“深”的model就会是一个瘦高的model

image-20200602210658829

选择两个参数个数接近的model

从上图看,一层的网络就算参数个数有16k个,误差也有22.1,比那个两层的还要差。这说明单纯的增加参数个数,不添加层数的话,效果也不会特别好。

模组化

image-20200602211228853

为什么要添加层数呢?

当我们在做深度学习的时候,相当于在做模组化。

什么是模组化?

比如写程序,不会把所有功能都写在main function里。会写sub1,sub2...,然后main function里调用这些函数,可能sub1,sub2...里还会调用subsub1,subsub2...,做这样一层层结构化的架构。结构化的好处是可以共用function,例如subsubsub2就被sub1和subsub2共用,减少程序的复杂度。

image-20200602211844076

结构化的思想用在分类上

假设有个task是图片分类,分成长发女、长发男、短发女、短发男4类,4类都有训练数据可以训练一个分类器。

问题就是长发男的训练数据比较少,那么训练出来的分类器就很弱。

image-20200602212152754

数据少的分类器效果差怎么办?

使用模组化的思想,把原问题分解成几个小问题。先学习一个用来检测某一种属性的分类器,例如不是学习长发男、长发女分类器,而是分成是否是男生、是否是长发两个基本分类器。虽然长发男的数据很少,但是男生、女生、短发和长发的数据足够,那这两个基本分类器就不会太差。

image-20200602212734454

训练最终分类器的时候,就先参考基本分类器的output,基本分类器是共用的。最终分类器只要使用很少的训练数据,就可以训练得很好,比如基本分类器输出是长发、是女生、那么最终输出是长发女,因为它做的事情是很简单的,复杂的被基本分类器做了。

深度学习和模组化

image-20200602213207598

把每个神经元看成是一个基本分类器,第一层的神经元是最基本的分类器,第二层的神经元是比较复杂的分类器,把第一层的output作为Input,即把第一层的分类器当做模组,第三层的神经元又把第二层的神经元当做模组,以此类推。

在做深度学习的时候,怎么做模组化是机器自动学习的。

做模组化让我们的模型变简单了,把复杂的问题分解成了几个简单的问题,因此就算训练数据没有很多,简单的任务也会做得比较好。如果深度学习是模组化的,那么训练数据就可以比较少的,这个和一般认知是相反的。新闻常常报道AI=big data+deep learning ,于是很多人觉得深度学习有效果是因为大数据。仔细想想并不是这个样子,假设我们真的有大数据做图像分类,有全世界的图片数据库,那何必做机器学习,直接查找照片给出label就可以了,于是某种程度上机器学习和大数据是相反的,真正有大数据,就不用学习了。就是因为我们没有足够的数据,才会去做深度学习。

语音识别举例

image-20200603134305344

一句话右一连串的音素(人类发音的基本单位)组成

what、think由4个音素组成,do、you由两个音素组成

同样的音素可能有不同的发音,当发d uw 和y uw 的时候,心里想要发的是同一个音素uw。但是由于人类口腔器官的限制,每次发的uw可能都不一样,因为uw前面和后面都接了其他的音素,受到前后音素的影响。为了表达这件事情,给同样的音素不同的model,这个东西叫做tri-phone。

tri-phone表达方式:第一个uw 加上前面音素d和后面音素y,第二个uw加上前面音素y和后面音素th

tri-phone的意思是一个音素用不同的model来表示,如果一个音素(例如上图两个uw)的表达不一样,我们就用不同的model来模拟这种音素。

一个音素可以拆成几个状态,到底几个是自己决定的,通常定为3个状态。

image-20200603150228354

怎么做语音识别?

语音识别很复杂,现在只讲第一步,第一步要做的事情是把声学特征转成state。这是一个单纯分类的问题,就跟把一张图片分成10类一样,现在input一个声学特征,然后把它分为哪一个state。

声学特征是什么?

简单讲input的声音讯号是一串声波,在声波上面取一个窗口(不会太大,例如250微秒),用一组特征来描述窗口里的声波特性,这个就是声学特征。

在声音讯号上,每隔一小段时间取一个窗口,那么声音讯号就会变成一串向量序列,这个叫做声学特征序列。语音识别的第一阶段就是决定每一个声学特征属于哪一个state,需要拟合一个分类器,告诉我们声学特征属于state a,state b,state c。光state是没有用的,要把state转成音素,再把音素转成文字,接下来还要考虑同音异字问题。

image-20200603152108884

比较深度学习模型和传统模型有什么不同为什么深度学习在语音上会有显著成果

语音识别第一阶段要拟合一个分类器,用来辨别声学特征属于哪一个state。

传统方法例如HMM-GMM,假设每一个state的特征向量的分布是固定的,那就可以用model来描述。

比如上图d当做中心的tri-phone的第一个state可以用一个GMM来描述

另外一个state可以用另一个GMM来描述。这时候给一个声学特征,可以算从每个state产生出来的概率。这个东西叫高斯混合模型GMM。

仔细想想这个方法不太work,因为tri-phone的数目太多了,一般中文英文都有将近40个音素。在tri-phone里面,每个音素随着表达的不同,需要用不同的model,有\(40^3\)个tri-phone,每个tri-phone又有3个state,总共有数万个state,每个state都用一个GMM描述,那参数太多了,训练数据完全不够。

image-20200603154721733

传统方法里怎么处理参数太多的问题?

有一些state共用同样的model分布,这个事情叫做Tied-state,到底哪些共用要凭经验和语言学的知识。

什么叫做共用同样的分布?

假如写程序的时候,不同的state的名称,就像是指针一样,不同的指针有可能指向同样的分布。

但是只是了解state是否共用是不够的,有人提出部分共用等等。

比较创新火的方法叫做subspace GMM,里面有模组化的影子。原来每一个state有一个分布,在subspace GMM里,先把很多的高斯分布找出来组成一个高斯池,那每一个state的信息就是一个键,键值对应state要用到的部分高斯分布。那有些时候state就会共享部分的高斯分布,有些时候又可以完全不共享高斯分布。具体共享多少个高斯分布是从训练数据中学习出来的。

image-20200603155650125

仔细想想HMM-GMM方法,所有的音素或者state是基于独立模型的,这件事情是低效率的。想想看人类的声音,不同的音素,虽然被分成不同的类,但这些音素之间不是完全无关的,都是由发音器官生成的,根据人类发音方式音素之间是有关系的。

例如上图画出了人类语言里所有的母音,母音发音只受到三件事情的影响。一个是舌头前后的位置,一个是舌头上下的位置,还有一个是嘴型。上图常见的5个英文母音a,e,i,o,u,当从a发音到e到i的时候,舌头由下往上,i和u是舌头前后的差别。发音a,e,i,o,u,就会像上图一样。

上图同一个位置不同母音代表舌头的位置是一样的,但是嘴型不一样。比如左上角i和y(yi和yu),i的嘴型比较扁,y的嘴型比较圆。所以说不同的音素之间是有关系的,那每个音素都有自己的一个model,这件事情是没有效率的。

image-20200603160944043

那深度学习是怎么做的?

学习一个DNN,input是声学特征,output是每个特征属于哪个state的概率,是一个单纯的分类器。

这里最关键的是所有的state共用一个DNN。很多人觉得从GMM变到深度学习厉害的地方就是本来GMM通常最多做64个高斯混合模型,DNN有10层,每层1000个神经元,参数变多了,效果变好了,是一个暴力碾压的方法。

但其实DNN不是暴力碾压的方法,在做HMM-GMM的时候,说GMM只有64个混合,好像很简单,但是每个state都有一个高斯混合模型,真正合起来参数也很多,其实GMM和DNN的参数是差不多的。DNN是一个很大的model,GMM有很多小的model,DNN用同一个model给state分类是更有效率的做法。

image-20200603163034299

为什么DNN是比较有效率的做法?

如果把DNN某个隐藏层拿出来,有1000个神经元这样没法分析,但是可以把1000个神经元的output降维到2维。

上图左下方,每个点代表一个声学特征,是把通过DNN后的output降维到二维的分布。图上的颜色是a,e,i,o,u 5个母音,用和右上图同样颜色框起来。神奇的是左下图5个母音的分布和右上图5个母音的分布几乎是一样。所以DNN比较靠前的隐藏层做的事情,不是马上去对input(发音)做分类判断是属于哪一个音素或是哪一个state,而是先去观察,当你听到这个发音的时候,人是用什么样的方式在发这个音,舌头的位置在哪里,舌头是高还是低、是前还是后等等。比较靠后的隐藏层知道了发音的方式之后,再去判断发音是属于哪一个音素或者哪一个state。

那么比较靠前的隐藏层用来检测发音方式,且所有的音素共用参数,利用到了模组化的特性,用比较少的参数来做有效率的事情。

普遍性定理

image-20200603164359142

任何连续的函数都可以用一层的神经网络来拟合,只要这层够宽。这也是以前很多人放弃使用“深度”的原因,做一层就可以拟合所有函数,那“深度”意义何在。不过这个理论只告诉我们有这个可能性,没告诉我们有多效率。的确只要参数足够多,就可以拟合任何的函数,但只做一层然后去找很多参数这个事情是低效率的。当你有多层时,则更有效率。

用电路来解释“深度”更有效率

image-20200603165010957

逻辑电路跟神经网络类比。逻辑电路是由一堆逻辑闸(AND gate,NOR gate 与门和非门)组成,神经网络由一堆神经元组成。只要两层逻辑闸,就可以表示任何的布尔函数。那一个隐藏层的神经网络,也是两层,有一个输入层,一个隐藏层,一个输出层,那么这个神经网络可以表示任何函数也不会特别让人惊讶。

虽然只用两层逻辑闸就可以描述任何的布尔函数,但是实际做电路设计的时候,不可能只用两层。因为做层级架构时,使用多层结构更有效率。类比到神经网络,多层(“深度”)网络更有效率,达到同样效果时,多层可以使用较少的神经元,意味着较少的参数,不容易过拟合,需要的数据量也更少。

许多人觉得深度学习就是很多数据训练很多参数碾压过去,其实不是,我们做深度学习的时候,使用多层结构可以用较少的数据量完成同样效果的任务。

image-20200603170215018

逻辑电路这再举一个例子

假设要设计一个电路做奇偶校验,即input一串二元数字,如果1的次数是偶数的话,output为1,否则为0。

如果input的序列长度有1bit,理论上用两层的话,需要\(2^d\)个门才可以描述这个电路。

如果使用多层架构,例如上图把好几个XBOR接在一起,input1和0后,输出方式如右上图。input1和0,output就是0;input 0 和0,output就是1。这时只需要O(d)个门就可以完成之前的任务了。

使用多层架构,使用比较少的逻辑闸,可以做到同样的事情。这对神经网络来说也是一样的,多层可以使用更少的神经元。

用剪窗花来解释“深度”更有效率

image-20200603171107353

剪一个窗花,先折起来,再剪。

image-20200603171227137

这个和深度学习有什么关系?

假设input的点有4个,红色的一类,蓝色的一类。如果没有隐藏层的话,就是一个线性的model,怎么做都无法完全分开红色和蓝色。加上隐藏层之后,就做了一个特征的转换,把原来的\(x_1,x_2\)转换到另外一个平面变成\(x_1',x_2'\)。变化到上图右下所示, 两个蓝色的点都跑到(0.27,0.27),重合了,就好像把原来的平面对折了。就像剪窗花,先把色纸对折,对折后戳一个洞,打开后就会有好多个洞。

把剪窗花看成train,把剪色纸看成根据训练数据训练分离线,例如上图右上,有斜线的地方是positive 样本,没有斜线的地方是negative 样本,假设平面像色纸一样折起来了,那么根据训练数据训练一个简单的分离线,展开后就会变成一个复杂的分离超平面。本来训练数据集只是说有一个简单的分离线,但是经过空间对折后,展开后就是一个非常复杂的分离超平面。或者戳一个洞,展开后就有5个洞,一笔数据可以发挥5笔数据的效用。

所以深度学习是比较有效率的方式来使用训练数据。

image-20200603195630343

一个toy example

有一个地毯形状的函数,输入是为二维的(坐标),输出是0和1,红色菱形范围内输出是1,蓝色菱形范围内输出是0。现在考虑使用不同的训练数据集,用一个隐藏层和三个隐藏层是怎样的情境,一个隐藏层的参数个数调整为接近于三个隐藏层的,那一个隐藏层的神经网络很胖,三个隐藏层的神经网络就比较瘦。

现在给出100000个样本,两个神经网络都可以学出地毯的形状。

现在减少到20000个样本,两个神经网络的结构都崩坏了,但是三个隐藏层是有次序的崩坏,最后得到的结果还算可以。

端到端学习

image-20200603200932942

深度学习可以做端到端学习

什么是端到端学习?

我们知道解一个机器学习问题时,先要找一个假定的函数集合(model)。有时候要处理的问题非常复杂时,这个model里就是一个生产线,就是说一个复杂的函数是由几个简单的函数串接在一起的。例如语音识别时,要先把声音讯号input进去,通过很多层函数,一层层转换,最后输出文字。

端到端学习就是你只给model输入和输出,不规定中间每一个函数怎么分工,而让model自己去学习生产线里的每一个函数应该做什么事情。在深度学习里做这件事情就是叠一个很深的神经网络,每一层都是生产线上一个简单的函数,每一层会自己学习应该做什么。

image-20200603201814332

在没有深度学习的时代,只有浅层学习时,要怎么把声音讯号转化成文字?

要先做DFT(生产线上某个函数),然后变成频谱图,再通过滤波器组(生产线上另外一个函数)得到output,再取log,再做DCT,最后得到MFCC丢进GMM里,得到语音识别的结果。GMM换成DNN也会有很显著的提升。

整个生产线上,只有GMM(蓝色部分)是训练数据学出来的,前面绿色部分都是手工制定的。专家研究了各种人类的生理知识,制定出了绿色部分的函数,效果非常好,改一点都会使效果变差。

进入深度学习时代

有了深度学习后,可以把绿色部分用神经网络取代掉,给神经网络多加几层,就可以把DCT拿掉。之后比较多的是从log 输出开始做,神经网络深一点,就可以得到比较好的结果。现在甚至可以从频谱图那里开始做,把后面的部分都用深度神经网络取代掉。如果分析深度神经网络的权重,会发现可以自动学到要做滤波器组这件事情(模拟人类听觉器官所指定的filter)。

image-20200603203100614

能不能叠一个很深很深的神经网络,输入直接就是声音讯号,输出就是文字,然后中间就不用做特征变换之类的?

最好的神经网络效果也就跟做了特征变换的model持平。

image-20200603203403210

image-20200603203630378

图像识别也是类似,传统也是有很多手工定制的特征函数,最后使用一个分类器。现在直接上一个很深的神经网络,输入就是像素点,输出就是图片类别,不需要再手工抽取特征了。

更复杂的任务

image-20200603203707663

实际任务是很复杂的。

有时候非常类似的输入,输出是相差很大的。例如图片识别里白色的狗和北极熊看起来很像。

有时候看起来相差很大的输入,输出是一样的。例如上图里两个火车。

假设神经网络只有一层,就没有办法把一样的东西变得不一样,把不一样的东西变得很像。要做输入类似,输出相异,需要做很多层次的转换。

image-20200603204145966

image-20200603204522175

举例:语音的例子

上图做的事是把MFCC投影到二维的平面上,不同的颜色代表不同的人说的句子。发现同样的句子,不同的人说,声音讯号看起来非常不一样。如果只有一个隐藏层的神经网络,会发现不同的人讲的同一个句子,看起来很不一样。但是用有8个隐藏层的神经网络,发现不同的人说的同一个句子被自动的align在一起。

image-20200603204721309

看手写识别的例子:

input是28*28的像素点,转换到2维平面,看起来是上图左上的样子,4和9几乎是重叠在一起,很像都是一个圈圈加上一条线。 看一个隐藏层的神经网络,发现4和9还是很像,但是分开了一点,看2个隐藏层的,会发现4和9分得更开了,三个隐藏层又更开了。

更多“深度”的理由

image-20200603205148747

image-20200603205201814

标签:一个,李宏毅,神经网络,笔记,分类器,state,深度,model,音素
来源: https://www.cnblogs.com/wry789/p/13040023.html