CICC科普栏目|一文梳理深度学习算法演
发布时间: 2023-07-11

///编辑:

作者 | Peter潘欣

来源 |

涉及语音、图像、nlp、强化学习、隐私保护、艺术创作、目标检测、医疗、压缩序列、推荐排序等方向。文章较长,干货满满。

1. 前言

如果说高德纳的著作奠定了第一代计算机算法,那么传统机器学习则扩展出第二代,而近十年崛起的深度学习则是传统机器学习上进一步发展的第三代算法。深度学习算法的魅力在于它核心逻辑的简单且通用。 在人类历史上,可能没有哪个方向的技术能在如此短的时间内吸引如此多的人投入其中,也没有哪个技术在如此短的时间被应用在如此多的场景。深度学习算法这过去6年可能说不上产生了多么重大的突破,但是产量绝对是惊人的,也给我们带来了许多意想不到的惊喜。 回顾2015年到2021年,个人期间有幸参与了语音、视觉、NLP和推荐排序等几个领域。其中一部分是以直接算法应用研究角度,还有一部分是从框架系统支撑视角。部分工作是算法预研,还有部分成果应用在语音搜索,医疗影像,推荐系统等业务。 这篇文章更多是结合自己实践经历,通过一些业界经典成果回顾了过去6年在深度学习算法方向上的技术迭代。最后做了一些归纳总结和展望。

2. 语音识别

先对语音做一系列信号处理,转换成中间格式,比如filter-bank。

然后还会经过提取phoneme(音素)的阶段。

再经过一些语言模型,路径搜索,词表等复杂流程。

最后产生文字结果。

先对语音做一系列信号处理,转换成中间格式,比如filter-bank。

然后还会经过提取phoneme(音素)的阶段。

再经过一些语言模型,路径搜索,词表等复杂流程。

最后产生文字结果。

展开全文

img

端到端语音识别。相比传统多阶段方法,这个模型使用filter-bank spectra作为输入,通过seq2eq with attention的结构直接输出了语言文字。在没有附加外部语言模型的情况下就达到了14%的WER。附加语言模型达到10%的WER。

在当时的K40 GPU算力下,这个模型的复杂度是非常高的。其中多层bi-lstm encoder在序列比较长的时候几乎训不动。为了解决这个问题,采用了金字塔结构的encoder,逐层降低序列长度。

attention机制帮助decoder能够提取encoder sequence重要信息,显著提升解码的效果。同时decoder内部隐式学习了语言模型。

端到端语音识别。相比传统多阶段方法,这个模型使用filter-bank spectra作为输入,通过seq2eq with attention的结构直接输出了语言文字。在没有附加外部语言模型的情况下就达到了14%的WER。附加语言模型达到10%的WER。

在当时的K40 GPU算力下,这个模型的复杂度是非常高的。其中多层bi-lstm encoder在序列比较长的时候几乎训不动。为了解决这个问题,采用了金字塔结构的encoder,逐层降低序列长度。

attention机制帮助decoder能够提取encoder sequence重要信息,显著提升解码的效果。同时decoder内部隐式学习了语言模型。

img

从当时实验上看,精心调参的异步训练最终的确会超过同步训练实验。其中一个原因可能是当时同步训练在当时硬件设备和软件框架上太慢了,很难完成有效的迭代。从18年以后的经验看,同步训练的效果和异步训练的效果基本能不相上下,在某些场景同步训练的效果甚至更好(可能大batch size对于稀疏特征场景这种样本分布不稳定的问题有一定的缓解) 百度的DeepSpeech当时也非常优秀,影响更深远的是当时百度主推了HPC的训练模式,发扬了同步训练的Ring AllReduce。现在回过头看,百度似乎是对的。TF可能是受早年MapReduce基于commodity machine的分布式思路影响比较深。当然后面的TPU也回到了HPC的轨道上。

3. 图像识别

15~16年的ResNet算得上是比较突破性的工作了,从它超过10万的论文引用量就能看出来。ResNet之前是VGG,AlexNet等统治世界,那时候模型还比较浅,和ResNet相比只算得上是“浅度学习” :-)。16年初的时候,谷歌内部还没有ResNet的TensorFlow实现(当时内部用Inception比较多)。我于是基于TensorFlow写个ResNet出来给大家用。

