Transformer 架构 - 位置编码总结
1 课程概览
本课总结位置编码的好处。位置编码有四大好处:①记住词的顺序;②计算高效;③适应任意长度;④模型处理语言时更灵活。面试时用这四点回答。计算高效是因为可以通过线性组合推导新位置编码,不需要重复计算三角函数。
2 核心概念与定义
- 位置编码(PE):给词向量加位置信息。
- 周期性函数:sin、cos 函数。
- 线性组合推导:通过已知位置编码推导新位置编码。
3 模型与算法详解
位置编码的四大好处
| 好处 | 说明 |
|---|---|
| 1. 记住词的顺序 | 通过周期性函数给每个位置贴独特标签 |
| 2. 计算高效 | 通过线性组合推导新位置编码,省算力 |
| 3. 适应任意长度 | 不管句子多长,随时能算编码 |
| 4. 模型更灵活 | 模型处理语言时更聪明、更灵活 |
好处详解
1. 记住词的顺序
通过周期性函数(sin、cos)给每个位置贴独特的标签。
- 让模型区分"我爱你"和"你爱我"
- 每个位置都有独特的标签
2. 计算高效
通过线性组合推导新位置编码,不需要重复计算三角函数。
示例:
- 已知 pos=2 的编码
- 求 pos=5 的编码
- 5 = 2 + 3
- 可以通过已知编码推导,不需要重新计算
好处:
- 省算力
- 省电费
- 省钱
3. 适应任意长度
不管句子多长,随时能算编码。
- 句子长度可变
- 泛化能力强
4. 模型更灵活
模型处理语言时更聪明、更灵活。
面试话术
面试时用这四点回答:①记住词的顺序;②计算高效;③适应任意长度;④模型更灵活。
4 数学原理与推导
线性组合推导
$$\text{PE}(pos + k) = f(\text{PE}(pos))$$
通过已知位置的编码,可以线性组合推导出新位置的编码,不需要重复计算三角函数。
周期性函数
$$\sin(pos + k) = \sin(pos)\cos(k) + \cos(pos)\sin(k)$$ $$\cos(pos + k) = \cos(pos)\cos(k) - \sin(pos)\sin(k)$$
通过加法公式,可以用已知位置的 sin/cos 值推导新位置的 sin/cos 值。
5 代码示例
import math
def demonstrate_pe_efficiency():
"""演示位置编码的计算高效性"""
d_model = 512
# 计算位置 2 的编码
pos_2_pe = []
for i in range(d_model // 2):
pe_sin = math.sin(2 / (10000 ** (2 * i / d_model)))
pe_cos = math.cos(2 / (10000 ** (2 * i / d_model)))
pos_2_pe.append((pe_sin, pe_cos))
# 计算位置 5 的编码(可以通过位置 2 推导)
# 5 = 2 + 3
# sin(5) = sin(2)cos(3) + cos(2)sin(3)
# cos(5) = cos(2)cos(3) - sin(2)sin(3)
print("位置 2 的编码(前 4 个维度):")
for i in range(4):
print(f" 维度 {2*i}: sin = {pos_2_pe[i][0]:.6f}")
print(f" 维度 {2*i+1}: cos = {pos_2_pe[i][1]:.6f}")
print("\n位置 5 的编码可以通过位置 2 和位置 3 推导:")
print(" sin(5) = sin(2)cos(3) + cos(2)sin(3)")
print(" cos(5) = cos(2)cos(3) - sin(2)sin(3)")
print(" 不需要重新计算三角函数!")
demonstrate_pe_efficiency()
6 重难点与易错提醒
- ❗重点:位置编码的四大好处(面试必背)。
- ❗重点:计算高效是因为可以通过线性组合推导新位置编码。
- ⚠️易错:实际开发中 d_model 是 512,不是 4。
- 💡深入理解:省算力 = 省钱(电费等)。
- 💡深入理解:周期性函数给每个位置贴独特标签。
7 课堂问答精选
Q1:位置编码有哪些好处?
A:四大好处:①记住词的顺序(通过周期性函数给每个位置贴独特标签);②计算高效(通过线性组合推导新位置编码,省算力);③适应任意长度(不管句子多长随时能算编码);④模型更灵活(模型处理语言时更聪明、更灵活)。
Q2:为什么位置编码计算高效?
A:因为可以通过线性组合推导新位置编码,不需要重复计算三角函数。例如已知 pos=2 的编码,求 pos=5 的编码,5=2+3,可以通过 sin(5)=sin(2)cos(3)+cos(2)sin(3) 推导,不需要重新计算。
Q3:实际开发中 d_model 是多少?
A:实际开发中 d_model 通常是 512,不是演示用的 4。
Q4:面试时如何回答位置编码的好处?
A:用四点回答:①记住词的顺序;②计算高效;③适应任意长度;④模型更灵活。
8 本课小结
- 位置编码四大好处:①记住词的顺序;②计算高效;③适应任意长度;④模型更灵活。
- 计算高效:通过线性组合推导新位置编码。
- 周期性函数:给每个位置贴独特标签。
- 面试话术:用这四点回答。
- 实际开发 d_model = 512。
9 延伸思考
- 如何用代码实现位置编码层?
- 位置编码如何与词向量结合?