Transformer 模型在自然语言领域被提出后,目前已经扩展到了计算机视觉、语音等诸多领域。然而,虽然 Transformer 模型在语音识别领域有着更好的准确率,但在流式的语音识别场景下,Transformer 模型的速度和延时往往阻碍其实际的应用。为了解决这个问题,微软 Azure 语音团队与微软亚洲研究院的研究员们一起提出了一套结合 Transformer 家族的编码器和流式 Transducer 框架的解决方案,并提出了 Mask is all you need 的方法对模型进行快速训练以及解码,让 Transformer 模型能够在普通的计算设备上进行快速的语音识别。 从场景上,语音识别可以分为流式语音识别和非流式语音识别。非流式语音识别(离线识别)是指模型在用户说完一句话或一段话之后再进行识别,而流式语音识别则是指模型在用户还在说话的时候便同步进行语音识别。流式语音识别因为其延时低的特点,在工业界中有着广泛的应用,例如听写转录等。
Transformer流式语音识别挑战
目前,Transformer 模型虽然在离线场景下可以进行准确的语音识别,但在流式语音识别中却遭遇了两个致命的问题:
1)计算复杂度和内存储存开销会随着语音时长的增加而变大。 2) Transformer 模型由于层数过多会导致未来窗口大小(lookahead window)传递。 为了解决上述 Transformer 模型在流式语音识别中的问题,科研人员提出了基于块(chunk)和基于记忆(memory)的两种解决方案。
1) 基于块(chunk)的解决方案
这是一种基于块的解决方案。其主体思想是把相邻帧变成一个块,之后根据块进行处理。这种方法的优点是可以快速地进行训练和解码,但由于块之间没有联系,所以导致模型准确率不佳。 2) 基于记忆(memory)的解决方案
基于记忆的解决方案的主体思想则是在块的基础上引入记忆,让不同块之间可以联系起来。然而,此方法会破坏训练中的非自循环机制,使得模型训练变慢。
工业界中往往有着大量的训练数据,基于记忆的解决方案会让模型训练开销增大。这就促使研究人员需要去寻找可以平衡准确率、训练速度和测试速度的方案。
快速训练和解码:Mask is all you need
针对上述问题,微软的研究员们提出了一种快速进行训练和解码的方法。该方法十分简单,只需要一个掩码矩阵便可以让一个非流的 Transformer 变成流的 Transformer。 研究员们提出了一种基于块的流式 Transformer,具体算法如下:
首先,在当前帧左侧,让每一层的每一帧分别向前看 n 帧,这样随着层数的叠加,Transformer 对历史的视野可以积累。如果有 m 层,则可以看到历史的 nm 帧。虽然看到了额外的 nm 帧,但这些帧并不会拖慢解码的时间,因为它们的表示会在历史计算时计算好,并不会在当前块进行重复计算。与解码时间相关的,只有每一层可以看到帧的数目。
因为希望未来的信息延时较小,所以要避免层数对视野的累积效应。为了达到这个目的,可以让每一个块最右边的帧没有任何对未来的视野,而块内的帧可以互相看到,这样便可以阻止延时随着层数而增加。最后,在每个块之间让不同帧都可以相互看到,这样平均延时即块长度的二分之一,在解码过程中,解码时间主要由块的大小而决定。将之前的 key 和 value 进行缓存,这样可以避免重复计算,以加速解码。
更多技术细节,详见论文:Developing Real-time Streaming Transformer Transducer for Speech Recognition on Large-scale Dataset
论文链接:https://arxiv.org/abs/2010.11395
内容中包含的图片若涉及版权问题,请及时与我们联系删除
评论
沙发等你来抢