img

ResNet的突破性在于基于相似结构(Residual Block)的重复堆叠,并通过Residual Connection将这些Blocks联起来,实现非常深的模型训练。Residual Connection之前,很深的网络训练会有比较明显梯度暴涨和衰减的问题。记得早年Hinton老爷子训练多层模型是训完一层再加一层,效率会比较低。基于ResNet的结构,模型可以轻易的加到1001层。个人觉得,深度学习在ResNet之后才成为真正的”深度“学习。BatchNorm相信每个搞深度学习的都非常熟悉,这也是ResNet的核心模块。时间回到16年初,我发现谷歌内部竟然没能找到一个TensorFlow正确实现的BatchNorm。有少量错误的实现版本的确在被使用,但是好像并没有被察觉。有个笑话说的是你可能分不清一些深度学习模型结构到底是bug还是feature,修复了“bug”反而导致模型的效果下降。 当时TensorFlow写个BatchNorm还需要通过加减乘除来拼接。我碰到一个神奇的问题就是ResNet加到1001层后会发生诡异的数值错误,通常是NaN。记得仔细Debug后,好像是参数有个moving average的默认值0.999...后面的9的个数是有讲究的。 后来我把早期完全没有性能优化(那会还没有FuseBatchNorm)的ResNet放到tensorflow model zoo github上开源了。AWS和一些机构没有调优就拿过去做了一些benchmark,得出tensorflow性能远差于其他框架的结论。TensorFlow的老板们表示非常不满,于是tensorflow 1.0版发布专门搞了个官方优化的性能benchmark。

4. 语言模型和文本归纳

语言模型可以说是NLP领域的核心基础算法。16年的语言模型还没有现在的BERT如此强大。当时还有不少的流派,比较传统的是Ngram模型,基于全网数据训练一个数百GB的Ngram模型在公司有广泛应用。 然而新的挑战者已经在路上了。当时深度学习的当红是LSTM和它的兄弟们,比如Bi-LSTM。不过当时LSTM在TensorFlow上的速度真是一言难尽,实际生产都会退而求其次选择GRU。后来英伟达搞了个cudnnLSTM,才算有了比较显著的进步。 我做语音模型时需要训练一个domain specific的语言模型,和搜索部门转岗过来的大哥在这块有些合作。当时他结合搜索业务场景,搞了个byte-level语言模型,词表只有256个,目标是预测下一byte,这个模型厉害之处除了非常精小,而且语言无关,可以同时预测混合中英文和数字的文本。上线到搜索词补全上,取得了不错的业务收益。 文本归纳人机对比示例:

img

实际Debug分析时,我们发现文本归纳模型对于股市类新闻的归纳非常的精准。但是在许多复杂场景还是有比较严重的缺陷的。比如某个警匪案件中,A发现B的兄弟C谋害了D,模型很容易就会错误归纳成B谋害了D,或者D谋害了C。 当时模型的优化目标是F1 Score,简单的说就是比较样本和预测之间字词是否一样。这显然是有缺陷的,每篇文章都有很多不同的归纳方法。 当时有个研究员建议我先基于海量数据预训练语言模型,然后再用dailynews fine tune这个文本归纳模型。放到今天这是个不言而喻的常规操作,然而当时我却因为其他事务没有尝试。

img 5. 深度强化学习与AlphaGo和AutoML

img

深度强化学习大概是16~17年迎来了一个小高潮,原因是AlphaGo战胜了人类世界冠军,紧接着又迭代了AphaGo Zero和AphaZero两版,俗称AlphaGo三部曲。当时Brain请DeepMind的同事过来做了些分享,对我的震撼还是挺大的,强化学习跟动物的自然学习方式太像了。

简单回顾一下AlphaGo系列三部曲:

AlphaGo先从人类走棋数据集上学习policy network。监督数据就是基于当前棋局s,预测人类行为a。

初步学习后,AlphaGo再和自己玩,用RL的policy gradient进一步优化policy network,提升行为准确性。

然后用policy network生成很对局数据,数据用来训练value network。value network简单来说就是预判当前局势的胜率。

AlphaGo先从人类走棋数据集上学习polic

微信