end-to-end speech recognition

Automatic Speech Recognition(ASR)

ASR就是将声学信号转化为文本的系统

语音是一种自然的用户接口

传统ASR

传统做法的主体是生成式语言模型,建模声学信号与文本的发音特征的联合概率,但pipeline的不同部分掺杂了不同的机器学习模型:

ASR模型

0、前置知识

token

下面会频繁用到 token 这个单词,下面列举 4 类常用的 token。

Phoneme

Phoneme 是声学的基本单位。

Grapheme

对于英文就是一个英文字母,加上标点符号还有空格。对于中文就是一个汉字。

word

对于英文就是一个英文单词,对于中文就是一个一个词组。

Morpheme

Morpheme 是对 word 的更细的划分。

下面提到的都是 Grapheme 这个token

token 在论文中使用情况

可以看出 Grapheme 在论文中所占的比例非常高。

将音频信息转化为声学特征

音频信息可以通过上面的方法转化为声学特征。

各种提取声学特征的方法在以往论文中所占的比例。

1、LAS

1、LAS 模型

LAS 是 Listen, Attention, and Spell 的缩写,它利用了注意力机制来进行有效对齐

工作流程:

将语音信号的特征输入到 Encoder 中(Listen部分)
做 Attention,在不同的时刻关注输入的不同部分(Attention部分)
通过 Decoder 进行解码(Spell部分)

2、Listen

Listen 部分对应的是 Encode-Decoder 模型中的 Encoder 部分,可以选择 RNN,CNN,CNN+RNN,Self-Attention

Encoder 使用 RNN 模型

Encoder 使用 CNN 模型

Encoder 使用 Self-attention 模型

如果每 10ms 对样本进行采样一次,那么 1s 就会采集到 100 个样本,这会导致两个问题,一个问题是会采集到大量的重复样本,另一个问题是如果采集数据的时间过长,会导致样本数目变的非常庞大。所以通常需要对声音进行降采样,以减少重复样本和样本数目。降采样的主要方法有 Pyramid RNN,Pooling over time,Time-delay DNN (TDNN),Truncated Self-attention,前三种降采样一方面可以减少样本的数量,另一方面也可以合并重复的样本。

Pyramid RNN

在每一层的RNN输出后,都做一个聚合操作。把两个向量加起来,变成一个向量。

Pooling over time

两个 time step 的向量,只选其中一个,输入到下一层。

Time-delay DNN (TDNN)

因为相邻的编码信息差不太多,为了减少运算量,只取两端的样本。

Truncated Self-attention

为了减少注意力的范围,将注意力集中在当前输入样本附近的几个样本上。

3、Attend

关键字 $z^i$ 对编码器中的每一个输出 $h^i$ 做 Attention,获得 $\alpha_i^j$,其中 $i$ 表示层数,$\alpha_i^j$ 表示 $h^j$ 与 $z^i$,经过 match 之后计算得到的 Attention 得分。

所有的 $\alpha_i^j$ 需要经过 softmax 得到最终的概率值 $\hat{\alpha_i^j}$,用 $\hat{\alpha_i^j}$ 和 $h^j$ 相乘做加和,得到最后的 Attention 输出 $c^i$

match 的结构

上面通过将 $h^j$ 和 $z^i$放到 match 中,来获得 Attention 得分 $\alpha_i^j$,match 结构有 Dot-product Attention 和 Additive Attention 两种结构

Dot-product Attention

Additive Attention

4、Spell

Spell 部分对应的是 Encode-Decoder 模型中得 Decoder 部分,通过这一步可以将得到向量解码成我们想要的单词。

根据 $z^0$ 与 $c^0$ 形成 $z^1$,通过 $z^1$ 来预测第一个输出,根据 $z^1$ 与 $c^1$ 形成 $z^2$,通过 $z^2$ 和上一次的输出来预测第二个输出,……。其中 $c^i$ 是 Attend 这一步通过 Attention 拿到的输出。对于每一个输出都是一个大小为 V 的向量,该向量中的每一个值,表示每个 token 的输出概率。由于词表较大,没有办法去搜索穷尽所有的可能性,为了非常快的找到使最后的输出概率最大的路径,可以采用下面两种搜索路径的方法。

Greedy Search

每次都选择当前情况下的最优解,这种策略不能保证生成整个序列的概率是最优的。

红色的路径是根据 Greedy Search 得到的结果,显然绿色的路径才是最好的路径。

1处和2处求 A 的概率如下

P(1) = p(A|A) = 0.6
p(2) = P(A|B) = 0.1
所以两处的概率是不同的

Beam Search

为了解决 Greedy Search 的问题,可以使用 Beam Search 的搜索方法。

Beam size = 2 使每次都保留两个概率最大的路径

计算过程如下

最终得到了两个备选选项。

训练过程

