注意力机制与Transformer架构详解
立即解锁
发布时间: 2025-09-01 00:49:16 阅读量: 6 订阅数: 43 AIGC 

# 注意力机制与Transformer架构详解
## 一、Seq2Seq模型基础与改进
### 1.1 公式元素详解
在深入探讨注意力机制之前,我们先了解一些基础公式元素:
- \(P(y_1…y_{T′} | x_1…x_T)\):这是条件概率,其中 \((x_1…x_T)\) 是长度为 \(T\) 的输入序列,\((y_1…y_{T′})\) 是长度为 \(T'\) 的输出序列。
- \(v\):输入序列的固定长度编码(思想向量)。
- \(P(y_{T′} | v, y_1…y_{T′ - 1})\):给定先前的单词 \(y\) 以及思想向量 \(v\) 时,输出单词 \(y_{T′}\) 的概率。
### 1.2 Seq2Seq模型的改进技巧
原始的Seq2Seq论文引入了一些技巧来增强模型的训练和性能:
- **独立的编码器和解码器**:编码器和解码器是两个独立的LSTM。在机器翻译中,这使得可以使用相同的编码器为不同的语言训练不同的解码器。
- **反转输入序列**:将输入序列反向输入到解码器。例如,\([A,B,C] -> [W,X,Y,Z]\) 会变成 \([C,B,A] -> [W,X,Y,Z]\)。虽然没有明确的解释为什么这样做有效,但作者认为,由于这是一个逐步的模型,如果序列按正常顺序排列,源句子中的每个源单词与输出句子中对应的单词距离会很远。反转输入序列后,输入/输出单词之间的平均距离不会改变,但第一个输入单词会与第一个输出单词非常接近,这有助于模型在输入和输出序列之间建立更好的通信。然而,这种改进也说明了RNN(即使是LSTM或GRU)隐藏状态的不足,即较新的序列元素会抑制较旧元素的可用信息。
## 二、注意力机制的迭代发展
### 2.1 Bahdanau注意力
Bahdanau注意力是注意力机制的首次迭代,它扩展了Seq2Seq模型,使解码器能够处理所有编码器的隐藏状态,而不仅仅是最后一个。它是现有Seq2Seq模型的补充,而不是一个独立的实体。
#### 2.1.1 工作原理
注意力机制通过在编码器和解码器之间插入一个额外的上下文向量 \(c_t\) 来工作。时间 \(t\) 时的解码器隐藏状态 \(s_t\) 现在不仅是步骤 \(t - 1\) 时的隐藏状态和解码器输出的函数,也是上下文向量 \(c_t\) 的函数:
\(s_t = f(s_{t - 1}, y_{t - 1}, c_t)\)
每个解码器步骤都有一个唯一的上下文向量,一个解码器步骤的上下文向量只是所有编码器隐藏状态的加权和:
\(c_t = \sum_{i = 1}^{T} \alpha_{t,i} h_i\)
其中:
- \(c_t\):在总共 \(T'\) 个输出步骤中,解码器输出步骤 \(t\) 的上下文向量。
- \(h_i\):在总共 \(T\) 个输入步骤中,编码器步骤 \(i\) 的隐藏状态向量。
- \(\alpha_{t,i}\):在当前解码器步骤 \(t\) 的上下文中,与 \(h_i\) 相关联的标量权重。
#### 2.1.2 权重计算
权重 \(\alpha_{t,i}\) 的计算方法如下:
- 首先,解码器在步骤 \(t\) 时所有 \(\alpha_{t,i}\) 权重的总和为1。我们可以通过在注意力机制上应用softmax操作来实现这一点:
\(\alpha_{t,i} = \frac{exp(e_{t,i})}{\sum_{j = 1}^{T} exp(e_{t,j})} = softmax(e_{t,i} / e_t)\)
其中,\(e_{t,i}\) 是一个对齐分数,它表示输入序列中位置 \(i\) 周围的元素与位置 \(t\) 处的输出匹配(或对齐)的程度。这个分数基于前一个解码器状态 \(s_{t - 1}\) 以及编码器状态 \(h_i\):
\(e_{t,i} = a(s_{t - 1}, h_i)\)
这里的 \(a\) 是一个可微函数,它与系统的其余部分一起通过反向传播进行训练。论文作者选择了所谓的加法注意力,它有两种形式:
- \(e_{t,i} = a(s_{t - 1}, h_i) = v^{\top} tanh(W[h_i; s_{t - 1}])\)
- \(e_{t,i} = a(s_{t - 1}, h_i) = v^{\top} tanh(W_1 h_i + W_2 s_{t - 1})\)
#### 2.1.3 算法步骤总结
Bahdanau注意力算法的步骤如下:
1. 将输入序列输入到编码器中,并计算一组隐藏状态 \(H = \{h_1, h_2…h_T\}\)。
2. 计算对齐分数 \(e_{t,i} = a(s_{t - 1}, h_i)\),使用前一个步骤的解码器状态 \(s_{t - 1}\)。如果 \(t = 1\),我们将使用最后一个编码器状态 \(h_T\) 作为初始隐藏状态。
3. 计算权重 \(\alpha_{t,i} = softmax(e_{t,i} / e_t)\)。
4. 计算上下文向量 \(c_t = \sum_{i = 1}^{T} \alpha_{t,i} h_i\)。
5. 基于连接的向量 \(s_{t - 1}\) 和 \(c_t\) 以及前一个解码器输出 \(y_{t - 1}\),计算隐藏状态 \(s_t = RNN_{decoder}([s_{t - 1}; c_t], y_{t - 1})\)。此时,我们可以计算最终输出 \(y_t\)。如果我们需要对下一个单词进行分类,我们将使用softmax输出 \(y_t = softmax(W_y s_t)\),其中 \(W_y\) 是一个权重矩阵。
6. 重复步骤2到5,直到序列结束。
### 2.2 Luong注意力
Luong注意力在Bahdanau注意力的基础上进行了一些改进。最显著的是,对齐分数取决于解码器的隐藏状态 \(s_t\),而不是Bahdanau注意力中的 \(s_{t - 1}\)。
#### 2.2.1 算法步骤
Luong注意力的执行步骤如下:
1. 将输入序列输入到编码器中,并计算一组编码器隐藏状态 \(H = \{h_1, h_2…h_T\}\)。
2. \(s_t = RNN_{decoder}(s_{t - 1}, y_{t - 1})\):基于前一个解码器的隐藏状态 \(s_{t - 1}\) 和前一个解码器的输出 \(y_{t - 1}\) 计算解码器的隐藏状态(不过不包括上下文向量)。
3. \(e_{t,i} = a(s_t, h_i)\):计算对齐分数,使用当前步骤的解码器状态 \(s_t\)。除了加法注意力,Luong注意力论文还提出了两种乘法注意力:
- \(e_{t,i} = s_t^{\top} h_i\):无任何参数的点积。在这种情况下,向量 \(s\) 和 \(h\)(表示为列矩阵和行矩阵)需要具有相同的大小。
- \(e_{t,i} = s_t^{\top} W_m h_i\):这里的 \(W_m\) 是注意力层的可训练权重矩阵。
4. \(\alpha_{t,i} = softmax(e_{t,i} / e_t)\):计算权重。
5. \(c_t = \sum_{i = 1}^{T} \alpha_{t,i} h_i\):计算上下文向量。
6. \(\tilde{s}_t = tanh(W_c[c_t; s_t])\):基于连接的向量 \(c_t\) 和 \(s_t\) 计算中间向量。此时,我们可以计算最终输出 \(y_t\)。在分类的情况下,我们将使用softmax \(y_t = softmax(W_y \tilde{s}_t)\),其中 \(W_y\) 是一个权重矩阵。
7. 重复步骤2到6,直到序列结束。
### 2.3 通用注意力
通用注意力是一种通用的深度学习技术,它从一个查询 \(q\) 开始,对键值对数据库 \(k\) 和 \(v_k\) 执行查询。每个键 \(k_n\) 都有一个对应的单一
0
0
复制全文
相关推荐

