1

1+.png

前言

TPNN作为学而思网校自主研发的深度学习平台,专门针对声学模型训练进行了架构优化,可以轻松帮助研发人员完成语音特征和解码器的无缝对接,同时在此框架下,我们也实现了主流的声学模型架构和高效的多卡训练技术,在TPNN的框架下,我们进行了大规模数据下儿童声学模型的技术研发。

通过大量实验,包括模型结构,特征维度,建模单元等,结合n-gram语言模型,融入了上万小时的儿童英语数据,最终实现了最适合中国儿童的英语识别的声学模型架构,我们的儿童声学模型可以达到92%以上的识别精度,拥有领先业界的性能。

同时考虑到业务的需要,我们也实现了儿童声学模型的离线识别方案,利用8bit量化,neon优化,混合精度运算等技术,我们可以在损失少量的性能的情况下,在移动端达到接近服务器的计算速度。

本文将从TPNN的“多卡训练技术” “声学模型训练” “移动端的模型优化”这几个方面为大家介绍学而思网校的儿童声学模型训练技术。

一、TPNN的多卡加速技术

基于深度学习的的声学模型在语音识别领域取得了巨大的成功,但这些模型的训练都必须建立在海量的数据训练上,面对海量的训练数据,模型的训练时间大大增加,识别会严重拖慢研究和开发进度。 因此高效的多卡训练方案对于一个深度学习框架是一个非常重要的环节。

TPNN拥有在NVidia的NCCL通信框架基础上,利用BMUF技术,搭建了一套高效率的多卡加速框架。

二、数据同步并行框架

目前深度学习领域,已经有若干并行训练技术的成功尝试,基本解决方案主要是基于数据并行基于模型并行两种。

其中模型并行针对GPU显存有限的问题,将大模型分层拆分到各个gpu进行流水线运算,而数据并行则是拆分训练数据进行子路运算,根据数据交换的策略不同,数据并行方法又可以分为同步并行异步并行

异步并行算法最著名的实现当属google公司开发的DistBelief框架,根据google公布的结果显示,随着并行机器的增多,AGSD的性能会存在不稳定的现象,该方法训练的模型与minibatch-sgd孰优孰劣尚无定论。

TPNN采用的基于数据并行的同步训练方案,利用改进的BMUF算法进行全局模型迭代更新,从大量实验数据来看,多路性能相对单路基本持平,并且可以实现接近线性的加速比。

2+.png

Figure1  数据同步并行的基本架构

数据同比并行是指对训练数据做切分,同时采用多个模型实例,对多个分片的数据并行训练,并在定期时间内将多个模型的梯度同步到parameter server进行求和平均,在分发到各路子模型。

这里同步的时机可以采用一个batch内的拆分同步,这样可以基本可以模拟单路的训练过程,但这种方法有两个缺点,就是当batch比较小时,多路gpu之间的同步开销将会很大,所以这种方法通常需要加大batch重新超参数进行训练,为此TPNN的多卡同步才用的是N个batch同步策略,具体训练过程中我们可以调整N达到最大的性能和速度之间的平衡。

图二显示了我们采用这种训练方式的数据组织方法,我们将数据拆分成M*N个块,其中N为并行gpu的数量,M为数据同步的block频率,每个block包含n个batch的数据。

3+.jfif

 Figure2 数据训练集的拆分结构

TPNN的底层数据通信采用基于NCCL的方案,NCCL核心提供了gpu层面的all-reduce算法,这项技术也帮助我们实现了gpu在训练过程中进行频繁数据交换的可行性。

同时NCCL本身也提供了跨机通信能力,多机间通过Sockets (Ethernet)或者InfiniBand with GPU Direct RDMA通信。这对于我们可以较为轻松的将单机多卡技术进一步扩展到多机多卡技术。

4+.jfif

Figure3  NCCL all-reduce通信技术

三、BMUF算法

(Blockwise Model-Update Filtering)

