Deep Learning for Human Language Processing Part 2(P3 to P5)
课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1
参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html
备注:图片均来自于课件。
由于工作的原因不得不重拾这门课,这次回顾P3至P5,这部分介绍了语音识别的基本概念,输入输出以和各种Seq2seq模型。
语音识别(Speech Recognition)
语音识别是指将语音转换成文本的过程,其模式如下图所示:
- 输入:语音——向量序列(长度$T$,维度$d$)。
- 输出:文本——token序列(长度$N$,$V$个不同的token),通常$T> N$。
一些应用:
语音识别有两种视角,第一种视角是将语音识别看成Seq-to-seq问题,第二种是利用传统的HMM视角:
这部分将介绍Seq-to-seq视角的模型,首先介绍一些基本知识。
输入
声学特征
利用滑动窗口的思想,构建一定长度的窗口(一般为25ms),如果采样率为16KHz,那么可以得到400个采样点。但实际中通常不使用该方法,在深度学习流行之前,一般计算MFCC,现在一般使用filter bank的输出。在计算完一个窗口后,将窗口移动10ms,然后重复之前的计算即可,所以1s的声音信号会变成100帧信息。
结合下图更容易理解:
有关MFCC以及filter bank的进一步信息可以参考:
http://ocw.aca.ntu.edu.tw/ntu-ocw/ocw/cou/104S204/7
使用趋势
19年语音领域的国际会议中,以上几种声学特征使用的比例为:
所以主要以filter bank output为主,MFCC其次。
输出
Token
token可翻译为词例,是表示文本的基本单位,在不同情形下可以选择不同的单位作为token,下面回顾课程中介绍的几种单位。
音素(Phoneme)
音素是声音的基本单位。例如:
W AH N P AH N CH M AE N
要得到文本,我们需要词汇表(Lexicon),其记录了文本和音素的对应关系:
利用词汇表,可将之前的声音信号转换为文本:
one punch man
在深度学习流行之前,主要是利用音素的方法进行语音识别,但是音素和词汇表需要语言学家来构建。
字素(Grapheme)
字素是基本的书写单位,注意字素不需要词汇表。
中英文的例子如下:
英语的字素包括26个字母,空格以及标点符号;中文的字素为文字,常用的大约有4000个。
使用字素的一个挑战是,相同的发音可能对应多个字素,例如发音“ke”可能对应c或k,这一点需要结合上下文判断;另一个挑战是,系统需要自己学会拼写单词,所以难免有拼写错误的问题。
词汇(Word)
缺点:词汇数量太多,中文需要分词。
比较夸张的例子如下:
语素(Morpheme)
词素是语言中有意义的基本单位(小于词汇,大于字素)。
可以利用统计或者语言学的方法得到词素。
比特(Bytes)
例如使用UTF_8编码,该系统可以是独立于语言的!
使用趋势
19年语音领域的国际会议中,以上几种token使用的比例为:
主流是音素和字素。
数据集
常见的数据集如下:
Seq-to-seq视角
- Listen, Attend, and Spell (LAS)
- Connectionist Temporal Classification (CTC)
- Recurrent Neural Aligner(RNA)
- RNN Transducer (RNN-T)
- Neural Transducer
- Monotonic Chunkwise Attention (MoChA)
在19年的国际会议中,各种模型的使用比例为:
LAS
LAS是带注意力机制的典型seq2seq模型,Listen是Encoder,Attend是Attention,Spell是Decoder。
Listen
作用:
- 提取内容信息。
- 消除speaker差异,消除噪音。
输入:
- 声学特征:$\left\{x^{1}, x^{2}, \ldots, x^{T}\right\}$
输出:
- 高阶表达:$\left\{h^{1}, h^{2}, \ldots, h^{T}\right\}$
整体架构如下:
具体架构可以使用RNN,CNN,Self-attention。
RNN:
CNN:
- CNN较高层的filter可以考虑更长的序列。
- CNN + RNN结合使用很常见。
降采样
语音识别中常常对输入的声学信号使用降采样,因为输入太长,具体方式如下:
左边将两个时间点的输出结合起来的到一个输出;右边将两个时间段的输出选择一个输出。
其他方法:
左边的思路是做卷积的时候只考虑开头和结尾的部分;右边的思路是不计算全部向量的attention,只计算一定范围内向量的attention,这是因为声学向量太长的原因。
Attend
Attent即为attention:
$z^0$和Encoder的输出根据match函数计算值(标量),然后利用softmax函数计算权重,最后利用下式计算$c^0$(文献中通常被称为context vector):
$c^0$一般作为decoder的输入。
其他形式的attention
之前attention计算的结果影响的是下一时刻,实际中也可以让attention影响当前时刻,甚至两者都影响:
Location-aware attention
attention提出的目的是为了解决机器翻译中输入输出对齐的问题,但是在语音中,对应关系比较明显,当前时刻的输出基本只当前时刻的输入有关。
为了解决这点,有人提出了location-aware attention的方法:
其思路是考虑前一时刻的$\hat \alpha$,通过变换后将其输入到match函数中,这样在计算当前时刻的$\hat \alpha$时也考虑了前一时刻的$\hat \alpha$,我们希望attention在逐渐向右移动。
一些实验结果:
不过从实验结果来看这点好像不起作用。
Spell
根据$c^0$计算$z^1$,然后计算概率分布,采样概率最大的token:
下一步利用$z^1$计算attention,然后重复之前的计算过程:
Beam Search
在解码的过程中,使用了贪心的方法——每次选择概率最大的token,但是这样很容易产生不好的结果,一个例子如下:
- 红色路径是贪婪法。
- 绿色路径是最好的路径。
解决该问题的方法是Beam Search:每一步保留$B$个最好的路径,这样的结果是:
训练
训练的过程中使用Teacher Forcing的方法,其方式是不使用前一刻的输出作为当前时刻的输入,取而代之的是使用正确结果作为输入,具体如下:
该方法的目的是保证在输入正确的条件下,输出尽可能正确;如果不使用该方法,很容易在输入正确的情形下产生不好的输出。
局限性
- LAS在听完整个句子后才产生第一个token。
- 但是用户期望在线语音识别。
CTC
CTC只包含Encoder,对于在线语音识别,Encoder中使用单向RNN即可:
由于声学向量只表示很短的声音信号,所以有时候无法判断出对应的token。为了解决这点,使用一个特殊的符号$\phi $表示无法判断,这也是输出维度加$1$的原因。
- 输入:$T$个声学特征,输出$T$个token(忽略下采样)。
- 输出:token,包括$\phi$,合并重复的token,删除$\phi$。
例子:
训练
我们的训练数据中没有$\phi$,所以产生训练数据需要利用算法预处理,处理的过程称为对齐(alignment)。
考虑如下例子:
后续会介绍具体方法。
问题
无法产生形如book的token。
RNA
CTC Decoder以一个向量为输入,输出一个token;RNA考虑了依赖性,具体方法是将输出部分换成RNN:
RNN-T
RNN-T是对RNA的改进,其思路是一个输入可以产生多个输出,直到产生$\phi$时才读入下一个输入:
工作方式:
更具体的:
最上方的部分是一个RNN,该RNN不考虑$\phi$,其作用有两点:
- 该RNN类似于语言模型,可以预训练。
- 更本质的,训练时需要该RNN。(后续介绍)
训练
在RNN-T中,一个输入对应一个$\phi$,所以如果有$T$个输入,那么也有$T$个$\phi$,所以在训练中也有对齐的问题(和CTC类似),具体的解决方法后续介绍。
Neural Transducer
Neural Transducer的改进点是一次输入多个声学特征:
具体来说,每一步利用attention从window中抽取特征,直至输出$\phi$。
MoChA
MoChA是对Neural Transducer的改进,改进点为窗口移动的距离不是固定的,即动态移动窗口(注意窗口长度依然是固定的):
具体过程:
MoChA每个window产生一个token,并且不会输出$\phi$。
训练
由于选择window有采样的步骤(不可微),所以训练步骤比较麻烦,具体可见:
https://zhuanlan.zhihu.com/p/99389088
其核心思路是利用期望值(可导)代替采样(不可导),这部分理解透彻之后会加以补充。
总结
本讲的内容可以用下图概括: