课程向:深度学习与人类语言处理 ——李宏毅,2020 (P4)

语音辨识模型1:LAS (Listen, Attend, and Spell)

李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
课件ppt已上传至资源,可免费下载使用

Speech Recognition 语音辨识 模型部分

在这里插入图片描述
根据统计,模型的使用情况如下表:

Models Probability
LAS 40%
CTC 24%
HMM-hybrid 15%
LAS+CTC 11%
RNN-T 10%

接下来将介绍在语音辨识部分常见的这几种模型

Model 1: LAS (Listen, Attend, and Spell)

   [Chorowski. et al., NIPS’15]

该模型就是传统的带有attention的seq2seq*(不叫seq2seq,因为第一篇在语音辨识中使用此方法的论文名就叫LAS,且语音辨识的所有模型都是seq2seq式模型,有歧义)*
其中
  Listen☞Encoder
  Attend☞Attention
  Spell☞Decoder

1 Listen

作用

  1. 抽取语音内容信息
  2. 消除语者和语者间的差异,去除噪音

输入:声学特征 x1,x2,…,xT
输出:高维表征向量 h1,h2,…,hT
在这里插入图片描述
其中Listen的Encoder部分可使用的模型有双(单)向RNN1-D CNNCNN+RNN*更为常用(可以在前几层x1、x2、…、xT使用1-D CNN做filter之后再接RNN得到隐藏层向量h)、或者选择带有Self-attention Layers的方式做Encoder。

Down Sampling

在语音辨识中很重要的数据预处理是要对输入做Down Sampling,因为一段声音讯号表示成 acoustic features 声学特征向量 太长了,1s就有100个frames,相邻的向量间还有很多重叠,为了节约计算量和提高效率

I 减少RNN类模型的运算量所使用的Down Sampling
在这里插入图片描述
Down Sampling有很多实现方法,举例来说,最早的是16年提出的 Pyramid RNN ,在传统的RNN中输入4个向量输出4个向量,但在Pyramid RNN内如图第二层中将两个向量transform成一个向量,使得第一层输入4个向量,输出为2个向量。(Down Sampling的技术对于语音辨识来说是不可或缺的,谷歌在发表LAS的作者说一开始不知道要Down Sampling,在前期语音信号根本都 train不起来,数据量过大);同年另一种经典的处理方法 Pooling over time,两者类似,不过Pooling是在两个中选一个送到下一层,而Pyramid是两者结合成一个送到下一层。

II 减少CNN、Attention类模型的运算量所使用的Down Sampling
在这里插入图片描述
CNN为例,在语音辨识中,CNN常用的变形是Time-delay DNN(TDNN)(就是1-D的CNN,先用这种方法的人起的名),在一般CNN filter里会将范围内所有的部分都考虑,但对TDNN来说将只会考虑开头和结尾(就是dilated convolution,空洞卷积,名字不同而已)。

Self-attention中,一般而言,在每一个时间点每一个feature都会去attend到所有的feature,如将x3变为h3,要考虑所有的x才能得到h3,都要做attend计算,(在Translation翻译问题上这种方式是毫无疑问的,因为在翻译中 源句的词序可能会被打乱地翻译到 译句中,且输入输出长度有限)。但问题是,在语音上输入部分向量很长,没办法做全部的attention,故使用Truncated Self-Attention(如,在做x3的attention时只考虑前后一部分*(这个长度是个可调的参数)*的范围内做attend,这种方法有一定道理的,语音辨识的输入输出也是顺序的。)

2 Attend

在LAS中的Attention和其他的seq2seq中使用的attention没有什么不同,大家如果足够了解可跳过这一部分,但老师在这里的讲解非常详细清晰,图文并茂,一点都不了解的可以参照视频P4的11.28时间段开始听。Attention真的很重要且经典实用(如今的各种transformer模型等)。有两种经典的Attention:Dot-Attention和 Additive-Attention
Dot-Attention
在这里插入图片描述
对于Dot-product Attention,首先有个vector z0,和Encoder的输出h1、h2等去一一计算attention,这个计算attention的感觉就像是搜寻,像通过关键字去查询资料库,z0就是关键字,h等就是资料库的内容。在做attention时会有一个function,match这个方式会以z0和来自Encoder的输出h1(至h4)作为输入,会通过计算得到一个数值α。在此便产生了两种match方式,一个常用的方式是如上图的Dot-product 点积运算。

