**Lookup Table(查找表)的示例:**
一个简单的lookup table可以是一个Python字典或在深度学习框架中实现为嵌入层的权重矩阵。以下是一个简化的、非技术性的文本表示形式:
```markdown
# Lookup Table 示例 (假设词汇表大小为5)
Word Embedding Lookup Table:
---------------------------
| 单词 | 嵌入向量 |
|------------|------------------|
| "apple" | [0.1, 0.2, 0.3] |
| "banana" | [-0.4, 0.5, -0.6] |
| "cherry" | [0.7, -0.8, 0.9] |
| "date" | [0.3, -0.1, 0.2] |
| "elderberry"| [-0.4, 0.3, 0.7] |
```
上述表格展示了每个单词对应一个固定的低维稠密向量,这些向量是通过训练模型得到的,代表了单词在特定语境下的语义特征。
**Transformer中的Input Embedding过程举例:**
假设我们有一段文字 "The apple is red.",我们的词汇表包含以上例子中的单词。在经过预处理后,这段话被转换为一个token序列:
```python
tokens = ["The", "apple", "is", "red", "."]
```
对于Transformer模型而言,它会有一个预先定义好的Input Embedding层,该层内部维护了一个嵌入查找表。当模型处理这个序列时,它会对每个token执行如下操作:
1. **Token化并映射到索引:**
每个单词都会被映射到其在lookup table中的唯一索引。
2. **通过Lookup Table获取嵌入向量:**
对于每个索引,模型会从lookup table中取出对应的嵌入向量。
```python
word_to_index = {"The": 0, "apple": 1, "is": 2, "red": 3, ".": 4} # 假设这是词汇表的映射关系
indexed_tokens = [word_to_index[word] for word in tokens]
# 然后通过Embedding层获取嵌入向量
embedding_layer = nn.Embedding(5, d_model=5) # 假设词汇表大小为5,嵌入维度为5
embeddings = embedding_layer(torch.tensor(indexed_tokens))
```
3. **最终生成的嵌入向量序列:**
通过lookup table和embedding layer处理后,我们得到了一个嵌入向量序列,每个向量代表相应单词在连续空间内的表达。
```
embedded_sequence = [
[0.1, 0.2, 0.3, ..., 0.5], # "The" 的嵌入向量
[0.1, 0.2, 0.3], # "apple" 的嵌入向量
[...], # "is" 的嵌入向量
[...], # "red" 的嵌入向量
[...], # "." 的嵌入向量
]
```
最后,在Transformer模型的实际应用中,除了单词嵌入之外,还会加上位置编码(Positional Encoding),以确保模型能够理解各个单词在句子中的相对位置信息。然后将两者相加得到最终的输入序列,再送入Transformer的自注意力机制进行后续处理。
在Transformer模型中,解码器(Decoder)部分首先对初始输出进行处理,这个过程通过带掩码的多头注意力(Masked Multi-Head Attention)模块完成。处理后的结果被用作Query(查询),而编码器(Encoder)的输出则作为Key(键)和Value(值)输入到解码器中。
以下是具体解释:
- Query(查询):Query在多头注意力机制中,表示的是模型关注的部分。在解码器的初始阶段,这个Query通常是模型试图生成的下一个词或符号。经过带掩码的多头注意力模块处理后,这个Query会被调整,以便模型能够更好地理解上下文信息。
- Key(键)和 Value(值):在多头注意力机制中,Key和Value表示的是用于生成Query的信息。具体来说,Key和Value来自于编码器的输出,即原始输入数据经过编码器处理后的表示。解码器通过比较Query和每一个Key的相似度来决定关注哪一个Key和对应的Value,从而生成正确的输出。
这种设计允许模型在生成输出时考虑更多的上下文信息,从而提高了输出的准确性和质量。在训练过程中,模型会学习如何根据当前的Query和编码器的输出(Key和Value)来生成正确的输出,这有助于提高模型的泛化能力。
1. **解码器的初始输出**:当解码器开始工作时,其首个隐藏状态通常是对前一个时间步(对于第一个位置可能是特殊标记如`<start>`)的嵌入向量经过自注意力机制(这里特别指带掩码的多头注意力模块)计算后的结果。这个输出被用作后续步骤中的“query”。
2. **带掩码的多头注意力**:在解码过程中,为了防止未来信息泄露(即预测当前词时不能看到后面未预测出的词),会对自注意力机制进行掩码操作。也就是说,在计算attention权重时,对当前位置之后的所有位置设置为不可见。
3. **编码器的输出作为key和value**:编码器负责对输入序列进行编码,生成一系列代表输入序列中每个位置上下文信息的向量。这些输出向量会被分别用来作为解码器多头注意力层中的“key”和“value”。在解码器内部,它不仅考虑自身之前的隐藏状态(query),还会与编码器的全部输出进行比较以获取编码器捕获的源语言上下文信息,这就是所谓的“encoder-decoder attention”。
- **Query (Q)**: 由解码器上一步的输出表示,它是解码器试图理解或生成的新词所基于的上下文向量。
- **Key (K)**: 来自编码器的输出,用于查询匹配过程,决定了哪些源句子的信息与当前解码位置相关。
- **Value (V)**: 同样来自编码器的输出,当key与query匹配时,对应的value将被加权求和来生成最终的上下文向量,这个向量包含了从源序列中提取的重要信息,用于生成目标序列的当前词。
总结来说,解码器在每一步都会利用自身的过去信息(通过query体现)结合编码器提供的全局源序列信息(通过key和value体现),共同决定下一步要生成的目标序列的词汇。