上节回顾深度学习与人类语言处理 - 语音识别 (part2), 这节课我们接着看 seq2seq 模型怎么做语音识别
上节课我们知道 LAS 做语音识别需要看完一个完整的序列才能输出, 把我们希望语音识别模型可以在听到声音的时候就进行输出, 一个直观的想法就是用单向的 RNN, 我们来看看 CTC 是怎么做的
CTC
根据上面说的, 在线语音识别, 模型在听到声音的时候就需要输出, 我们看下使用 RNN 的基本架构
input: 长度为 T 的声学特征
Encoder: 单向 RNN
ouput: 长度为 T 的 token, 每一个输出位置对应词典中每个词的概率
但是对每一个输入的声学特征不总是会有对应的输出 token, 每一声学特征所包含的信息是非常少的, 所以 CTC 在输出的词汇表中加入了一个标记 \(\phi\), 表示什么也没有, 词典大小变为 V+1
ouput: 长度为 T 的 token, 其中包括 , 需要合并重复的 token, 移除
举例来说:
但是这里我们会发现一个问题, 对于一个真实的输出,\(\phi\) 的位置有很多种情况, 举个栗子
真实的输入输出:
input:\(x1,x2,x3,x4\) ; ouput: 好棒
可能的输出:
好好棒 \(\phi\), \(\phi\) 好好棒, 好好棒棒 , 好棒 \(\phi\phi\), 好 \(\phi\) 棒......
所以 CTC 在训练的时候需要穷举所有可能组合, 这个我们后面再讲
CTC work 吗?
从这个结果我们可以看到, CTC 的表现很惨, 在没有使用其他方法处理的情况下已经坏掉了, 比 LAS 坏了很多, 但是在加入语言模型调整后, 已经可以 work 了
issue
那 CTC 存在什么问题呢?
每一步的输出是独立的
假设前三个输入都属于 "c" 的声学特征, 但是模型在看到第一个输入就输出了 "c", 第二步输出 \(\phi\), 第三步又输出了 "c", 那最终的输出就是 "cc", 显然不对啊
RNN Transducer (RNN-T)
在介绍 RNN-T 之前, 我们先看下 RNA(Recurrent Neural Aligner), 不是核糖核酸啊
CTC Decoder(把 CTC 的 softmax 看做 Decoder)
CTC 的每一个输出是相互独立的
RNA(把 softmax 换成 RNN)
在从上面的图可以看到, RNA 就是增加了输出之间的依赖, 把 CTC 的线性分类层换成 RNN 就可以了
目前为止我们看到的都是吃一个输入, 输出一个 token, 那有没有可能吃一个输入, 输出多个 token 呢? 举例来说, 输入为 "th", 只有一个音, 但是需要两个输出. 当然也可以把 "th" 作为一个单独的 token 加入到词典
RNN-T 就是为了解决这个问题
每次看到一个 \(h^t\), 输出对应的 token, 直到对应输入被解码完了, 就输出一个 \(\phi\), 告诉模型给我下一个输入, 所以一共会有 T 个 \(\phi\) 会被输出
RNN-T 和 CTC 有同样的组合问题:
假设 "好棒" 有四个声学特征:
1 好 2 3 4 5 棒 6
1 2 3 4 5 好 棒 6
RNN-T 同样会在训练时穷举所有的组合
实际上 RNN-T 训练了一个独立的 RNN 网络, 输出会被接到 RNN,\(\phi\) 会被忽略
为什么需要额外的 RNN 呢?
这个 RNN 相当于一个语言模型, 只接受 token 作为输入. 所以可以直接先用大量文字训练 RNN
刚才说到输出中 \(\phi\) 的位置有很多种可能, 如果 RNN 把 \(\phi\) 也作为输入, 在对所有组合进行训练是很困难的
Neural Transducer
前面的几个模型每次都是输入一个, Neural Transducer 一次接受窗口范围的输入
对 Encoder 的输出, 每次取一个窗口作为 Decoder 的输入, 先做一下 attention 然后开始输出, 每次输出 \(\phi\) 就会读下一个窗口
那窗口的长度应该设置多长呢? 文献中实验了不同的长度
在没有用 attention 时, 长度变长后结果就坏掉了
使用 attention 后, 发现长度变化对结果影响不是很大
MoChA: Monotonic Chunkwise Attention
在 Neural Transducer 每次窗口长度是固定的, 在 MoChA 中设计了动态的窗口
首先使用 attention 决定窗口应该放在哪里, 然后对每一个窗口输出一个 token, 注意这里不需要 \(\phi\) 了, 然后移动找下一个窗口
Summary
总结一下语音识别中用到的几个 seq2seq 模型
LAS: 就是 seq2seq
CTC:decoder 是 linear classifier 的 seq2seq
RNA:decoder 是 RNN 的 seq2seq, 输入一个就要输出一个
RNN-T: decoder 是 RNN , 输入一个就要输出多个的 seq2seq
Neural Transducer: 每次输入 一个 Windows 的 RNN-T
MoCha: Windows 移动伸缩自如的 Neural Transducer
references:
来源: https://www.cnblogs.com/gongyanzh/p/12536836.html