视频主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
B站观看(对应P5-P6-P7):https://www.bilibili.com/video/BV1RE411g7rQ
资料汇总: 度盘 密码: 4v5i
(以上资料来源于网络)
以下内容只是对上述资料进行提炼,建议观看原视频,感谢李宏毅老师和其团队的辛苦付出!
系列文章索引:
深度学习与人类语言处理 李宏毅2020课程精华提要(1)模型的输入与输出
深度学习与人类语言处理 李宏毅2020课程精华提要(2)模型的构成之Seq-to-Seq角度
深度学习与人类语言处理 李宏毅2020课程精华提要(3)模型的构成之HMM角度
深度学习与人类语言处理 李宏毅2020课程精华提要(4)模型对齐(Alignment)
深度学习与人类语言处理 李宏毅2020课程精华提要(5)语言模型
前言
上一讲,作者讲了语音识别模型的big picture,即模型的输入输出是什么。下面涉及模型的具体组成,作者讲解的思路有2点,第一种是从Seq-to-Seq的角度出发,第二种从HMM算法的角度出发,具体区别如下:
模型视角 | 定义 | 常见的模型 |
---|---|---|
seq-to-seq | 从可变长度的输入到固定长度输出的模型 | LAS、CTC、RNN-T、Neural Transduce、MoChA |
HMM | 隐马尔可夫模型 | – |
本节先从Seq-to-Seq的角度讲解语音识别的模型。
Seq-to-Seq视角
语音识别领域的Seq-to-Seq模型大体上有如下的结构,从可变长度的输入到固定长度输出的模型,根据我的理解,我绘制了一张结构图(如下所示)。可变长的输入指的是输入的语音序列是变长的(图中x向量,一般用Filter Bank向量表示),输出的长度是固定的,固定体现在最终表示的是一个长度为V的独热编码(One-hot Vectors),不同位置的1代表出现了不同的单词,比如“我们”“来自”“上海”这三个单词,体现到独热编码的不同位置上的1。
另外,这里的Seq-to-Seq模型也有Encoder-Decoder(编码-解码)的成分,Encoder输入是一个变长的语音特征向量,输出的是一个定长的向量,这个向量也会被称之为High Level Features或者High Level Representations,总之,它就是一个定长的向量而已,其维度一般会比输入的语音特征向量要小(即:h< i)。Decoder的作用是输入“中间层向量”(h),输出变长的向量(y),这个定长的向量能够转化成人可以理解的文字信息。
通过以上的Seq-to-Seq和Encoder-Decoder模型,我们再来理解作者提高的几个模型,就容易多了。
LAS
LAS是Listen Attend和Spell的缩写,Encoder包含listen流程,Decoder包含attend和spell两个过程,LAS的Encoder部分包括:金字塔类型的双向LSTM。双向LSTM是为了获得更好的Context信息,金字塔类型有2个作用:(1)降低输入向量y的参数,体现在模型中就是h向量的维度少了,后续计算量会大大降低;(2)感受野几乎不变,在图像卷积网络中有一个感受野的概念,我觉得也适用于这里,金字塔越往上走,信息流在缩窄,但是越往上的信息流越能还原出的下面更宽的信息流,LAS的Encoder过程如下图所示:
LAS的Decoder部分简单来说,就是在RNN的隐藏层内加入了Attention机制,Attention机制目的是选取当前输出需要关注的向量,有些向量确实不需要关注,比如人在说话的时候,一般句子上下文都在附近,基本不会在很远的地方。Attention机制有点类似于跳层连接(Skip Connection),通过抑制一些向量的权重,从而只关注特定范围的向量。
另外作者还提到一组数据,非常有意思。在这篇文章发布的时候,只训练2000小时的效果比HMM稍微差一点,但是2年后,有人将数据量提升到12500小时后,WER达到了5%,已经接近人类水平了。这也说了深度学习需要的数据量是非常大的,之前的模型可能是因为数据量太少发生了欠拟合。
LAS看似一个体系非常完整的模型了,但是也有缺点,LAS模型的输入必须是一整句话,从上图Encoder也可以看出来,LSTM是双向的,而现实生活中,我们需要说多少识别多少,而不是把完整的句子说完再识别,这就是在线语音识别(On-line speech recognition),LAS的模型架构也限制了这种可能,所以作者说LAS还不是语音识别(ASR)的终极方案:LAS is not the final solution of ASR!
CTC
我们一般训练一个机器学习或深度学习模型的时候,往往都有固定长度的输入和固定长度的输出,比如图像识别问题:输入一张大小为256*256*3的图片,输出是其类别(0是猫,1是狗),输入定长、输出也是定长的,这样方便计算损失函数,从而方便我们训练模型的参数。
但是在语音识别的过程中,从输入到输出往往没有很好的一一对应关系,比如我说了一个词:好棒,如下图所示,我们怎么做标签(label)对齐呢?没有对齐数据,我们就无法计算loss,也无法进一步对模型的参数进行更新了。
CTC提供了一种思路,把原来的语音切成几个格子,以下图为例,把语音分成四个格子,我们把标签:“好”、“棒”填进去,因为有时候一个句子中也有地方不发音(如波形图波谷地段),我们就用一个“𝜙”(读作:诺)来表示。我们把“好”、“棒”和“𝜙”填入四个格子,会形成各种各样的组合方式,如图片右侧所示:
全部罗列出来非常费时,4个格子填入3个,如果不考虑顺序的话,需要3*3*3*3,就有81种填法,考虑顺序的情况下,也需要20种,更别提更长的句子了,枚举方式会随着标签和格子的数量呈现指数级的增长,换句话说,就是搜索空间过大。在解题的时候,我们更愿意选择线性级别或者平方级别的增长,我们讨厌指数级的增长。
CTC借助动态规划算法进一步降低搜索空间的复杂度,圆圈代表当前的格子可以填一个标签,规则是:“好”“棒”按照顺序发生,且一定要出现一次,任何字符可以重复多次。连线代表顺序,经过动态规划算法筛选后,就只剩下10种可能。
上面例子中,我们已经将搜索空间压缩到了只有10中,具体计算损失函数的时候,可以对这10种情况进行求和,但是上面知识一个简单的例子,对于一个较长的句子,动态规划压缩后的搜索空间还是太大了,CTC进一步通过forward和backward算法来计算损失函数,forward和backward算法类似于HMM中的解码算法,这里不展开了,具体参见:CTC求解loss和解码示例。
也就是说到这里,CTC解决的是输入语音的特征向量和标签之间的对齐问题。
在观察CTC的架构图后,我们也很容易发现CTC的缺点:CTC输出向量之间是独立的。
RNN-T、Neural Transducer、MoChA
RNN-T、Neural Transducer和MoChA,这部分作者讲的比较快,建议可以直接对照下面这张图去学习视频
总结
本篇从Seq-to-Seq角度讲述了模型的构成,一共涉及了6个模型,如下图所示,本节应该重点学习LAS和CTC,后续的模型都是这两个的变种。
模型名称 | 概要 |
---|---|
LAS | Encoder: 金字塔类型的双向LSTM Decoder:RNN结构的隐藏层内加入了Attention机制 |
CTC | 输入语音的特征向量和标签之间的对齐问题,但是输出向量之间相互独立 |
RNA | 把CTC中的线性分类器换成RNN,以解决输出向量之间相互独立的问题,相当于提供了“语言模型” |
RNN-T | 针对“一个输入,一个输出”,提出:一个输入,多个输出,比如th发音一个,但是有两个字符组成 |
Neural Transducer | 输入是一个window |
MoChA | 输入的windows可随意移动 |
下一节将从HMM的角度讲述语音识别模型的构成。