将样本输入到编码器中,得到 $h^1,h^2,h^3,h^4$,通过 $z^0$ 使用 Attention,得到 Attention 的输出 $c^0$,通过 $z_1$ 得到此表中 token 的概率分布,取出概率最大的对应的 token 作为输出。在这里我门期望 c 的概率是最大的。

在起始状态,所有输出的概率是混乱的,并不知道会输出什么词,这就有可能使输出 a 的时候发生混乱,本应该是在看到 c 的时候输出 a,但是最初的时候 ? 有可能是 b,也有可能是 d,那就意味着在看到 b 的时候输出 a,或者是在看到 d 的时候输出 a,这与在看到 c 的时候输出 a 是矛盾的。可以通过每次都把真实的标签作为下一个 $z^i$ 的输入来纠正这个问题。

这样就可以确定在输入 c 的时候输出 a 了。

Attention 相关

关于 Attention 作用的位置,有两种模型。一种是通过 $z^i$ 生成 $c^i$ 作用于下一个隐层状态,一种是通过 $z^i$ 生成 $c^{i+ 1}$ 作用于当前的隐层状态。

第一种 Attention

把 Attention 的输出作用于下一时刻的隐层状态

把 Attention 的输出作用于当前时刻的隐层状态

但是在 LAS 中是全都要

语义识别和机器翻译的的一个非常重要的不同是,在语音识别中不会像机器翻译那样出现交叉对齐的情况(即在翻译的时候原文的第一个词可能对应着翻译的最后一个词)

理想情况下,做完 Attention 会出现上面的情况,即只与当前输入的附近几个样本有关。

但是做完 Attention 后,可能会出现上面的情况

有可能会出现与当前的输入无关,也可能出现与当前输入的附近几个样本无关

针对上面的情况,LAS做了上图所示的修改

LAS是否有效

在小的数据集上

似乎不是非常的有效

在大的数据集上

无论是在错误率还是内存占用上,都取得非常好的效果。

LAS 的限制

LAS 的输出依赖于完整的 Encoder输出
LAS 无法实现在线语音识别功能

2、CTC

CTC 模型

CTC 能够进行在线语音识别,编码器采用了单向 RNN(双向的RNN无法进行在线语音识别),需要注意的是 CTC 只有编码器,没有解码器。

如果每 10ms 取一个样本,时间非常短,所以在这一个样本中可能不会存在任何信息,所以在词组中加入了 $\phi$ 这个字符,用来表示输入对应的输出没有什么数据。

CTC模型的输入与输出

CTC 模型的输入是 T 个声学特征,输出是 T 个Token。输出包括 $\phi$,需要先合并重复的字符,然后移除掉 $\phi$

对于 𝜙 𝜙 d d 𝜙 e 𝜙 e 𝜙 p p 这个输出来说,可采取下面两步得到 deep 这个单词

1、合并重复字符
    𝜙 d 𝜙 e 𝜙 e 𝜙 p
2、移除 𝜙
    d e e p

CTC 的损失函数

CTC 的损失函数是交叉熵,通过最小化交叉熵来获取最优解。

预测训练数据

对于 好棒 这样的一个输出来说,会有非常多的路径可以得到这样的一个结果,上图列出的几条路径通过化简都可以得到 好棒 这样的一个输出。

枚举所有可能的对齐

有非常多的对齐方式可以得到最后的输出,对于 CTC 来说,是全都要,将所有路径的概率全部加起来,就是最后输出的概率。

Y 是所有的可能的路径

生成输出的规则

首先,我们构造一个 table,希望通过这个 table,直观的看出可以映射到真实标签序列 ‘cat’ 的可能路径。table的横坐标为输入的时间序列,纵坐标为将真实标签序列两两字母以’-‘分隔,并且在首尾各加一个’-‘。

通过下面的五条规则可以得到所有正确的路径

起点必须是纵坐标的前两个 token 中的任意一个。

当前时刻的 Token 不是 $\phi$,那么会有三种选择,如上图所示

三种情况举例

1、cc𝜙at𝜙
2、c𝜙at𝜙𝜙
3、cat𝜙𝜙𝜙

当前时刻的 Token 是 $\phi$,那么会有两种选择,如上图所示

两种情况举例

1、𝜙𝜙cat𝜙
2、𝜙cat𝜙𝜙
3、这种情况是不合法的,因为在产生的输出中会缺少 c 这个 token

对于 see 这样的输出,存在着两个重复的 token,则采用上面的两条规则

两种情况举例

1、s𝜙ee𝜙e
2、s𝜙e𝜙𝜙e
3、第三种情况是不合法的,这种情况会合并相邻的重复的 token

结尾必须是纵坐标的后两个 token 中的任意一个。

生成路径总结

CTC 生成路径的方法,大致可以通过上图进行总结,起始点可以是 token 也可以是 $\phi$,结尾可以是 token 也可以是 $\phi$,中间可以有多个相同 token 也可以有多个 $\phi$,但是一条完整的路径必须包含正确输出的所有 token

计算所有对齐的和

