外观
类GPT模型架构
约 674 字大约 2 分钟
2025-06-20
# 导入必要的库
import torch
import torch.nn as nn
import tiktoken # OpenAI开源的tokenizer工具
# 定义简化版GPT模型类
class DummyGPTModel(nn.Module):
def __init__(self, cfg):
"""初始化GPT模型
Args:
cfg (dict): 模型配置字典
"""
super().__init__()
# 词嵌入层:将离散的token转换为连续向量
self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"])
# 位置嵌入层:编码序列的位置信息
self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"])
# 嵌入层的Dropout,用于防止过拟合
self.drop_emb = nn.Dropout(cfg["drop_rate"])
# Transformer模块堆叠:由多个Transformer块组成的序列
self.trf_blocks = nn.Sequential(
*[DummyTransformerBlock(cfg) for _ in range(cfg["n_layers"])]
)
# 最终的层归一化
self.final_norm = DummyLayerNorm(cfg["emb_dim"])
# 输出头:将隐藏向量转换为词表大小的logits
self.out_head = nn.Linear(cfg["emb_dim"], cfg["vocab_size"], bias=False)
def forward(self, in_idx):
"""前向传播过程
Args:
in_idx (Tensor): 输入token索引,形状 [batch_size, seq_len]
"""
batch_size, seq_len = in_idx.shape
# 获取词嵌入:[batch_size, seq_len, emb_dim]
tok_embeds = self.tok_emb(in_idx)
# 生成位置索引并获取位置嵌入:[seq_len, emb_dim]
pos_embeds = self.pos_emb(torch.arange(seq_len, device=in_idx.device))
# 合并词嵌入和位置嵌入
x = tok_embeds + pos_embeds
# 应用嵌入层Dropout
x = self.drop_emb(x)
# 通过所有Transformer块
x = self.trf_blocks(x)
# 最终层归一化
x = self.final_norm(x)
# 生成输出logits:[batch_size, seq_len, vocab_size]
logits = self.out_head(x)
return logits
class DummyTransformerBlock(nn.Module):
"""简化的Transformer块(占位实现,正常应包含注意力机制和前馈网络)"""
def __init__(self, cfg):
super().__init__()
# 此处应为多头注意力机制和前馈神经网络层
# 实际实现需要包含:层归一化、注意力层、残差连接等
def forward(self, x):
# 此处应有处理输入数据并返回输出的逻辑
return x # 直接返回输入用于演示
class DummyLayerNorm(nn.Module):
"""简化的层归一化(占位实现)"""
def __init__(self, normalized_shape, eps=1e-5):
super().__init__()
# 实际实现需要包含可学习的缩放和平移参数
def forward(self, x):
# 此处应有归一化计算逻辑
return x # 直接返回输入用于演示
# GPT-1.24亿参数模型的配置字典
GPT_CONFIG_124M = {
"vocab_size": 50257, # 词汇表大小(GPT-2的词表大小)
"context_length": 1024, # 最大上下文长度
"emb_dim": 768, # 嵌入维度
"n_heads": 12, # 注意力头数
"n_layers": 12, # Transformer层数
"drop_rate": 0.1, # Dropout概率
"qkv_bias": False # 是否在Q/K/V计算中使用偏置
}
# 文本处理流程
tokenizer = tiktoken.get_encoding("gpt2") # 加载GPT-2的分词器
# 构建测试批次数据
batch = []
txt1 = "Every effort moves you"
txt2 = "Every day holds a"
# 将文本编码为token索引,并转换为张量
batch.append(torch.tensor(tokenizer.encode(txt1)))
batch.append(torch.tensor(tokenizer.encode(txt2)))
# 堆叠张量形成批次:[batch_size=2, seq_len]
batch = torch.stack(batch, dim=0)
# 设置随机种子保证结果可复现
torch.manual_seed(123)
# 实例化模型
model = DummyGPTModel(GPT_CONFIG_124M)
# 前向传播获取输出logits
logits = model(batch)
# 打印输出结果
print("Output shape:", logits.shape) # 应输出 [2, seq_len, 50257]
print(logits)
版权所有
版权归属:NateHHX