1.前言
如果说高德纳的著作奠定了第一代计算机算法,那么传统机器学习则扩展出第二代,而近十年崛起的深度学习则是传统机器学习上进一步发展的第三代算法。深度学习算法的魅力在于它核心逻辑的简单且通用。在人类历史上,可能没有哪个方向的技术能在如此短的时间内吸引如此多的人投入其中,也没有哪个技术在如此短的时间被应用在如此多的场景。深度学习算法这过去6年可能说不上产生了多么重大的突破,但是产量绝对是惊人的,也给我们带来了许多意想不到的惊喜。回顾年到年,个人期间有幸参与了语音、视觉、NLP和推荐排序等几个领域。其中一部分是以直接算法应用研究角度,还有一部分是从框架系统支撑视角。部分工作是算法预研,还有部分成果应用在语音搜索,医疗影像,推荐系统等业务。这篇文章更多是结合自己实践经历,通过一些业界经典成果回顾了过去6年在深度学习算法方向上的技术迭代。最后做了一些归纳总结和展望。
2.语音识别
语音识别任务通常是将人的讲话转换成文字的能力。这个能力在GoogleVoiceSearch,iPhoneSiri助手等多个领域都有重要的应用。语音识别技术的研究从几十年前就已经开始,然而深度学习技术普及之前,离普遍产品应用还有不少的距离,错词率(WER)一直都比较高。即使在低噪音的环境下,通常至少在10%以上。传统的语音识别通常是多阶段的复杂工程:
先对语音做一系列信号处理,转换成中间格式,比如filter-bank。然后还会经过提取phoneme(音素)的阶段。再经过一些语言模型,路径搜索,词表等复杂流程。最后产生文字结果。
img
大概15年底到16年初的时候,我做了一个项目是帮谷歌voicesearch在tensorflow上实现Listen,AttendandSpell(LAS)这个论文的工作。LAS的工作是GoogleBrain的实习生William15年在上一代框架DistBelif上完成的,在当时相比传统方案是个不小的进步,它让语音识别从一个多阶段的算法和系统工程,变成了端到端几百行python代码的问题。具体可以大致总结在几个方面:
端到端语音识别。相比传统多阶段方法,这个模型使用filter-bankspectra作为输入,通过seq2eqwithattention的结构直接输出了语言文字。在没有附加外部语言模型的情况下就达到了14%的WER。附加语言模型达到10%的WER。在当时的K40GPU算力下,这个模型的复杂度是非常高的。其中多层bi-lstmencoder在序列比较长的时候几乎训不动。为了解决这个问题,采用了金字塔结构的encoder,逐层降低序列长度。attention机制帮助decoder能够提取encodersequence重要信息,显著提升解码的效果。同时decoder内部隐式学习了语言模型。
img
当时顺便开发了个debug工具,能抽样听某个voicesearch的录音,对比识别的文字结果。从实际情况抽样,这个模型已经超过一般人的水平。模型能并识别大量地名,物品名,型号名,比如galaxys5。模型训练速度在当时还是比较慢的。为了完成voicesearch数据的训练收敛,动用了个GPU,训练了将近2个月。为了多组实验并行,常常一口气跑到~个GPU。那会还是以GPUworker+PS的异步训练为主。很多人觉得异步训练会影响模型的收敛效果,也有人觉得异步训练能跳出一些局部鞍点。
从当时实验上看,精心调参的异步训练最终的确会超过同步训练实验。其中一个原因可能是当时同步训练在当时硬件设备和软件框架上太慢了,很难完成有效的迭代。从18年以后的经验看,同步训练的效果和异步训练的效果基本能不相上下,在某些场景同步训练的效果甚至更好(可能大batchsize对于稀疏特征场景这种样本分布不稳定的问题有一定的缓解)百度的DeepSpeech当时也非常优秀,影响更深远的是当时百度主推了HPC的训练模式,发扬了同步训练的RingAllReduce。现在回过头看,百度似乎是对的。TF可能是受早年MapReduce基于
转载请注明:http://www.0431gb208.com/sjszjzl/1492.html