LAS
LAS是一个做语音识别的经典seq2seq模型,主要分为三个部分Listen、Attention、Spell
Listen
Listen部分就是一个encoder。
输入声学特征向量,提取信息、消除噪声,输出向量。
encoder可以是RNN
也可以是CNN。比较常见的是先用CNN,再用RNN
还有一种趋势是使用Self-Attention
Down Sampling减少取样
由于声音的采集通常都是很大数据量的。比如采样率为16KHz需要在一秒钟采集16000个采样点,所以通常需要对声音的特征向量进行Down Sampling,减少样本数。
对于RNN,
方法一是通过使用两层RNN,4个向量通过第一层RNN输出4个向量,通过第二个RNN输出2个向量
方法二是把通过RNN输出的四个向量中,每隔一个输出向量
对于CNN,使用TDNN的方法,可以认为一段附近的几个特征向量差不多,采取使用第一个和最后一个向量,减少样本参数。
对于Self-Attention,计算当前向量和所有向量(1秒16K)计算量太大,只计算一个范围内的注意力。
Attention
我们可以直接编码解码之后直接输出,但是我们当前的编码解码不仅限于这一个编码向量,还取决于周围的编码向量,所以要做attention。
注意力机制如下图所示。
z
z
z是待训练的向量,初始时随机初始化,
z
z
z与每个
h
h
h做match得到注意力分数
α
α
α。
match的方法有两种,一种是Dot-product,另一种是Addictive。
做完match之后,每个
h
h
h的注意力分数
α
α
α做softmax,然后对应比例的h相乘相加,得到向量
c
c
c,
c
0
c^{0}
c0作为decoder(Spell)的输入。
Spell
c
0
c^{0}
c0作为decoder的输入
随机初始化的
z
0
z^{0}
z0经过训练之后得到
z
1
z^{1}
z1,
z
1
z^{1}
z1作为RNN的隐状态输入
通过RNN,输出|V|维向量经过Softmax,输出最大概率的token。
z
1
z^{1}
z1作为待训练的向量,与每个
h
h
h做attention,得到
c
1
c^{1}
c1作为输入
把得到的Token加入RNN网络,
z
1
z^{1}
z1训练后得到的
z
2
z^{2}
z2作为隐状态,训练得到下一个Token
CTC
它的结构很简单,就是input经过一个Encoder进行输出,输出经过分类器、softmax之后得到token。
由于在一小段音频中(10ms),音频中可能没有什么有价值的内容,这时候不容易预测token值,所以在词表中添加一个符号
∅
\varnothing
∅,用
∅
\varnothing
∅表示目前不能识别此处的token,也许在看到下一个音频段的时候知道了此处是什么,然后再输出此处的token。
最后处理输出,把
∅
\varnothing
∅去掉,把重复的tokens合并起来。
CTC在训练时,预测的token和真实token计算损失时,会有一个问题,你不知道
∅
\varnothing
∅会出现在哪个位置,会有很多种情况。实际上会把所有情况都用于训练。
CTC的问题:encoder输出后经过一个线性分类器,每个分类器输入一个向量,输出一个向量,token之间没有互相关联,预测时不看前后出现的token。
RNA
RNA模型就是一种解决CTC问题的模型。
它把CTC的线性分类器改成LSTM,把前一个计算的输出和hidden state参与到后面的token预测中。
RNN-T
目前前面所述的模型的decoder都是一个输入只输出一个token,现实中也有一个输入输出多个token的情况。比如语音说“th”这个单词时,只发了一个音,如果输出是“t”显然不合适。
我们可以改变词表,手动加入一些像“th”,“zh”等等这些作为token。但我们更希望模型本身灵活且健壮。
RNN-T输入一小段音频之后,一直进行输出,直到没有token可输出时,输出 ∅ \varnothing ∅。
它有和CTC一样的问题,
∅
\varnothing
∅会出现在任何位置,在计算损失时增加训练难度。
解决方法是,在最后增加一个RNN模型(语言模型),这个RNN忽略
∅
\varnothing
∅,只把Token当作输入进行训练,所以可以通过大量文字训练这个RNN。
Neural Transducer
上述模型,每次只读一个音频片段就进行输出。
NT每次读
w
w
w个片段,
w
w
w个片段做attention,然后经过LSTM
MoChA
Neural Transducer每次移动的窗口是固定的。MoChA是一种不断变换窗口大小的。
encoder层输出之后的,按序判断窗口是否该在此h处