h和z是match的输入,将h和z分别乘上一个矩阵各得到一个新的vector(上图Wh和Wz的上面的绿色框和黄色框),再将这两个vector做dot-product得到α。
这里的match方式就是相当于计算z0和h1的相似度α,z0会和每一个h计算attention得到α。

Additive-Attention
在这里插入图片描述
另一种match方式是Additive-Attention,同样输入h和z,再分别乘上一个矩阵,但之后不是做dot-product而是将这两个新vector加起来,再通过激活函数tanh得到向量W,再transform得到α
在这里插入图片描述

这里的z0会和每一个h计算attention
如 z0和h1 得到 α1、z0和h2 得到 α2,…接下来再将同一行的α做softmax,使这些α和为1,再将这些softmax后的α去乘上各自的h得到最终的向量c0。
就像上图一样,假设softmax后得到的α1 = 0.5 α2 = 0.5 α3 = 0 α4 = 0最终c0 = 0.5h1 + 0.5h2

接下来c0会被当做Decoder的Input,这个c在文献上常常被称为Context vector

3 Spell

在这里插入图片描述
c0最为Decoder的输入只是一种用法,在z0和c0作为输入时,通过RNN得到隐藏层向量z1,再经过一次transform会得到一个由所有tokens构成的Distribution概率分布矩阵(就像上一篇所讲,tokens有很多种选择可以是Grapheme字母汉字 Phoneme音素 Morpheme词根、缀 或Word词,甚至是bytes)如果token是 英文的Grapheme时,则可得到的Distribution如上图所示,概率最大的c将是本次Decoder的输出。

在这里插入图片描述
之后再将z1作为关键字再去一一做attention得到c1,依次类推得到c2、c3。
在c1作为Decoder的输入时,与前一个timestamp得到的token也会变成Decoder这次的输入,反复继续下去,直到输出特殊符号 <EOS> (End of Sentence)。在这样逐一生成token的过程中将会使用一种算法 Beam Search。

Beam Search

在这里插入图片描述

假设现在所有的token只有A和B(当然现实中无论什么语言都不会只有两个token),在第一个timestamp时,Decoder产生第一个token的distribution是
A = 0.6,B=0.4,那么选几率最大的那个便是A,这个就叫做Greedy Decoding(类似贪心算法,贪心解码),依次类推,每一个timestamp都将得到几率最大的token,最终将得到A->B->B。注意,看Spell的模型图,在下一个timestamp时候,输入包含上一步的输出,会逐个影响,就像是A->B->B选择A的输出会影响B的输出,选择B的输出会影响下一个B的输出。但这种方法得到的整体概率是不一定最大的,就像贪心算法一样,每一次都选几率大的最终整体的几率不一定最大。就像上图一样 B->B->B的整体几率是大于Greedy的A->B->B,这样生成的token是整体稳定的,理论上是更好的。

在实际上没有办法遍历所有的可能性,找出整体几率最大的路径,而Beam Search是解决Greedy Decoding的一种方法,每一次都保留B(Beam Size)个最好的路径。
假设B=2,如上图,在一开始,可以选择A 可以选择B,每次都保留2个最好的路径,所以就保留A 和 B。之后,我们有A->A A->B B->A B->B四条路径,选择2个概率最高的路径保留,是A->B 和 B->B。再得到A->B->A A->B->B B->B->A B->B->B四个路径,同样保留两个。以此类推,在最后剩余的两条路径选择最好的。注意,代码中B是一个参数,需要自己实验调改。

4 Training

