规范化层 - 代码测试
1 课程概览
本课测试规范化层。步骤:获取前馈全连接层结果 → 创建规范化层对象 → 将结果传入规范化层 → 输出结果。形状保持不变 (2, 4, 512)。规范化层是组件级别的测试,可以像搭积木一样自由组合。
2 核心概念与定义
- 组件:可以像搭积木一样自由组合。
- 前馈全连接层结果:作为规范化层的输入。
- 形状保持不变:规范化层不改变形状。
3 模型与算法详解
测试流程
1. 获取前馈全连接层结果
2. 创建规范化层对象
3. 将结果传入规范化层
4. 输出结果
形状变化
| 步骤 | 形状 | 说明 |
|---|---|---|
| 多头注意力结果 | (2, 4, 512) | 多头注意力层 |
| 前馈全连接结果 | (2, 4, 512) | 前馈全连接层 |
| 规范化层结果 | (2, 4, 512) | 形状不变 |
组件测试思路
现在是组件级别,可以像搭积木一样自由组合。
- 多头注意力 → 前馈全连接 → 规范化层
- 可以自由组合
- 后续实现架构时,要按照架构的顺序搭建
4 数学原理与推导
规范化
$$y = \gamma \cdot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta$$
5 代码示例
import torch
from dm01_input import Embeddings, PositionalEncoding
from dm04_attention import MultiHeadAttention
from dm05_feedforward import FeedForward
from dm06_layer_norm import LayerNorm
def use_layer_norm():
"""测试规范化层"""
# 1. 获取前馈全连接层结果
ffn_x = use_ffn() # (2, 4, 512)
# 2. 创建规范化层对象
my_layer_norm = LayerNorm(512)
# 3. 将结果传入规范化层
result = my_layer_norm(ffn_x)
# 4. 输出结果
print(f"规范化层结果形状: {result.shape}")
return result
def use_ffn():
"""获取前馈全连接层结果"""
# 获取多头注意力结果
attn_x = use_multihead_attn()
# 创建前馈全连接层
my_ffn = FeedForward(512, 2048, 0.1)
# 前向传播
ffn_x = my_ffn(attn_x)
return ffn_x
def use_multihead_attn():
"""获取多头注意力结果"""
position_x = use_position()
Q = K = V = position_x
my_attention = MultiHeadAttention(512, 8)
result = my_attention(Q, K, V)
return result
def use_position():
"""获取位置编码结果"""
VOCAB_SIZE = 1000
D_MODEL = 512
my_embedding = Embeddings(D_MODEL, VOCAB_SIZE)
x = torch.LongTensor([[1, 2, 3, 4], [5, 6, 7, 8]])
embedded_x = my_embedding(x)
my_position = PositionalEncoding(D_MODEL, dropout=0.1, max_len=60)
position_x = my_position(embedded_x)
return position_x
# 测试
if __name__ == "__main__":
result = use_layer_norm()
print(f"最终结果形状: {result.shape}")
代码说明
| 代码 | 说明 |
|---|---|
use_ffn() | 获取前馈全连接层结果 |
LayerNorm(512) | 创建规范化层对象 |
my_layer_norm(ffn_x) | 将结果传入规范化层 |
6 重难点与易错提醒
- ❗重点:规范化层不改变形状。
- ❗重点:组件可以像搭积木一样自由组合。
- 💡深入理解:后续实现架构时,要按照架构的顺序搭建。
7 课堂问答精选
Q1:如何测试规范化层?
A:步骤:①获取前馈全连接层结果;②创建规范化层对象;③将结果传入规范化层;④输出结果。
Q2:规范化层的输出形状是什么?
A:输出形状与输入形状保持一致,都是 (2, 4, 512)。
Q3:组件测试时可以自由组合吗?
A:可以,组件级别可以像搭积木一样自由组合。但后续实现架构时,要按照架构的顺序搭建。
8 本课小结
- 测试步骤:获取前馈全连接结果 → 创建规范化层 → 传入结果 → 输出。
- 输出形状不变:(2, 4, 512)。
- 组件可以自由组合,像搭积木。
9 延伸思考
- BN 和 LN 有什么区别?
- 子层结构如何搭建?