这一部分使用到了隐马尔可夫模型中的前向-后向算法,并且使用了 https://www.cnblogs.com/shiyublog/p/10493348.html 博客中数据,讲解 CTC 中的前向和后向算法

前向算法

定义 $\alpha_t(s)$ 为前向变量,表示在 $t$ 时刻到达序列的第 s 个位置的所有可能子路径的概率和。

可以通过 生成输出的规则 一节,生成下面所有列出的路径

后向算法

定义 $\beta_t(s)$ 为后缀起始于序列末端, t 时刻到达第 s 个符号的所有可能子路径的概率和。

那么,将前向过程中所有箭头反向,使用同样的计算方式,即可计算出反向变量。

最后,应用于1 - T的所有时刻,可以得到在任意时刻内预测出正确标签序列的概率。

$p(‘apple’) = \sum_{s = 1}^{|seq|} \frac{\alpha_t(s) * \beta_t(s)}{y_{seq(s)} ^ t}$

举个例子:

最后的推到步骤如下:

3、RNN-T

RNA模型

由于 CTC 模型当前 token 的生成不依赖前面的 token,所以 RNA 解决了 CTC 的不足。

RNN-T模型

无论是 RNA 模型,还是 CTC 模型,他们都是吃一个输入,就输出一个 token,RNN-T 实现了吃一个输入,就输出多个 token。一个输入对应着多个 token,当没有 token 需要输出的时候,需要输出 𝜙 当作结束符。

RNN-T 的运行流程

每个输入都至少对输出一个 𝜙 。

注意画黄线方框的部分,𝜙 是不会影响下一个字符的生成的。这样的好处是在生成 e 这个 token 的时候,只受到 t、h 两个 token 的影响,而不会受到 𝜙 这个token的影响(因为 𝜙 生成的位置和数量都是不固定的)

这样可以保证,无论从哪个方向到达的 $p_{4,2}$,生成 $p_{4,2}$ 的概率都是一样的(下面会详细说明)。

如何生成输出

RNN-T 和 CTC 生成输出的方式是不一样的,有以下两条规则。

红色方框和黄色方框分别画出了 RNN-T 的起始点与结束点。

RNN-T只能往右走或者是竖着走,不能斜着走。

生成路径总结

将 CTC 与 RNN-T 进行对比可以发现,RNN 在每个 token 上面是没有循环的,而且 RNN-T 最后一个字母必须为 𝜙,因为 RNN-T 把 𝜙 作为每一个输入的结束。

计算所有对齐的和

在 RNN-T 中计算一条完整路径的概率

这里的 $h^i$是 Encoder 的输出,$l^i$是下图中黄线所标记的 RNN,可以看出这个 RNN 与前面 𝜙 出现的位置和数目没有任何关系。

对于 $p_{4,2}$ 这一个点的概率,无论选择走那条路径,对于下图中的 $l^2$ 来说是不变的,$h^4$ 也不会发生变化,那么 $p_{4,2}$ 也不会发生变化

训练

需要优化的函数,其中$P(\hat{Y}|X)$是一条正确的输出路径的概率。同样是要所有对齐路径的概率和。

正如黄色方框中所显示的那样,上图表格中的每一个箭头都代表一个几率,每个几率都能够影响 $P(\hat{Y}|X)$,而每一个几率都受到 $\theta$ 的影响,首先对 $\frac{\partial{P_{4,1}(a)}}{\partial{\theta}}$ 求偏导

$P_{4,1}(a)$ 的值受到上方 RNN 生成的 $l^1$ 的影响,还受到下方 Encoder 生成的 $h^4$的影响,所以根据反向传播,更新变量参数。

接下来求 $\frac{\partial{P(\hat{Y}|X)}}{\partial{P_{4,1}(a)}}$,由于有些路径是经过$P_{4,1}(a)$这个箭头的,有的路径是不经过的,将两条路径分离出来,那么前一部分就与 $P_{4,1}(a)$,有关,另一部分与 $P_{4,1}(a)$ 无关,再把与 $P_{4,1}(a)$ 有关的部分把 $P_{4,1}(a)$ 提取出来,最后对 $P_{4,1}(a)$ 求偏导

计算所有经过 $P_{4,1}(a)$ 路径的概率和,还是使用 HMM 的前向算法和后向算法

前向算法

$\alpha_{4,2}$ 是所有能产生 4 个声学特征,产生 2 个 token 的概率路径的总和。

后向算法

$\beta_{4,2}$ 是已经产生 4 个声学特征,已经产生 2 个 token 的概率,最后经过所有的可能路径能够到达结尾的所有路径的概率和。

根据前向算法产生的 $\alpha_{4,1}$ 和后向算法产生的 $\beta_{4,2}$ 来求$\frac{\partial{P(\hat{Y}|X)}}{\partial{P_{4,1}(a)}}$。

4、Neural Transducer

RNN-T 是根据一个输入生成多个输出,而 Neural Transducer 则是根据多个输入生成多个输出。

总结

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信