Transformer 架构 - 位置编码层代码测试
1 课程概览
本课测试位置编码层。步骤:定义词汇表大小和词嵌入维度 → 实例化词嵌入层 → 创建输入张量 → 计算词向量 → 创建位置编码层对象 → 计算位置编码结果 → 返回结果。最终形状为 (2, 4, 512),即 2 个句子、每个句子 4 个词、每个词 512 维。
2 核心概念与定义
- 词嵌入层:将词索引转为词向量。
- 位置编码层:给词向量加位置信息。
- 最终结果:词向量 + 位置编码。
3 模型与算法详解
测试流程
1. 定义词汇表大小和词嵌入维度
2. 实例化词嵌入层
3. 创建输入张量 (batch, seq_len)
4. 计算词向量 (batch, seq_len, d_model)
5. 创建位置编码层对象
6. 计算位置编码结果 = 词向量 + 位置编码
7. 返回结果
形状变化
| 步骤 | 形状 | 说明 |
|---|---|---|
| 输入张量 | (2, 4) | 2 个句子,每个句子 4 个词 |
| 词向量 | (2, 4, 512) | 每个词 512 维 |
| 位置编码 | (60, 512) | 最大长度 60,每维 512 |
| 最终结果 | (2, 4, 512) | 词向量 + 位置编码 |
位置编码矩阵 PE
- 形状:(max_len, d_model) = (60, 512)
- position:0~59,共 60 个位置
- 每个位置 512 维
4 数学原理与推导
最终结果
$$\text{result} = \text{embedded} + \text{PE}$$
其中:
- $\text{embedded}$ 是词向量
- $\text{PE}$ 是位置编码
5 代码示例
import torch
from dm01_input import Embeddings, PositionalEncoding
def dm02_test_positional_encoding():
"""测试位置编码层"""
# 1. 定义词汇表大小和词嵌入维度
VOCAB_SIZE = 1000 # 词汇表大小
D_MODEL = 512 # 词向量维度
# 2. 实例化词嵌入层
my_embedding = Embeddings(D_MODEL, VOCAB_SIZE)
# 3. 创建输入张量 (batch=2, seq_len=4)
x = torch.LongTensor([[1, 2, 3, 4], [5, 6, 7, 8]])
# 4. 计算词向量
embedded_x = my_embedding(x)
print(f"词向量形状: {embedded_x.shape}") # (2, 4, 512)
# 5. 创建位置编码层对象
my_position = PositionalEncoding(D_MODEL, dropout=0.1, max_len=60)
# 6. 计算位置编码结果 = 词向量 + 位置编码
position_x = my_position(embedded_x)
print(f"最终结果形状: {position_x.shape}") # (2, 4, 512)
# 7. 返回结果
return position_x
if __name__ == "__main__":
result = dm02_test_positional_encoding()
print(f"结果形状: {result.shape}")
print(f"结果: {result}")
代码说明
| 代码 | 说明 |
|---|---|
VOCAB_SIZE = 1000 | 词汇表大小 |
D_MODEL = 512 | 词向量维度 |
torch.LongTensor([[1,2,3,4],[5,6,7,8]]) | 输入张量 (2, 4) |
my_embedding(x) | 计算词向量 |
my_position(embedded_x) | 词向量 + 位置编码 |
max_len=60 | 最大句子长度 |
6 重难点与易错提醒
- ❗重点:最终结果 = 词向量 + 位置编码。
- ❗重点:最终形状为 (2, 4, 512)。
- ⚠️易错:位置编码层要先实例化,再传入词向量。
- 💡深入理解:位置编码层和词嵌入层同属输入部分。
7 课堂问答精选
Q1:测试位置编码层的步骤是什么?
A:①定义词汇表大小和词嵌入维度;②实例化词嵌入层;③创建输入张量;④计算词向量;⑤创建位置编码层对象;⑥计算位置编码结果;⑦返回结果。
Q2:最终结果的形状是什么?
A:(2, 4, 512),即 2 个句子、每个句子 4 个词、每个词 512 维。这是词向量 + 位置编码的结果。
Q3:位置编码矩阵 PE 的形状是什么?
A:(60, 512),即最大长度 60,每维 512。position 从 0 到 59,共 60 个位置。
Q4:词向量和位置编码如何结合?
A:最终结果 = 词向量 + 位置编码,即 position_x = my_position(embedded_x)。
8 本课小结
- 测试步骤:定义参数 → 实例化词嵌入层 → 创建输入 → 计算词向量 → 实例化位置编码层 → 计算结果。
- 最终形状:(2, 4, 512)。
- 最终结果 = 词向量 + 位置编码。
- 位置编码矩阵 PE 形状:(60, 512)。
9 延伸思考
- 如何可视化位置编码?
- 位置编码的效果如何验证?