当前位置: 首页 > news >正文

【第四章:大模型(LLM)】05.LLM实战: 实现GPT2-(7)模型训练与微调

第四章:大模型(LLM)

第五部分:LLM实战: 实现GPT2

第六节:模型训练与微调


1. 前置回顾

在上一节中,我们已经完成了:

  • Token → Embedding

  • 分词器(Tokenizer)

  • Attention 与 Multi-Head Attention

  • 残差(Residual)与前馈网络(FFN)

  • 输出层(logits 生成)

  • 采样方法(贪婪、temperature、top-k/top-p)

现在,我们的 GPT-2 模型架构已经搭好,接下来要让它学会语言模式,必须通过 训练微调(fine-tuning)。


2. 模型训练的目标

训练过程的核心思想:

让模型根据上下文预测下一个 token,并不断调整参数以降低预测错误率(loss)。

数学形式:

\text{Loss} = -\frac{1}{N} \sum_{i=1}^{N} \log P_\theta(t_i | t_1, ..., t_{i-1})

  • N — token 序列长度

  • t_i — 真实 token

  • P_\theta — 模型参数下的预测概率分布

GPT-2 的训练实际上就是一个大规模 自回归语言建模 任务。


3. 数据准备

3.1 语料来源
  • 预训练:使用大规模公开数据集(Wiki, WebText, Books)。

  • 微调:使用领域数据(法律、医疗、金融、对话数据等)。

3.2 分词 & 编码
from transformers import GPT2Tokenizertokenizer = GPT2Tokenizer.from_pretrained('gpt2')
text = "今天是个好日子。"
tokens = tokenizer.encode(text, return_tensors='pt')  # shape: (1, seq_len)

注意:

  • GPT-2 分词器是 BPE(Byte Pair Encoding),中英文都能处理。

  • 返回是 token ID 张量,用于模型输入。


4. 训练流程

4.1 核心步骤
  1. 批量化数据(batching)

  2. 前向传播(forward pass)

  3. 计算损失(loss)

  4. 反向传播(backpropagation)

  5. 优化器更新参数(optimizer step)

  6. 重复多个 epoch

4.2 代码示例(PyTorch)
from torch.optim import AdamW
from transformers import GPT2LMHeadModel, GPT2Tokenizer# 1. 加载模型与分词器
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
tokenizer.pad_token = tokenizer.eos_token# 2. 数据
texts = ["今天是个好日子。", "机器学习正在改变世界。"]
encodings = tokenizer(texts, return_tensors='pt', padding=True, truncation=True)# 3. 优化器
optimizer = AdamW(model.parameters(), lr=5e-5)# 4. 训练循环
model.train()
for epoch in range(3):optimizer.zero_grad()outputs = model(**encodings, labels=encodings['input_ids'])loss = outputs.lossloss.backward()optimizer.step()print(f"Epoch {epoch + 1} Loss: {loss.item():.4f}")

运行结果

Epoch 1 Loss: 5.1916
Epoch 2 Loss: 3.5485
Epoch 3 Loss: 2.6843

5. 微调(Fine-tuning)

5.1 与预训练的区别
  • 预训练:从零开始,参数随机初始化,需要巨量数据和算力。

  • 微调:在已有的预训练模型上继续训练,数据规模小得多,但能快速适应特定任务/领域。

5.2 微调策略
  • 全参数微调:更新所有权重(适合算力充足)

  • 部分层微调:仅训练最后几层

  • 参数高效微调(PEFT):如 LoRA、Prefix-Tuning,只更新少量参数

5.3 LoRA 示例
from peft import get_peft_model, LoraConfigconfig = LoraConfig(r=8, lora_alpha=32, target_modules=["c_attn"],lora_dropout=0.1, bias="none", task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)

6. 超参数选择

参数说明GPT-2 经验值
batch_size每次梯度更新的样本数8~64
learning_rate学习率5e-51e-4(微调),1e-45e-4(预训练)
max_seq_len序列最大长度512~1024
epochs训练轮数3~10(视数据量)
warmup_steps学习率预热步数总步数的 1~5%

7. 训练技巧

  • 梯度累积(gradient accumulation):显存不够时,将多个小 batch 的梯度累积起来再更新。

  • 混合精度(FP16)训练:提升速度、降低显存。

  • 梯度裁剪(clip gradients):避免梯度爆炸。

  • 定期保存检查点(checkpoint):防止中途训练中断丢失进度。


8. 推理(Inference)

微调完成后,即可用模型生成文本:

model.eval()
prompt = "人工智能的未来是"
inputs = tokenizer(prompt, return_tensors='pt')
output_ids = model.generate(**inputs,max_length=50,temperature=0.7,top_k=50,top_p=0.9,do_sample=True
)
print(tokenizer.decode(output_ids[0], skip_special_tokens=True))

9. 可视化 & 监控

  • loss 曲线:观察收敛情况

  • 生成样例:每隔 N step 输出模型生成文本

  • 权重变化:可用 TensorBoard 监控梯度分布


10. 本节总结

  • GPT-2 训练目标:最小化下一个 token 的负对数似然损失

  • 微调是让通用语言模型快速适配特定任务的高效方式

  • 训练过程需注意数据准备、超参数设置、优化策略

  • 推理阶段可用采样策略(temperature、top-k、top-p)控制生成多样性

http://www.dtcms.com/a/326991.html

相关文章:

  • Apache 服务器基础配置与虚拟主机部署
  • 【自动化备份全网服务器数据项目】
  • 前端,route路由
  • 计算机视觉(7)-纯视觉方案实现端到端轨迹规划(思路梳理)
  • Rsync自动化备份平台建设实战
  • C#对接Ollama,调用大模型禁用思考模式
  • 鸿蒙本地与云端数据双向同步实战:从原理到可运行 Demo 的全流程指南
  • HarmonyOS元服务开发系列教程(三):实现音乐播放和封面旋转
  • 智能家居Agent:物联网设备的统一控制与管理
  • Python函数篇:从零到精通
  • 间隙锁(Gap Lock)
  • 【YOLOV8】小目标困难场景优化
  • 计算机网络---默认网关(Default Gateway)
  • 通用同步/异步收发器USART串口
  • JavaScript的fetch函数的用法
  • C++11新增关键字和范围for循环
  • 【限时分享:Hadoop+Spark+Vue技术栈电信客服数据分析系统完整实现方案
  • 基于Python的《红楼梦》文本分析与机器学习应用
  • Uniapp物联网平台登录与温湿度监测系统
  • 【电子硬件】EMI中无源晶振的优势
  • 从原理到实践:一文掌握Kafka的消息生产与消费
  • Web前端小游戏轮盘。
  • 开发避坑指南(23):Tomcat高版本URL特殊字符限制问题解决方案(RFC 7230 RFC 3986)
  • Python Day28 HTML 与 CSS 核心知识点 及例题分析
  • @Rancher简介部署使用 - Docker Compose
  • 第五章 特征值与特征向量
  • vue3 实现web网页不同分辨率适配
  • 【狂热算法篇】探寻图论幽径之SPFA算法:图论迷宫里的闪电寻径者(通俗易懂版)
  • http网页部署
  • AI Agent——基于 LangGraph 的多智能体任务路由与执行系统实战