但是它跟瞬态的模拟能力不够,因此结合瞬态跟轨迹这样的一个模型结构,在我们现实产品中发现是稳定的,而且总是有好的效果。
那我们和双层的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的时候,大家可以回忆一下。采用谷歌的分子句训练,实际上大家也是模拟单个的状态,在每一个子句中间我们可能有误差和递推。但是实际上它是一个静态建模,建模的目的就是模拟输出状态。