注意力机制是当下深度学习中的后起之秀,最初的想法源于 Dzmitry Bahdanau 等人的论文 Neural Machine Translation by Jointly Learning to Align and Translate。了解强大的注意力技术的起源有助于我们掌握许多基于其延伸出的发展,本文将介绍这个注意力机制背后的逻辑。
语言到语言的翻译模式
Neural Machine Translation by Jointly Learning to Align and Translate 介绍了一种将原始语言中的语句翻译成目标语言中语句的模型。该模型具有"编码器-解码器"结构,使用递归神经网络(RNN)同时实现编码器和解码器。
翻译模型体系结构模型架构如下:
输入
在上述图片中,编码器的输入是原始语言中的单词序列:X₁, ... , Xᵢ, ... , X_Tₓ
。
- Tₓ 是输入句子的长度,例如,在"My name is YBCarry."这句话中,Tₓ 的值是 4。
- 每个 xᵢ 是原始语言中单词的一个离散表示(one-hot representation),其中包含一个 Kₓ 字典。也就是说,每个 Xᵢ 是一个长度为 Kₓ 的向量,通常在 5 万到 10 万字的范围内。Xᵢ 向量中只有一个条目是1,表示原始语言中的某个特定单词,所有其他条目都是 0。
编码器(Encoder)
在上述图片中,编码器是绿色的连续块。
- 编码器是一个递归神经网络,编码器块只有一个,所有输入的语句都由这个块处理,一个词接着一个词。
- 编码器块获取隐藏状态和输入词,并发出下一个隐藏状态,隐状态向量不是模型参数,它们是递归神经网络块的输出。
h₀, h₁, ... , h_Tₓ
是长度为 n 的隐藏状态向量,h₀ 是一个零向量。 - 最后一个编码器隐藏状态 h_Tₓ 将是解码器的初始状态,即 s₀ = h_Tₓ。在上述图片中虚线箭头建立了这个连接。
解码器(Decoder)
在上述图片中,解码器是橙色的连续块。
- 解码器结构和编码器类似,也是只有一个解码器块。
- 解码器块输出两个信息: 目标语言中的下一个翻译单词、下一个解码器隐藏状态。所以它需要三个输入:前一个解码器的隐藏状态(蓝色箭头表示)、前一个输出的单词(黄色箭头表示)和上下文(紫色箭头表示)。上下文是注意机制作用的结果。
- 解码器块会持续输出已翻译的单词,一直到一个特殊的句尾单词。
- 虽然图片中编码器块和解码器块的数量相同,但在实际翻译过程中,输入和输出的句子很可能具有不同的长度。
输出
在上述图片中,解码器的输出是目标语言中的一系列单词概率向量:Y₁, ... , Yᵢ, ... , Y_Tₓ
。
- Tᵧ 是目标语句的长度,在模型完成翻译之前是未知的,只有当解码器输出特殊的句尾单词时,目标语句长度才被确定。
- 每个输出的概率向量 Yᵢ 的长度为 Kᵧ, Kᵧ 是目标语言的字典大小。向量 Y 中的条目 i 是 0 和 1 之间的实数,表示特定单词(即第 i 个单词)在目标语言中的概率,其中 i 是条目索引。Y 中的所有条目 i 总和为 1。一般是使用最高概率的单词作为解码器的第 i 个输出的单词。
相关公式
编码隐藏状态
- 每个编码器隐藏状态 hᵢ 是一个长度为 n 的向量,其中 n 是编码器隐藏状态的维度。 n 是模型的超参数,通常在数百到几千之间。
- 编码器的初始隐藏状态为零向量。所有连续的编码器隐藏状态 hᵢ 通过引用前面的编码器隐藏状态 hᵢ-₁ 递归定义,这就是递归神经网络的本质。
注意力机制
- 注意力机制为每个输出单词计算一个上下文向量。对于第 t-th 个输出单词,上下文 cₜ 是所有编码器隐藏状态 h₁ 至 h_Tₓ 的加权平均值。
- 在标准"编码器-解码器"架构中,来自输入语句的信息只能通过最终编码器隐藏状态向量 h_Tₓ 或者等效的初始解码器隐藏状态向量 s_₀ 获得。
解码器隐藏状态
- 第一个解码隐藏状态 s_₀ 被设置为最后一个编码器隐藏状态 h_Tₓ,这就是为什么 s_₀ 具有与h_Tₓ 相同的形状。
- 所有连续解码器隐藏状态 sₜ 通过引用前面的解码器隐藏状态 sₜ₋₁ 递归定义, 其中包括:前一个输出单词 yₜ₋₁,前一个解码器状态 sₜ₋₁ 和上下文 cₜ 来自注意力机制。
总结
本文介绍了首次引入注意力机制的基于递归神经网络的语言到语言翻译模型,并解释了投入产出机制是如何运作的,以及其背后数学的逻辑。