注:本文为一次课程展示所用幻灯片与报告存档。
目录背景
语音识别是一项可以使人与人、人与机器更加顺畅地交流的技术。近年来,语音识别相关的若干技术场景以及逐渐地改变了我们的工作和生活方式,如语音输入法、语音消息“转文本”、语音到语音翻译系统、检索语音信息等。同时,语音识别也能够极大地提升人机交流地能力,包括语音搜索、个人数码助理、游戏体验改进、智能家居、车载娱乐系统等等。这些种种应用场景,其对于机器理解人类语音地程度要求各不相同,但共同之处在于,我们都需要构建一种以包含语音地待识别音频为激励,以呈现识别结果的书面表达形式为响应的识别系统。
形式化地,语音识别问题可以表达为:
由此,我们可以引入语音识别问题的评价指标,它通常是定义在某一种识别单位上的错误率,如最常用的词错误率定义为以词为单位的编辑距离。所谓编辑距离是指对于给定的两个串A,B,串 A 修改为串 B 需要替换、删除、插入的元素数量总和的最小值。它的求解是一个非常经典的可以在多项式时间内求解的动态规划问题。
在引出语音识别系统的系统结构之前,我们需要首先对语音识别问题进行基本的模型构建与数学表达。根据语音识别问题的定义,我们利用Bayes定理并引入音素
由此我们将语音识别问题的求解拆解成为三个部分。声学模型负责给出对于一个确定的音素序列,它发声为当前音频的概率;词典模型负责给出一个词素序列的发音为一个音素序列的概率;语言模型给出一句话有多大概率是自然语言中的语句。
此外,在音频被识别推理之前,还需要经过前端的VAD、分帧、特征提取等信号处理步骤。综上所述,语音识别的系统结构可以粗略表示如下图所示。
方法综述
前端系统主要分为VAD、分帧、特征提取三个部分。
在这里我们讨论特征提取的两种常用思路:FBank和MFCC。FBank是由波形经过DFT变换产生频谱图并进行三角滤波后得到的,在此基础上再做LogDCT得到梅尔倒谱系数MFCC。显然,MFCC实在FBank的基础上进一步计算得到的。因此,相对而言,FBank的计算量更小,特征相关性更高,但同时因为它更加原始,所以信息的损失也更小。基于GMM的方法通常采用MFCC作为特征提取的方式,而基于神经网络的方法则通常采用FBank。
后端分为声学模型、词典模型、语言模型三部分。在这里我们着重讨论声学模型的主流研究方法。基于GMM-HMM的传统方法由于缺少上下文信息和难以利用深度的非线性特征,目前已经较少采用。一种简单的改进是采用DNN代替GMM,由此得到DNN-HMM方法,它只能通过拼帧来表达相关性,仍然不够。因此引入了LSTM-RNN来代替普通DNN,自动保留历史信息,但是这样构造出的声学模型复杂而难以训练。此外,以上方法我们需要对数据做手工的对齐标注,即标注每一词素的输出是由输入当中的哪一帧产生的,这样的标注过程非常费时费力,同时也限制了大量训练数据的产生。端到端方法的产生解决了这一问题。LAS作为一种带有注意力机制的seq2seq方法,通过Attention规避了需要手工对齐的问题,但是它无法实现真正的在线语音识别。CTC虽然可以在线识别,但是由于缺乏语言建模能力,且输出独立性假设存在明显的不合理性,单独使用很难达到较好的效果。RNN-T是在CTC的基础上改进产生,它解决了CTC两个最主要的问题,也是本文要重点讨论的对象。
RNN-Transducer
本节中我们主要介绍RNN-T的发展来源、模型结构、关键算法实现,并对齐性能表现进行讨论,同时给出其与其它常用端到端模型的对比以及其改进策略。
发展背景
基于DNN-HMM的方法虽然克服了无法学习到深度非线性特征的问题,并通过引入LSTM-RNN解决了无法整合上下文信息的问题,但是仍然面临着相当巨大的困境。为了训练传统的声学模型,我们需要大量的高度标注的数据。这种标注,不仅是对一段声音波形所包含的文字信息的标注,还需要包括每一个输出Token对应到哪一帧的音频输入上。不妨简单计算,每秒钟100帧的音频特征,对数万小时的训练数据进行这样的人工标注,成本巨大,难以接受。LAS通过引入机器翻译中常用的带有Attention机制的seq2seq,但是仍然面临着无法进行在线地流式识别的问题。
CTC是一个Encoder加上一个线性分类器的模型结构。Encoder负责将低级的语音特征转换为高级的深度特征,将这些特征输入到一个Softmax分类器中,得到该帧输出字符的概率分布。回顾我们之前讨论过的几个问题,上下文信息已经在Encoder层被编码到其输出中。同时,对于每个输入帧,CTC都会输出一个对应的Token。这个过程中并没有使用到将来的语音信息,因此它表现为一个自然的因果系统,可以完成流式的识别处理。
CTC中输出的Token可能是一个有效的语素或者为空,事实上,大量的输出都是空的。由于空语素的存在以及重复Token的输出问题,我们需要对输出序列做一些简单的后处理。我们将输出的序列先合并所有连续相同的Token,再删除其中的空元素。由于存在很多种不同的对齐方式都是正确的,在计算损失函数时,需要用动态规划计算所有合法路径总概率。注意 Token 的选择也是多样化的。
CTC 化繁为简,可以加速解码,但是仍然缺乏语言模型建模能力,因此无法实现真正的端到端联合优化。同时,CTC存在一个非常不合理的假设,即各输出之间时相互独立的。我们需要通过联合一个RNN语言模型来解决这一问题。
RNN-T在CTC的基础上改进得到。其演变过程如下图所示:
模型结构
RNN-T由一个Encoder,一个Decoder构成,这里我们将Pred. Network和Joint Network以及Softmax合起来看作一个Decoder。针对CTC网络的条件独立性假设即当前时刻输出与之前的输出条件独立,引入语言模型预测网络分支,通过联合前馈神经网络将二者结合,在预测最终输出时能够同时利用声学和语言特征信息。
具体地,Encoder的输入是经过编码后的声学特征信息,它会将这些信息映射到高阶表示。和CTC中的Encoder一样,它只与过去所有时刻的Encoder输入相关,因此它可以被作为一个CTC模型单独训练。
Decoder的输出之和整个网络过去所有时刻的非空输出历史相关。具体而言,它由预测网络和连结网络构成。预测网络通常使用一个由LSTM构造的RNN,它只和过去所有时刻的非空历史输出相关,而与Encoder当前的输出无关,这意味着它是一个纯粹的LM。连结网络是一个简单的前向传播神经网络,它产生logits,并交由Softmax层完成分类任务。
在Google的一项工作中,在grapheme作为建模单元基础上,引入了词组单元wordpieces,能够捕获更长的文本信息,有利于减少替换性错误。对于其中的CTC部分,采用多级CTC,建模单元包括音素phoneme、字母grapheme、词条wordpieces,此外在字母LSTM输出时,通过时域卷积来缩短时间片长度,减少参数量,加速训练。
算法实现
下面我们简单介绍实现过程中的几个算法设计问题。
在RNN-T的训练过程的实现上,需要使用Viterbi动态规划算法来完成损失函数以及梯度下降计算时导数反向传播求解的过程,因为损失函数是根据所有的对齐方式设计的,而一个正确的文字序列结果,对应的对齐序列的结果是指数级别的,我们不可能穷举所有的序列。
当然我们也可以将整个过程放在一个自动机上看。
在RNN-T的推理过程的实现上,模型输出了序列每个位置的值的概率分布,我们需要求概率最大的若干输出序列,虽然我们可以通过直接将分类器对所有帧输出的概率分布的最大参数拼接起来,但这样无法获得全局最优解。事实上,获得全局最优解无法在多项式时间内给出算法实现,因此我们考虑一种近似算法,通过Beam Search,一种带剪枝的广度优先搜索,即保证在搜索完概率树形结构的每一层后,队列中仅保留概率最大的不超过k个元素,以此来在推理开销和准确程度之间取得可以调节的平衡。
后记
RNN-T虽然解决了CTC的两个主要问题,但是它仍然面临着训练困难,以及输出的一些路径不够合理的问题。在最新的顶会文章中,LAS和CTC仍然是最为主流的思路。