将多路计算的梯度同步到再进行分发的过程通常成为MA(模型平均)算法,这种算法实现简单,但是随着并行机器的增长,模型的性能会差过单机模型。

我们发现,每个block合并后的梯度贡献为单路SGD算法的1/N(公式1,其中G为全局梯度,g(t)为每一路梯度)因此MA训练中需要将将学习率调大N倍,但这并不总是奏效的。

5+.png

针对MA的缺点,论文[2]提出了一种基于块冲量的全局更新算法(Blockwise Model-Update Filtering,BMUF),利用每一层block增加的冲量梯度更新,可以维持梯度更新量不会发生损失,详细的证明有兴趣可以参见一下论文。

6+.jfif

其中ƞ称为block一级别的冲量,δ称为块学习率。

TPNN正是结合底层NCCL技术和BMUF算法,打造了高效、高性能的训练算法框架,我们在此基础上完成了上万小时的大规模儿童数据训练,利用四张卡并行,我们可以达到3.6倍的加速比,在三天左右即可完成上万小时以上的LSTM模型声学迭代。

四、基于LSTM-CTC技术的儿童声学模型训练

1、LSTM模型结构简介

      深度学习模型在数据特征学习领域的地位越来越无可替代,目前比较典型的神经网络主要有:DNN、CNN、RNN、LSTM、TDNN、FSMN等,其中DNN和CNN网络结构属于静态分类网络,尤其CNN(convolution neural networks,卷积神经网络),能够非常好地学习到具有空间关系的数据特征,如图像的识别与分类。

7+.jfif

Figure4 CNN网络结构

而时序数据是一种时序关系非常重要的变长输入序列,因此动态分类网络将更适合于时序数据的学习,RNN(recurrent neural networks,循环神经网络)、LSTM(Long Short-Term Memory)正是处理这种时序关系非常有效的动态网络结构。

8+.jfif

Figure5 RNN网络时间展开图

RNN的时间展开图如上图所示,在进行误差反向传播(error backpropagation)时,当我们已知损失函数对时刻隐状态向量的偏导数时,根据链式法则,我们计算损失函数对时刻隐状态向量的偏导数。

9+.png

当t很大时,该偏导数取决于矩阵Whh的最大的奇异值是大于1还是小于1,要么结果太大,要么结果太小,对应的训练结果则是梯度的爆炸或消失。

10+.png

11+.png

Figure6 rnn梯度爆炸

基于RNN的不足,LSTM网络通过引入3个门电路对长短期的时序数据进行选择性的遗忘、记忆,其中黄色方框表示神经网络层,粉色圆圈表示点数据操作运算,其数学形式:

12+.png

对应的网络结构如下图:

13+.png

14+.jfif

Figure7  LSTM模型结构

LSTM目前有很多变体,在我们的TPNN训练平台中,我们采用了当前最流行的一种变体,即加入了peephole connection,利用上一时刻的细胞记忆状态对忘记门和记忆门进行修正,利用当前的记忆状态对输出门进行修正,其peephole的修正公式及修正结构如下图所示:

15+.png

Figure8  LSTM with peephole

2、CTC训练准则

训练准则在模型训练中起着至关重要的作用,直接决定模型训练最终效果的好坏,我们采用CE(cross-entropy 交叉熵)、CTC(connectionist temporal classification)[4]两种训练准则进行试验。

CE训练准则的本质上是模型将输入序列与标注序列进行一一对应,然而,语音的每一帧特征并非都有准确的Label,因此基于帧级别的CE训练准则很难使模型达到最佳的识别性能。

CTC是一种让网络学会自动对齐的方法,connectionist表示序列联结,temporal表示时序类别,classification表示分类,其直观理解即为连接性的时序分类准则,它更符合语音识别的真实问题。

 如下图所示,Waveform中的每一帧语音并不能完全准确的找到真实的Label,但是其某一段时序帧系列则很容易能确定它的对应的真实Label,即图中的speak(尖峰),其它区域则用blank代替。

