从零手写 miniGPT 02 | 数据工程与训练循环:GPT 是如何“学习“的?
上一节我们从 Block 层面解析了 GPT 的核心结构包括多头注意力、前馈网络以及残差与归一化机制这些模块共同构成了 Transformer 的基本计算单元也是当前主流大模型共享的底层框架。然而模型能力的差异并不完全来源于结构本身。在相似的网络架构之下真正决定模型行为与能力边界的是其训练数据、训练目标以及训练过程。本节将从数据输入与训练流程出发系统梳理 GPT 是如何在大规模语料上被逐步“塑造”出来的。数据与训练流程一原始文本数据 - MyDataset 文本读取 / Token 化 / 构造输入 x 与标签 y - block_size 序列截断或对齐限制最大上下文长度 - DataLoader 批量加载 / 随机采样 / 形成 batch - train_one_epoch 前向计算 - Loss 计算 - 反向传播 - optimizer / scheduler 参数更新 / 学习率动态调整 - evaluate 验证集前向计算 / 评估泛化能力 - checkpoint 保存模型与训练状态核心代码逐块拆解二import torch import torch.nn as nn from torch.utils.data import Dataset, DataLoader import json import os # # 第一部分主程序运行区 (Execution Area) # # 1. 基础配置 device cuda if torch.cuda.is_available() else cpu block_size 512 # 模型一次能处理的最大序列长度 batch_size 12 # 每批次训练的数据量 # 2. 模型初始化 # 详见上一节GPT架构 model GPT(GPTConfig(block_sizeblock_size)) model model.to(device) # 打印模型参数量 total_params sum(p.numel() for p in model.parameters()) print(fTotal parameters: {total_params / 1e6:.2f} M) # 3. 优化器与学习率调度器 optimizer torch.optim.AdamW(model.parameters(), lr3e-4) # 使用余弦退火算法动态调整学习率T_max 通常设置为总训练步数 scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max1000) # 4. 数据准备 dataset_path /root/test.jsonl full_dataset MyDataset(dataset_path, block_sizeblock_size) # 按照 9:1 划分训练集和验证集 train_size int(0.9 * len(full_dataset)) val_size len(full_dataset) - train_size train_dataset, val_dataset torch.utils.data.random_split(full_dataset, [train_size, val_size]) train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) val_loader DataLoader(val_dataset, batch_sizebatch_size, shuffleFalse) # 5. 正式开始训练循环 (Epochs) os.makedirs(checkpoints, exist_okTrue) # 确保存档目录存在 for epoch in range(2): # 执行一轮训练 train_loss train_one_epoch(model, optimizer, scheduler, train_loader, device, epoch) # 执行一轮验证 val_loss evaluate(model, val_loader, device) avg_val_loss val_loss / len(val_loader) print(fEpoch {epoch} finished. Avg Val Loss: {avg_val_loss:.4f}) # 6. 保存模型存档 (Checkpoint) checkpoint { epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), scheduler_state_dict: scheduler.state_dict(), val_loss: avg_val_loss, } torch.save(checkpoint, fcheckpoints/model_epoch_{epoch}.pt)相关函数——训练、评估、数据处理函数def train_one_epoch(model, optimizer, scheduler, train_loader, device, epoch): 单轮训练函数 model.train() total_loss 0 for batch_idx, (x, y) in enumerate(train_loader): # 修正enumerate x, y x.to(device), y.to(device) # 前向传播计算预测值和损失 logits, loss model(x, targetsy) # 反向传播三部曲 optimizer.zero_grad() # 清空旧梯度 loss.backward() # 计算新梯度 optimizer.step() # 更新参数 # 调整学习率 scheduler.step() total_loss loss.item() if batch_idx % 100 0: print(fEpoch: {epoch}, Batch: {batch_idx}, Loss: {loss.item():.4f}) return total_loss def evaluate(model, val_loader, device): 验证集评估函数 model.eval() val_loss 0 with torch.no_grad(): # 验证时不计算梯度节省内存 for x, y in val_loader: x, y x.to(device), y.to(device) logits, loss model(x, targetsy) val_loss loss.item() return val_loss # # 第三部分数据类定义 (Class Definitions) # class MyDataset(Dataset): 负责将 jsonl 文件读取、Tokenize并切分成适合 GPT 训练的块 def __init__(self, path, block_size512): import tiktoken self.enc tiktoken.get_encoding(gpt2) self.block_size block_size self.encoded_data [] # 定义结束符 Token ID self.eos_token self.enc.encode( |endoftext|, allowed_special{|endoftext|} )[0] # 1. 加载原始数据 raw_data [] max_lines 1000 with open(path, r, encodingutf-8) as f: for i, line in enumerate(f): if i max_lines: break try: text json.loads(line.strip())[text] raw_data.append(text) except: continue # 2. 将所有文本拼接成一个长序列中间用 EOS 分隔 full_encoded [] for text in raw_data: encoded_text self.enc.encode(text) full_encoded.extend(encoded_text [self.eos_token]) # 3. 滑动窗口切割每个 chunk 长度为 block_size 1 (为了 x 和 y 的平移) # for i in range(0, len(full_encoded), self.block_size): chunk full_encoded[i : i self.block_size 1] # 如果最后一块不够长用 EOS 填充 (Padding) if len(chunk) self.block_size 1: chunk chunk [self.eos_token] * (self.block_size 1 - len(chunk)) self.encoded_data.append(chunk) def __len__(self): return len(self.encoded_data) def __getitem__(self, idx): chunk self.encoded_data[idx] # x 为前 n 个 tokeny 为后 n 个 token即 x 的下一个 token x torch.tensor(chunk[:-1], dtypetorch.long) y torch.tensor(chunk[1:], dtypetorch.long) return x, y至此我们完成了训练流程的核心拆解从数据准备、模型输入构建到训练与验证函数每一步都是模型顺利学习的基础。理解了这些流程后续我们才能更高效地调参、优化训练并为最终的模型性能打下坚实基础。这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2440276.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!