上节回顾深度学习与人类语言处理 - 语音识别(part1), 这节课我们将学习如何将 seq2seq 模型用在语音识别
LAS
那我们来看看 LAS 的 Encoder,Attend,Decoder 分别是什么
Listen
Listen 是一个典型的 Encoder 结构, 输入为声学特征 \({x^1,x^2,...,x^T}\), 输出和输入长度相同, 是对声学特征的高阶表示,\({h^1,h^2,...,h^T}\).
我们希望 Encoder 可以做到以下两件事:
提取输入的内容信息
移除不同说话者之间的差异, 去掉噪音
那 Encoder 怎么做呢? 可以用 RNN,CNN,self-attention
通常我们需要对声音信号进行下采样, 为什么呢? 当然是声音信号太长了, 1s 的声音信号就有 100 个向量(上节声学特征部分讲过), 而且相邻的信号之间的差异不是特别大, 下采样可以帮助我们有效的进行训练. 下图是关于 RNN 的两个下采样方法
Pyramid RNN 将下层每两个隐状态加起来作为下一层, 实践证明这种方法还是很有效的. Pooling over time 和 Pyramid RNN 很像, 不同没有加起来, 直接每两个隐状态取一次作为下层输入.
那 CNN 和 self-attention 是不是也可以用类似的下采样呢? 答案是肯定的. 对于 CNN 常用的变形是 TDNN (Time-delay DNN), 不同于传统的 CNN 做卷积操作时会考虑范围内所有的输入, TDNN 相当于只让部分参与了运算, 提高效率.
同样, 对于 self-attention, 在机器翻译等任务中每一个位置的输入会看过序列中所有的输入, 但是在语音识别中, 序列实在太长了, Truncated Self-attention 就是让每一个位置的输入只看窗口范围内的其他输入, 窗口大小是一个可以调节的参数, 例如可以只看未来 4 个, 看以前的 30 个.
attention
LAS 的 attention 和机器翻译中的 attention 并没有什么不同, 文献中提到了两种 attention 计算方法, dot-product attention 和 additive attention
dot-product attention
dot-product attention 将输入 \(h\)和 \(z\)经过矩阵 \(W^h,W^z\)转换, 将转换结果进行点积, 得到 \(\alpha\)
additive attention
additive attention 将输入 \(h\)和 \(z\)经过矩阵 \(W^h,W^z\)转换, 将转换结果相加, 经过一个线性变换得到 \(\alpha\)
我们来看看 LAS 的 attention 具体怎么做的
将 \(z^0\)分别和 \(h^1,h^2,h^3,h^4\)做 attention 运算得到 \(\alpha ^1 _ 0,\alpha ^2 _ 0,\alpha ^3 _ 0,\alpha ^4 _ 0\), 经过 softmax 归一化, 再将归一化后的结果和 \(h^i\)相乘求和得到 \(c^0\), 将 \(c^0\)作为 Decoder 部分的输入
举个栗子:
讲过 attention 计算和 softmax 归一化后, 得到的 \(\hat{\alpha_0}\)为[0.5,0.5,0.0,0.0],\(c^0 = \sum\hat{\alpha}^i_0h^i=0.5h^1+0.5h^2\).
Spell
LAS 的 Listen 对应 Encoder,Spell 对应的就是 Decoder, 假设 Encoder 的输入为 "cat",Decoder 的每一个时间步对应的输出就是词汇表中每个词的分布, 通常会选概率最大的那个作为输出.
刚才是用 \(z^0\)计算得到 \(c^0\), 现在我们用 \(z^1\)进行运算, 重复 attention 过程, 就得到了 \(c^1\), 对应的结果如下
完整的 Spell 流程如下, 通常输出结果会用束搜索(beam search), 有关 beam search 的内容可以自行了解.
Trainging
训练过程有一个重要的不同就是 Teacher Forcing. 刚才在 Spell 部分我们说到, 一个时刻的输入其实有三个部分 (\(c^1,z^0,o^0)\), 当前位置的 attention 结果 context 向量, 上一时刻的隐状态, 以及上一时刻的预测输出. 但是在 training 阶段, 我们会将 \(o^0\) 换成真实的上一时刻的输出. 假如 \(t_0\)预测的输出为 \(x\), 实际应该输出 \(c\), 我们会将 \(c\)作为下一时刻的输入. 这就是 Teacher Forcing
那为什么需要 Teacher forcing 呢? 我们来看看如果使用上一时刻预测的输出作为输入会发生什么
假如在 \(t_0\)输出了 \(x\), 下一时刻机器就会学习在输入为 \(x\)时我需要输出 \(a\), 然而等到训练的一定回合时,\(t_0\)可以做出正确的预测了, 告诉机器输入 \(c\)需要输出 \(a\), 此刻机器已经懵了, 刚才不是说 \(x\)对应 \(a\)吗, 那之前的训练就白费了. 就开始互掐了...
back to attention
我们在回到之前的 attention 操作, attention 计算得到的 context 被用于下一时刻的输入(左图), 现在还有另一种 attention 架构, 将 context 直接用于当前时刻的输入(右图)
那么哪一种更有效呢? 该用那个呢. 第一篇使用 seq2seq 做语音识别的论文说: 我全都要. context 向量即作用于当前位置, 也作用于下一位置
使用 Attention 作语音识别真的好吗?
有点杀鸡用牛刀的感觉! 为好么呢, 我们知道用 attention 的 seq2seq 模型首先用在机器翻译上, 在翻译任务中, 输入和输出没有一致的对应关系, 需要 attention 自己寻找对应的那个词. 但是对语音来说输入输出是对应的, 有人提出了 location-aware attention
LAS -Does it work?
刚开始的时候 LAS 其实打不过传统模型, 后来随着训练集的增加以及各种 trick,LAS 已经很厉害了. 可以看到刚开始的时候, 打不过传统模型, 2018 年 google 在 12500 小时的训练集上训练, 最终打败了传统模型, 并没有使用 location-aware attention, 而且最重要的是模型变小了, 从原来的 7.2G 变成 0.4G
那 LAS 还有什么问题呢?
LAS 采用经典的 Encoder 和 Decoder 架构, 也就是说, 只有在完整的听完一句话之后模型才会输出, 那如果我们希望机器在听到声音的同时就输出怎么做呢? 我们下节课再讲.
来源: https://www.cnblogs.com/gongyanzh/p/12515971.html