16+.jfif

Figure9  CTC blank 尖峰

CTC准则的序列化映射数学表现形式为:

17+.png

CTC准则的训练流程与传统的神经网络训练过程类似,先构建loss function,然后根据BP算法进行训练,不同之处在于CE准则针对每一帧的数据,即每帧训练误差最小,CTC准则是基于序列(如语音的一句话),最大化的值,序列化的求解相对CE更加复杂,因为一个输出序列可能对应很多条路径,所以引入前后向算法来简化计算。这里只对前向算法进行简要介绍,后向与前向算法相似。

首先需要弄清两个概率符号的关系:p()和p(),p()表示给定输入x输出路径为π的概率,p()表示给定输入x输出序列为的概率,因此输出的序列为的概率可以表示为所有输出的路径映射后的序列为的概率之和:

18+.png

由于输出序列与目标序列的直接去重映射存在两个问题:无法预测有连续重复字母的单词,无法预测一整句话,单词间无法分割。因此,前向计算前,我们需要对输出序列进行预处理,插入blank操作。

输出路径与目标序列的序列映射关系可用下图来理解,白色圆圈表示一个label,黑色圆点表示插入的blank,纵向一列表示插入blank后的输出序列,横向表示路径总帧长度。

图中长度为T的输出路径映射到序列:C A T,可以由第T步为label:T的所有路径和第T步为空格的所有路径的概率之和来表示。

19+.png

Figure10 ctc loss的路径概率计算

递推公式的前面变量为:

20+.png

反向传播与前向类似,不再介绍,由于前后向计算均涉及大量概率计算,因此在计算时需要对其做取对数处理,将乘法转化为加法,不仅可以避免underflow问题,还可简化计算。

CTC损失函数的计算公式:

21+.png

损失函数可以解释为:给定样本后输出正确label的概率的乘积,再取负对数。

在TPNN平台训练中,我们采用LSTM模型作为基础模型,基于LSTM的结构,我们进行了大量的对比试验,包括训练集对齐状态数、训练数据组合策略、网络深度和宽度、记忆单元维度、学习率调整策略、输入特征维度等。

最终我们采用了3层的LSTM变体结构和CTC训练准则,在不损失识别性能的前提下,压缩网络结构的宽度,选取适中的记忆单元维度。

在儿童真实线上数据集上,我们的模型的表现性能达到了92.48%的识别精度。

五、移动端声学模型优化

由于移动端资源的限制,大部分深度学习引擎都部署在云端,移动设备获取到输入数据,经过简单的加工,发送给云端,云端服务器经过深度神经网络推断运算,得到结果并反馈给移动端,完成整个过程。

显而易见,这种交互方式有很多弊端,比如依赖网络,流量过大,延迟太长,更重要的是,云端服务器必须有足够大的并行计算能力,如果移动端请求量太大,超过负荷,容易导致服务器宕机,特别是在儿童教育场景模式下,存在很多瞬时并发非常高的业务场景,这个时候,一旦服务器算力不够,将会造成非常不好的教学体验。

因此,将语音识别能力部署到移动设备上,是满足当下儿童业务场景的一项必须的工作。然而,成功将深度学习引擎部署到移动端并非易事。运行速度,内存占用,各类机型覆盖,都是必须逾越的障碍。

接下来我们将介绍我们是如何将儿童声学模型成功应用到手机上的,其中包括了模型压缩,定点化,解码加速,neon计算优化以及混合精度计算优化等技术。

1、模型裁剪和压缩

传统的LSTM拥有比较大的计算量,这种LSTM结构在堆叠几层后,训练的声学模型很难在线上环境中使用,为此google提出了LSTM with projection layer的结构[3]。通过在最后一层增加线性投影变换层,可以大幅度减少堆叠LSTM层的计算量。

