深度学习与人类语言处理-语音识别(part3)

上节回顾深度学习与人类语言处理-语音识别(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:每次输入 一个 window 的 RNN-T
  • MoCha: window 移动伸缩自如的 Neural Transducer

references:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

posted @ 2020-03-21 10:23  鱼与鱼  阅读(1967)  评论(0编辑  收藏  举报