在这里插入图片描述
Teacher Forcing
在训练过程中,假设输入的是cat的语音,输出的是c a t的token。则对于我们的模型来说,我们可将token改为one-hot 矩阵,使得训练模型,在每一个timestamp得到的token distribution与one-hot矩阵的CrossEntropy越小越好,即如图所示,在第二个timestamp上使得生成a的概率更大。

注意,在使用模型时,一般而言,在输出第二个distribution的时候会参考第一个distribution生成的结果,会选择其中最大的一个token变成第二个distribution的输入再产生第二个distribution。但在训练的时候,我们通常会不考虑上一个distribution生成的结果,如在输出a之前,已知c,则我们直接给模型输入c,而不管上一个真正的生成的distribution。这种将正确答案放在训练的过程中叫做Teacher Forcing

如果我们拿前一个timestamp的输出当下一个timestamp的输入,会存在什么样的问题呢?因为在训练的过程中,一开始model的参数是随机的,故一开始的decoder部分效果是非常的烂,很可能第一个生成的token不是c而是x,则对于后续部分,模型会认为在输入x后应该输出a,而不是看到c输出a。经过训练后,模型变好了,会在第一个token部分生成c,但之前的所有训练都白费了。 不管前一个timestamp生成的是什么,我们只要正确答案c,模型只要在后面专注于输入c生成a就好,这种方法就叫做Teacher Forcing。在有encoder、decoder的模型架构中,这是关键的一步。

Attention
再回到attention上面来,我们是怎样将attention放到decoder部分里呢?
在这里插入图片描述
就像是3 Spell里面所讲(见上图的左),我们把 Decoder的hidden state 拿出来,然后做一下attention产生的context vector c,而这个vector就是下一个timestamp的输入

还有另外一种使用attention的方式(见上图的右),先把关键字z拿出来,做attention得到context vector c,而这个vector不是保留到下一个timestamp才使用,而是直接在这个timestamp里使用,将c和z合起来丢到RNN里面产生distribution。

两者哪一个更好呢?在第一篇使用attention做语音辨识的论文中就是我全都要。将上述两种结合,如下图所示,
将关键字z做attention得到context vector c,而这个c一方面作为本次timestamp的输入,又作为下一个timestamp的输入。
在这里插入图片描述
Location-aware attention
但在语音方面,上述的attention会不会太过了,因为attention在开始时是为了解决类似翻译问题的输入输出位置不匹配(翻译中,如输入的第一个词“我”很可能翻译到最后一个英文单词“I”),而语音中没有这样的问题,attention的改变就应该是由左到右。
在第一篇LAS的作者也这么觉得,所以他加了一种机制,将前后一段得到的α也拿出来,通过transform与z和h计算。
举例,假设我们现在要用z1和h2去计算attention,不会两者直接计算出α。还会取出附近的α的值。
在这里插入图片描述

5 Result

最开始的LAS和传统的多模组效果类似,但后来随着大语料和训练时间的增加,LAS效果远超传统系统。
下表中的数字是错误率,越低越好。
CLDNN-HMM是谷歌内部的传统语音辨识系统结果,效果是好于LAS的,但在12500h后的训练效果来看,模型不仅优秀而且主要是小。Google也强调了这种End-to-End端到端系统的优势,model可以缩得很小,在应用中只有足够小才能放到实际应用中。
在这里插入图片描述

6 Limitation

• LAS outputs the first token after listening the whole input.
• Users expect on-line speech recognition.
今天的语音辨识,我们是希望可以online的语音辨识的,就是一边听一边辨识,说一点辨识一点。如今天的手机语音辨识,我们可以一边讲语音辨识结果一边产生,而不是听完整句才能进行辨识。一般的LAS做不到,encoder听完整个句子,decoder再去做attention,整个句子没听完没办法做attention。

下一篇要讲的模型就是可以一边听一边做语音辨识的模型。

欢迎大家留言评论指正,有任何问题都可以问,大家共同学习进步。

猜你喜欢

转载自blog.csdn.net/qq_44574333/article/details/108048650