在实际应用中,我们在google的基础上进一步实验发现,我们可以将线性层压到非常小的维度而几乎不损失性能。

在实际上线的过程中,我们将投影层控制到非常小的维度,而将cell的维度在调整到1000维以上,相对于不加投影层,我们在原始LSTM模型的基础上减小了3~4的计算量。

22+.jfif

Figure11 LSTM with projection layer结构

2、模型的8bit量化

由于移动平台的浮点计算能力相对较弱,我们在对模型进行了定点化压缩,将权重压缩到8bit进行存储,存储大小缩小为原来的四分之一,并同时实现了LSTM模型8bit计算推理,通过在arm平台的深度定制优化,我们的声学模型在牺牲少量性能的情况下达到服务器的计算速度。

3、低精度矩阵的计算优化

声学模型运算最耗时的部分就是是矩阵乘法,所以要实现8bit计算推理,首先需要考虑的就是矩阵的低精度快速乘法,arm平台上提供了基于neon的并行计算指令集,我们的优化都在并行计算指令集的基础上进行。

这里介绍一下我们在arm平台的一些优化思路:  

饱和溢出的处理至关重要!我们在优化过程中采用了8bit->16bit,16bit*16bit->32bit的方案,溢出过程中的处理借助于neon提供的饱和指令集完成。参数的定点化和char转回浮点都需要使用neon指令加速,防止定点化带来太多多余的计算开销。

参数计算由float的4*4分块改成4*8分块,这里主要考虑两点,分块矩阵可以更大限度利用cache,将整个矩阵计算过程维持在高速cache中进行,同时neon位宽128bit,一次最多可以同时计算八个char,最终采用4x8分块。

我们在定点化的时候输出矩阵采用转置输出,这样两个矩阵在运算的时候可以进行连续的内存访问,提高cache的访问效率。

23+.jfif

Figure12 低精度矩阵计算优化

除了通用的矩阵的矩阵运算结构,我们还针对LSTM的计算特性,对特殊的矩阵运算结构,比如Matrix*vector进行了定制优化。

4、混合精度计算

众所周知,由于LSTM模型的相对复杂的结构,已经存在好几个非线性的门结构,要实现LSTM的全量8bit运算是很困难的,为此我们通过研究和实验了一种8bit和float32的混合精度计算结构,可以在精度保持的情况下,最大限度的利用定点优化提升计算速度。

实验过程中,我们将输出X和前一个时刻的隐转态的线性变换转换为定点计算,同时将计算输出转换为浮点结果,送入门结构,保持门结构的浮点计算能力。

最后我们看下在移动平台的测试效果,测试cpu为骁龙710,可以看到通过优化,我们的离线声学模型可以达到0.3左右的计算实时率,完全可以比肩服务器的计算速度,也成功实现了手机上的离线识别,在网校的各个教育业务场景完成了落地。

24+.jfif

Figure14 计算实时率优化曲线

参考文献

[1]Asynchronous stochastic optimization for sequence training of deep neural networks.

[2]Scalable Training of Deep Learning Machines by Incremental Block Training with Intra-block Parallel Optimization and Blockwise Model-Update Filtering.

[3]Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling.

[4]Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks.

作者简介

唐凯、孟凡昌老师,均为好未来学而思网校事业部智能研发部高级数据算法工程师

END

招聘信息

好未来技术团队正在热招视觉/图像算法、后台开发、运维开发、后端开发Golang、web前端开发等高级工程师岗位,大家可点击本公众号“技术招聘”栏目了解详情,欢迎感兴趣的伙伴加入我们!

也许你还想看

重磅总结|9大技术方向,30+篇好文!2019好未来技术合辑新鲜出炉!

前端组件化-高质高效协作利器

纪实|我是一名程序员,我用代码为你守候

1.jfif


好未来技术团队
416 声望1.3k 粉丝

好未来作为一家科技驱动的教育企业,始终坚持“爱和科技让教育更美好”的使命。