LSA(Listen,Attend,and Spell)
Listen
下图中encoder将语言的噪音移除,只提取与语音识别相关的内容。
encoder可以用RNN、CNN、self-attention Layers等方法来实现
下采样
为了减少计算量和处理复杂性,同时保留关键的语音特征采用下采样对输入进行处理。下采样是指降低信号的采样率,即减少每秒钟采集的样本数。如下图中左边使用了Pyramind RNN进行下采样,第二层数据为四个,第三层又将前一层相邻两个输入合并最终,四个输入被下采样为两个输入。右图使用Polling over time实现下采样,第三层是将前一层中相邻两个数据选择其中一个作为输出,最终四个数据也变为了两个数据。
其余常见的还有TDNN和Trucated self-attention。其中TDNN,会只考虑其中几个向量从而节约了时间。Truncated Self-attention会给某一变量一个范围,该范围内所有数据都会考虑,范围外的忽略。
Attention
attention操作如下
下图中,经过encoder后的数据相当于一个资料库,关键字z需要与资料库进行match函数的运输得到a
其中match可以用Dot-product Attetion实现,如下图将输入变量h和z分别成和,得到两个新结果,将两个新结果做点积得到a,可以看到,点积主要作用就是计算z和h的相似度。
另一种attention方式为additivate attention,如下图如下图将输入变量h和z分别成和,得到两个新结果,将两个新结果相加后经过tanh函数得到w,w经过一个线性变换得到a。
以上是两种常用的计算attention的方式
attention的步骤如下图,input输入到encoder中会得到 h,h和z计算又得到a,对a进行softmax转换,使所有a加起来等于 1,将softmax得到的a和encoder得到的h进行相乘求和得到c。之后c会被当做decoder的input。
Spell
得到c后我们将进行LAS下面的步骤spell,c作为decoder 的输入,c根据hidden state最终得到Distribution。Distribution给每一个tokens一个几率,最后选择概率最大的作为输出,每个单词的字母是一个个输出的。
当后面的字母要输出时会使用到前一个的输出,如下图。最终得到EOS表明decoder结束,前面所得到的的输出就是最终结果
Beam Search
Beam Search更像决策树,每次分支都选择几率大的叫做Greedy Decoding,如下图中红色路径。但是Greedy Decoding最终不一定能找到几率最大的结果,如下图绿色路径才能找到最终输出最大 的结果。
Beam Search可以解决上面的问题,Beam Search每次都会保留两个最好的路径。最开始只有A和B所有将两个都保留下来。之后根据始发位置得到的路径AA,AB,BA,BB选择分数 最好的两个路径进行保留,后面以此类推,最终选择最大的作为最终输出。
之后就是训练,训练的最终结果就是系统要将输入的语音音频所对应的单词输出。在训练过程中假如每个音频都被标注好该音频所对应的单词,训练的目的就是要使Distribution出现该单词的概率越大越好。训练时不会将前一个的输出直接作为后一个的输入,而是直接输入当前单词前一个单词(单词已知)。
将正确答案放在训练中叫做teacher forching,若将训练中前一个的输出作为后一个的输入,前期时因为模型还没训练起来,很容易出错,随着模型的不断训练最终可能会得到正确的输出,但是该正确的输出与前面错误的输出相反,可能会造成模型崩溃
因此为了避免上述情况发生,需要将正确数值直接用在训练中
attention放在decoder中有两种方法如下图,左图是将z经过attention得到c,得到的c又是下一个的输入。右图并没有将c保留到下一次输入,而是立即使用得到结果。
对于attention来说,每次的attention都应该考虑过去的attention。
CTC
ctc只需要encoder得到h,之后将h放到classifier中,去决定该h属于哪个tokens。ctc输入T个声音特征那么就要输出T个tokens。输出的tokens中包含一个(相当于null),当没有计算出结果时用表示,将重复的token进行合并,并将进行移除。
CTC处理的规则如下图
CTC的训练中给定的label比输出小,不能实现一一对应,因此需要自己制造合适的label,如下图,将“好棒”制造合适的label。
那么面对上面这么多label序列,我们选哪个用于训练呢,CTC会使用全部序列进行训练。
对于CTC的classifiter,可以将其想成decoder。如下图当两个输出c中间加了一个时,按照CTC的规则会输出两个c,但是要求不能两个c相邻,因此CTC的效果可能没有那么好。
RNN-T
RNA
RNA像是RNN-T和CTC之间的过渡,如下图是RAN的运作流程。CTC对语音特征的计算是独立的。而RNA每次classifier都会考虑前一个输出。
目前为止,我们可以发现CTC和RAN都是输入一个输入就会得到一个token。有时可能需要输入一个输入得到多个token的情况。例如"th"是一个音但是有两个字符。RNN-T可以解决这个问题。
下图是RNN-T的过程图,输入一个输入,便会一直输出,知道model觉得输出满意为止。
观察下面输出我们可以看到当输出为时RNN-T便会进行下一个输入。当输入有T个时,输出 就有T个。
那么RNN-T的训练也有同样的问题,例如“好棒”这个训练词组,输入有4个那么代表有四个,我们需要将四个 插入到“好棒”中。我们可以像下图插入
我们并不知道哪中插入的方法是正确的,RNN-T和CTC一样,都是穷举所有可能进行训练。
在RNN-T中会另外使用一个RNN来考虑每一个应该输出的token是什么。如下图,另外训练了个RNN,若前面有输出的token,就将token输出到RNN中。下图中,输入,RNN-T决定输出t,将t放进RNN中,输出的结果输入到下一个RNN-T中,对下一个token输出产生影响。当RNN-T输出代表将要考虑下一个输入了,那么会将前一个输出放在下一个输入中。
Neural Transducer
上述的CTC,RNN-T每次只能输入一个,Neural Transducer可以一次输入多个h,Neural Transducer的运作方式如下图,将一些h进行输入,将几个相关输入用一个window框起来,对这个windows进行attention后得到输出,知道输出,考虑下一个windoes的输入。
MoCHA
Neural Transducer中使用window将几个相邻的输入一起考虑,那么 MoCHA可以将windows进行动态的移动。一开始进来,根据z来判断window要不要放在处,之后以此类推。找到要放windows的输入,之后对windows进行attention, MoCHA中一个windows只会输出一个token,其他token会根据windows的滑动陆续输出 。