您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > LSTM+CTC详解
LSTM+CTC详解随着智能硬件的普及,语音交互请求会越来越多。2011年之后,深度学习技术引入到语音识别之后,大家也一直再问一个问题,深度学习技术还能像刚提出时候那样,持续大幅度提升现在的语音识别技术吗?语音技术能够从小规模的使用转向全面产业化成熟吗?如果全面产业化成熟,意味着会有越来越多的语音处理需求,但百度语音技术部的负责人贾磊说,如果线上50%的搜索都由语音完成,而机器耗费还和过去一样,那么没有公司能承担起这样的机器耗费。语音搜索的未来会怎样?技术能持续发展吗?技术的发展能否优化成本结构,同时又保障用户体验?贾磊演讲全文【贾磊】我简单介绍一下长短时记忆模型。这个模型的优势就在于,在传统的网络中引入三个门:输入门,输出门和遗忘门,分别代表对信息长期、远期和近期的记忆和控制。相对于我们传统的CNN和DNN模型,它的好处是能够记录轨迹的变化。这个模型已经提出来很久了,本身并不是近期的创新,但要把它应用在工业里,是有很多困难和现实问题的。为了把模型应用在产品上,我们提出了一套CNN+7DNN+2LSTM的结构。我当时提出这个结构,是专门在西北工业大学汇报过的,Google当时没有论文。Google当初提出2层LSTM,在我们的验证中,如果是对于状态建模,那么需要比较Deep的模型,因为这是比较短的瞬时状态,它的轨迹并不清晰。那么如果采取这种深层结构,两三轮的迭代,数据就可以获得收敛,有很好的这个效果。而如果只用2层的LSTM,随着数据量的增加,这个提升会很慢。而且最终的收益,这个模型的效果好。Google最后的论文也证明了这一点,这样的模型结构,对于状态建模是比较好的。然后我们在LSTM的模型上,主要解决了海量数据的训练和效率问题。因为LSTM不是今天的重点,今天主要讲CTC,和语音识别对传统框架的改变。因此我就跳过这一部分。LSTM的训练是有困难的,因为很容易发散。这是一个重要的技术,Google提出的LSTMP,它在传统的LSTM模型之上,引入了一个反馈层。这个反馈层对工业界弥足珍贵,因为这个反馈层会使运算的计算量大幅下降,它可以把反馈的,比如说你这个神经元节点是1024,他反馈的可以采用256,这样整个计算量会大幅压缩。因此我向大家推荐这个技术,基本上应该是工业界和学术界的最新技术,除了产品效果之外,这个的精度更高,我对这个的猜想是因为LSTM的输出层很大,它有两万多个节点,在状态建模的时候。因此为了和外部的匹配,通常的就是C代表的LSTM的记忆单元,这个单元的维度会比较高,一般采用的是1024,也可以采用2048。当采用1024的时候,其实整个网络已经非常复杂了。这个属于反馈层,可以把参数大幅的压低,从而导致你可以鲁棒稳定的去训练这个网络。那么有人反映,带有反馈层之后训练会不稳定。我的感觉是这种反馈即使有不稳定,大家要去钻研,因为它是必不可少的。工业产品中如果不带这个反馈,计算量是难以承受的。这是Google对LSTM的贡献,我向大家推荐这个技术。然后讲BPTT算法,BPTT算法是最基本的训练神经网络的算法,就是误差反向传播。对于R模型或者LSTM模型它是有轨迹的,因此它是根据轨迹的误差反向传播。它有两种方法。第一种方法是逐帧递推的,一帧推下一帧,再下一帧误差规避以后再向前传。第二种是所有的误差同步向前传,传固定的步数。这两种算法其实在BPTT的理论都是存在的。后面这种实际上就是把误差截断,不让误差从头传到尾。第一种就是直接从头传到尾。两种基本的算法,大家可以了解一下基本的理论。这是我们多层的LSTM的结构,下面是我们的CNN层,上面是我们的DNN全连接层,这是我们的LSTM两层。这个节点是采用了1024,这个维数的大小,线上的工业产品是可以用的。所以大家的研究可以照着这个去做,如果你的体积过大或者过小,对于工业而言可能就是研究跟现实之间就会有不匹配。这解释了网络能够提升系统的根本原因:第一,多层结构对神经网络而言总是有价值的,因为多层意味着输入的扰动在输出总数会衰减。这个我觉得微软的于老师是有一篇论文去讲这个。第二个状态建模,状态的轨迹并不是很清晰,很短、很sharp的一个建模单元。这个时候如果完全采用LSTM去建模的话,造成的结果就是LSTM是轨迹比较强,但是它跟瞬态的模拟能力不够,因此结合瞬态跟轨迹这样的一个模型结构,在我们现实产品中发现是稳定的,而且总是有好的效果。那我们和双层的LSTM做对比,谷歌当年刚开始提出双层的LSTM胜过CNN,有这样一篇论文,大家可以去找,我们做了实验,实际上我们达到的是negative的结果。在2000小时中,跟谷歌的实验一样,对等。双层LSTM的效果胜过了传统的CNN技术。但如果把数据量增加到一万小时的时候,这种十层的CNN会胜过双层的LSTM,节点是1024,大家可以做实验看看。因为LSTM的特点是节点多,记忆能力就强,但是节点如果少的话,能力就有限。1024是工业能上线的技术指标,我们把LSTM变成这种结构的时候,我们很好的胜出了DNN和CNN。这是我们当年从事这个研究的一段历史,那么谷歌最后的论文也证明了这一点,所以我相信这个应该是目前大家都没有异议的东西。那么训练方法,其实这个东西早就存在了,十年以前也有,现在也没有什么太大的改变。实际上训练的方法是对这个理论,正确的在产品中使用的根本的影响。谷歌有一个很著名的训练,我觉得是这个训练把LSTM带入语音工业界了,因为LSTM很慢,逐帧的训练基本上是在现实中是不可能的。那么谷歌做了一个方法,首先把句子随便的排在一起,每一次取一个SubseqSize(子句),这个子句会有一个Batchsize,64个句子放在一起,子句是20。这样的一个方法,就是把LSTM的训练,我们知道传统的LSTM是轨迹训练,而我们的CNN是逐帧训练,把LSTM向逐帧训练靠拢。这样核心收益就是,CPU在计算的时候是可以高速计算和高速并行的。由于这个技术的引入,把LSTM的训练速度大大提升,从而工业界可以使用LSTM做语音识别。那我们的训练结构基本上就是一种多GPU的方案,我们把这个句子划分成多个机器,每一个机器都采用一种分子句训练,得到的结果,然后用单机同步,或者异步SGD。后面我会讲我们多机训练的算法,总之把这个数据去搞定。这个训练算法,我认为单机也是可以做的,大家的高效就是用谷歌的分子句训练,不需要很多的GPU,一个GPU就能训练LSTM,而且效果很好。那这是我们最新研究的整句训练的方法,整句训练的难度会非常大,因为单帧递推的话,一般都是两三个句子,误差都会从头推到尾,从尾推到头。这个训练量会非常的大。而这个是我们认为后续提升的关键,谷歌的分子句训练在我们的实验中无法做CTC的Training。那整个的训练要全部切到整句训练上,这个跟传统的训练方法就会有一个很大的差异,这个差异是造成CTC训练在语音识别中使用的核心瓶颈。然后我们的并行训练平台,当年的CNN,DNN和LSTM,我指的是分子句的LSTM都可以单机去训练,大家在高校里都可以去做。但是做这种训练的时候,单机已经很难完成任务了,我基本上都使用多机,一般是这样的一个机器的结构。那么这是一个数状结构,是把模型去平均,数状是让模型传递的时候归并更加容易。这是一种新型拓扑结构,用于异步SGD,用多机去做,我们大概是四到八个机器,一个机器有四个GPU卡,因为单机的速度实在慢到无法忍受。这个工作就是说,我们的下面的工作,训练量是谷歌的数据量的四到五倍,我用模型体积是谷歌的五到二十倍。那这是我们工作的一个重要的核心价值,因为当LSTM做CTC训练的时候,整句的训练会差巨大的一个技术瓶颈。谷歌的模型很小,双向的模型只有300个节点,单向的模型只有500个节点。我们双向的模型用到了1560的节点,我们单向的模型用到了2048个节点,这样的规模是适合工业界去大量产品使用的。这里我插一句,不是说数据小了就不能做研究,也不是说节点少了这个实验就做不了,而是工业节点使用的时候一定要考虑未来的训练语料库是十万小时,如果你做了一个算法,你只能做一万小时,或者是五千小时的训练,那这个算法长期去看是没有工业生存价值的,这是我们工业界思考的一个根本和立场。所以,这个工作难度的核心就在于训练速度的提升,这个速度的提升是超乎我们常人想象的。因为当年CNN和DNN技术,我觉得于老师和邓老师把这个DNN做起来一个核心的原因是GPU带来的计算量的提升,因为GPU本质上改变了CPU,提升大量的并行度,所以LSTM算法得以流行。而如果CTC如果想训练的话,一定要有整句训练,而整句训练的训练速度是会造成所有人的技术难题的。而这种难题在工业界中实际上尤为突出,因为我们的训练量太大。而且在学术界,实际上我们探讨一些理论结果,不一定是要大数据,后面我会有一些理论的创新,今天得到的结果不仅仅是说我们工业界就是拿程序跑数据,大数据下宣布一个吓人的理论,它是有理论意义的。然后我开始进入CTC的讲解和介绍,首先我介绍一下静态分类。静态分类就是橘子,菠萝,还有桃子,其实你做这种分类很简单,是一个分类器。CNN和DNN就是简单的静态分类器,当我们去训练LSTM的时候,大家可以回忆一下。采用谷歌的分子句训练,实际上大家也是模拟单个的状态,在每一个子句中间我们可能有误差和递推。但是实际上它是一个静态建模,建模的目的就是模拟输出状态。而序列分类就不一样,他是直接把一个序列映射到另一个序列,从头到尾的去做训练。而这种序列训练的建模理论和基础和我们传统的语音识别差异很大,它本质上并不是静态分类器,它是动态分类器。语音识别要想实现动态分类,语音识别本质上是训练DNN模型、CNN模型,甚至你训练LSTM,多多少少都有静态分类的影子。而CTC训练是真正的序列训练,优化整个序列的损失,而不是优化单点的损失。那在展开训练之前,我想再对比一下CTC训练跟传统语音训练HMM训练的不同。那HMM训练是有这样一个拓扑结构,这个输出分布换成GMM或者是换成DNN,这样的分布,大家建模的时候实际上拓扑是固定了,大家只是训练这部分,这部分东西。我们先得到一个模型初值,切分出边界,在固定边界的学习下,把GMM和DNN模型调到最优,这是我们传统的一个学习分量方法。虽然我们实现了动态训练分类,但是我们的训练和本质上是静态分类器,我们没有做动态分类器的动态直接训练。但是CTC训练不同,CTC是直接的动态序列学习,它是要优化整个序列的可能性,什么叫整个序列的可能性?比如说话ABC是一个序列,那么Blank空白AABBlankCC,这叫ABC,对应的全叫ABC。任何一种序列可能的展开,都是这个序列的实例。它并没有固定的边界,那引入了一个重要的空白模型。空白模型是无意义的,就是没有任何的物理意义,这个模型就是硬引入来的。对应的这个模型拓扑结构,从上面这个模型转成下面这个模型,大家注意这个模型的拓扑,首先Blank空白是可以跨越的,大家可以是越过空白的。但是也可以经过空白,黑点表示实际的ABC观测,是不可跨越的。可以多帧注流,但是不可以跨越。空白也可以多帧注流,这是CTC理论模型,实际上非常可贵,CTC模型的拓扑结构是这样的。空白是无限延展的,这些有意义的标签分布只有一帧,这是非常重要的CTC的性质。你模型越好你越近于这个性能,而且CTC模型是否训练成功,就依赖于这个拓扑是不是和语音一致。而当这个语音识别的标签变为一帧的时候,它的价值在解码时会有巨大的收益。解码器是语音识别中最复杂的技术模块,而且它是复杂的逻辑运作,意味着没法加速,而只能顺着if-else的路径去拓展,整个就是动态规划。而如果能把解码速度大大压缩,剩下就是DNN的计算量了。DNN是好办的,它是规整的,有固定的计算规律,而且有很多专业硬件,可以加速和提升。我觉得这就是语音识别的未来,线上如果50%的搜索都由语音完成,如果机器耗费还和今天一样,没有人能承担起这样的机器耗费。所以这个技术对于语音识别的未来弥足珍贵。那这个模型好不好,能不能在精度上超越我们现实的语音世界?我再解释一下CTC的实际训练情况,刚开始的路径首先是空白,按照刚才的
本文标题:LSTM+CTC详解
链接地址:https://www.777doc.com/doc-4456407 .html