Transformer 架构 - 词嵌入层代码实现
1 课程概览
本课实现 Transformer 输入部分的词嵌入层。输入部分包括 Input Embedding(原文本嵌入层)和 Positional Encoding(位置编码)。词嵌入层将文本转为词向量,因为模型底层只能处理数字。代码写在单独脚本中,供后续脚本调用。
2 核心概念与定义
- Input Embedding:原文本嵌入层,将英语句子转为词向量。
- Output Embedding:目标文本嵌入层,将法语句子转为词向量。
- 词向量:文本的数值形式,体现语义关联。
- nn.Embedding:PyTorch 提供的词嵌入层。
3 模型与算法详解
输入部分组成
输入部分 = Input Embedding + Positional Encoding
(原文本嵌入层) (位置编码)
英译法案例中的输入
| 数据 | 走的路径 |
|---|---|
| 英语句子(已知) | Input Embedding + Positional Encoding |
| 法语句子(已知) | Output Embedding + Positional Encoding |
词嵌入层的作用
将文本转成词向量,因为模型底层只能处理数字。
- 文本 → 数值形式
- 体现语义关联
- 文本与文本的关联 = 数值与数值的关联
代码组织
代码写在单独脚本中,供后续脚本调用。
- 文件命名:
dm01_input.py(不以数字开头,否则无法被其他文件导入) - 函数命名:与老师保持一致,方便调用
4 数学原理与推导
词嵌入
$$\text{embedded} = \text{Embedding}(x)$$
其中 $x$ 是输入的词索引,$\text{embedded}$ 是词向量。
5 代码示例
import torch
import torch.nn as nn
class Embeddings(nn.Module):
"""词嵌入层"""
def __init__(self, d_model, vocab_size):
"""
初始化词嵌入层
:param d_model: 词向量维度,例如 512
:param vocab_size: 词汇表大小
"""
super().__init__()
# 使用 nn.Embedding 进行词嵌入
self.lut = nn.Embedding(vocab_size, d_model)
self.d_model = d_model
def forward(self, x):
"""
前向传播
:param x: 输入的词索引
:return: 词向量
"""
# 乘以 sqrt(d_model) 进行缩放
return self.lut(x) * math.sqrt(self.d_model)
# 测试代码
if __name__ == "__main__":
import math
# 参数设置
d_model = 512 # 词向量维度
vocab_size = 1000 # 词汇表大小
# 创建词嵌入层
embedding = Embeddings(d_model, vocab_size)
# 输入测试数据(词索引)
x = torch.LongTensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
# 前向传播
output = embedding(x)
print(f"输入形状: {x.shape}")
print(f"输出形状: {output.shape}")
print(f"词向量维度: {d_model}")
代码说明
| 代码 | 说明 |
|---|---|
nn.Embedding(vocab_size, d_model) | 创建词嵌入层 |
self.lut(x) | 查表得到词向量 |
math.sqrt(self.d_model) | 缩放因子 |
d_model = 512 | 词向量维度 |
vocab_size | 词汇表大小 |
6 重难点与易错提醒
- ❗重点:词嵌入层将文本转为词向量。
- ❗重点:文件命名不能以数字开头,否则无法被其他文件导入。
- ⚠️易错:函数命名要与老师保持一致,方便后续调用。
- ⚠️易错:
d_model是词向量维度,通常为 512。 - 💡深入理解:模型底层只能处理数字,所以需要词嵌入。
7 课堂问答精选
Q1:词嵌入层的作用是什么?
A:将文本转成词向量。模型底层只能处理数字,所以需要将文本转成数值形式(词向量),然后通过数值与数值之间的关联来体现文本与文本之间的关联。
Q2:为什么文件命名不能以数字开头?
A:因为如果要在其他脚本中调用,数字开头的文件无法被导入。所以用 dm01_input.py 而不是 01_input.py。
Q3:Input Embedding 和 Output Embedding 有什么区别?
A:Input Embedding 是原文本嵌入层,将英语句子转为词向量;Output Embedding 是目标文本嵌入层,将法语句子转为词向量。在英译法案例中,英语是已知的输入,法语是已知的目标。
Q4:为什么函数命名要与老师保持一致?
A:因为代码写在单独脚本中,后续脚本(dm02、dm03 等)会调用这些函数。如果命名不一致,调用时会报错找不到。
8 本课小结
- 输入部分 = Input Embedding + Positional Encoding。
- 词嵌入层:文本 → 词向量。
- 文件命名:不以数字开头(如
dm01_input.py)。 - 函数命名:与老师保持一致。
nn.Embedding(vocab_size, d_model)创建词嵌入层。
9 延伸思考
- 位置编码如何实现?
- 词嵌入层和位置编码如何结合?