😀 🎯 前言:为什么要学AI训练?
想象一下,你有一个聪明的朋友,他能回答你的问题、帮你写作业、陪你聊天。但这个朋友不是人,而是一个由代码组成的"大脑"。AI训练就是教会这个"大脑"如何思考和学习的过程。本教程将带你从零开始,亲手训练一个能对话的AI模型。就像教一个刚出生的婴儿学说话一样,我们会一步步地教会我们的AI理解人类的语言。
简单理解: AI模型就像一个超级复杂的数学函数
输入:"今天天气怎么样?"
↓ (AI模型处理)
输出:"今天阳光明媚,适合外出!"
用新手能懂的方式解释:
训练 = 学习过程
想象你在准备数学考试:
AI的训练过程完全一样,只是换成了计算机来做这些事情。
定义: 专门处理语言的AI模型
生活中的例子:
参数 = 模型的"脑细胞"数量
| 模型版本 | 参数量 | 相当于 | 显存需求 |
|---|---|---|---|
| MiniMind-Small | 26M | 2600万个脑细胞 | 0.5GB |
| MiniMind | 108M | 1亿个脑细胞 | 2GB |
| GPT-3 | 175B | 1750亿个脑细胞 | 350GB |
理解: 参数越多,模型越聪明,但需要更多计算资源
作用: 把句子拆成小块
输入:"我喜欢吃苹果"
输出:["我", "喜欢", "吃", "苹果"]
为什么需要? 就像你背单词,AI也需要先学会"单词"
作用: 理解词语之间的关系
生活中的比喻:
作用: 把词语变成数字
理解:
就像: 给AI看百科全书、小说、新闻
MiniMind的数据类型:
数据格式:
{
"text": "人工智能是计算机科学的一个分支",
"source": "维基百科"
}
就像: 给AI上"说话礼仪课"
数据格式:
{
"instruction": "请介绍一下你自己",
"input": "",
"output": "我是一个AI助手,很高兴为你提供帮助!"
}
为什么要分两步?
定义: 每次训练看多少个例子
理解:
推荐: 64-128(基于RTX 3090)
定义: 模型能处理的最长句子
理解:
推荐: 512个词
定义: 每次学习的步长
理解:
推荐: 5e-4(0.0005)
定义: 把数据看几遍
理解:
推荐: 10轮
定义: 每个词的向量大小
理解:
推荐: 512维
定义: 神经网络的深度
理解:
推荐: 8层
定义: 同时关注多少个方面
理解:
推荐: 8个头
# 1. 安装Python(3.8-3.11版本)# 2. 安装PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 3. 安装其他依赖
pip install -r requirements.txt
# 方法1:从ModelScope下载(推荐国内用户)
git clone https://www.modelscope.cn/datasets/gongjy/minimind_dataset.git
# 方法2:从HuggingFace下载
git clone https://huggingface.co/datasets/jingyaogong/minimind_dataset
dataset/
├── pretrain_hq.jsonl # 高质量预训练数据(推荐)
├── pretrain.jsonl # 完整预训练数据
├── sft_mini_512.jsonl # 小规模微调数据(推荐)
├── sft_512.jsonl # 标准微调数据
└── sft_1024.jsonl # 高质量微调数据
让AI学会基本的语言知识,就像婴儿先学会听和说
python trainer/train_pretrain.py \
--dim 512 \# 词向量维度
--n_layers 8 \# 网络层数
--n_heads 8 \# 注意力头数
--batch_size 64 \# 批量大小
--max_epochs 10 \# 训练轮次
--lr 5e-4 \# 学习率
--max_seq_len 512# 最大序列长度
Epoch 1/10: Loss = 8.5 ← 刚开始,什么都不懂
Epoch 5/10: Loss = 4.2 ← 学会了一些
Epoch 10/10: Loss = 2.8 ← 基本学会了语言规律
让AI学会如何礼貌、合理地回答问题
python trainer/train_full_sft.py \
--dim 512 \# 保持与预训练一致
--n_layers 8 \# 保持与预训练一致
--n_heads 8 \# 保持与预训练一致
--batch_size 64 \# 可以稍微调大
--max_epochs 10 \# 通常比预训练少
--lr 5e-4 \# 学习率可以更小
--max_seq_len 512# 保持一致
训练前:Q:你好 A:你好你好你好你好(重复)
训练后:Q:你好 A:你好!很高兴见到你,有什么可以帮助你的吗?
# 测试预训练模型
python eval_llm.py --weight pretrain_512
# 测试微调模型
python eval_llm.py --weight full_sft_512
1. 基础对话:"你好"、"谢谢"、"再见"
2. 知识问答:"中国的首都是哪里?"
3. 翻译任务:"Hello翻译成中文"
4. 数学计算:"1+1等于几?"
5. 创意写作:"写一首关于春天的诗"
就像给模型戴一个"隐形眼镜",只改变部分参数
python trainer/train_lora.py \
--lora_rank 16 \# LoRA秩
--lora_alpha 32 \# LoRA缩放因子
--lora_dropout 0.1# Dropout率
让AI学会"什么回答更好"
{
"prompt": "如何学习编程?",
"chosen": "建议从Python开始,循序渐进",
"rejected": "别学了,太难了"
}
让AI通过"奖励"和"惩罚"来学习
定义: 模型预测错误的程度
健康状态:
正常:Loss逐渐下降,最终趋于平稳
异常:Loss忽高忽低,或者不下降
严重:Loss反而上升
定义: 预测正确的比例
期望趋势:
训练开始:20%(随机猜测)
训练中:60%(明显进步)
训练结束:85%(较好效果)
# 查看GPU使用情况
nvidia-smi
# 实时监控
watch -n 1 nvidia-smi
症状: CUDA out of memory
解决方案:
# 减小批量大小
--batch_size 32# 原来是64# 减小序列长度
--max_seq_len 256# 原来是512# 使用梯度累积
--gradient_accumulation_steps 2
症状: 一天只能训练几个epoch
解决方案:
# 增大批量大小(显存允许)
--batch_size 128# 原来是64# 使用混合精度训练
--precision 16
# 多GPU训练
--devices 2,3# 使用第2、3号GPU
症状: Loss不下降,准确率很低
解决方案:
# 调整学习率
--lr 1e-3# 增大学习率
--lr 1e-4# 减小学习率# 增加数据量# 使用更多训练数据# 调整模型架构
--n_layers 12# 增加层数
--dim 768# 增加维度
训练一个专门写诗的AI模型
# 收集古诗数据echo "床前明月光,疑是地上霜" > poems.txt
echo "举头望明月,低头思故乡" >> poems.txt
python trainer/train_pretrain.py \
--data_path poems.txt \
--dim 256 \
--n_layers 4 \
--batch_size 32 \
--max_epochs 20
python scripts/chat_openai_api.py \
--prompt "写一首关于月亮的诗"
训练一个专门做数学题的AI
# 生成数学题目
math_data = []
for i in range(1000):
a, b = random.randint(1, 100), random.randint(1, 100)
question = f"{a} + {b} = ?"
answer = f"{a} + {b} = {a+b}"
math_data.append({"text": f"Q: {question}\nA: {answer}"})
python trainer/train_pretrain.py \
--data_path math_questions.jsonl \
--dim 512 \
--n_layers 6 \
--batch_size 64 \
--max_epochs 15
python eval_llm.py --weight math_teacher
训练一个了解你喜好的AI助手
{
"instruction": "我的兴趣爱好",
"input": "",
"output": "你喜欢编程、打篮球、听周杰伦的歌"
}
python trainer/train_lora.py \
--base_model checkpoints/full_sft_512.pth \
--personal_data my_profile.jsonl \
--lora_rank 8 \
--batch_size 16 \
--max_epochs 5
python scripts/chat_openai_api.py \
--prompt "给我推荐一首歌"
输入:[x1, x2, x3]
权重:[w1, w2, w3]
计算:y = w1*x1 + w2*x2 + w3*x3 + b
输出:y
理解: 就像加权平均,重要的信息权重大
输入层 → 隐藏层 → 输出层
x → h → y
理解: 信息从输入经过处理得到输出
输出错误 → 计算梯度 → 更新权重
理解: 从错误中学习,调整参数
Query: 我在找什么?
Key: 我有什么?
Value: 我能提供什么?
理解: 就像你在看一张照片,会自动注意到重要的部分
同时关注多个方面:
- 语法结构
- 语义含义
- 上下文关系
理解: 就像阅读时同时注意内容、语法、情感
L = -Σ y_true * log(y_pred)
理解: 预测越准确,损失越小
最小化损失函数 = 最大化准确率
A: 高中数学足够!重点是理解概念,不是推导公式。
A: 可以!MiniMind主要处理中文,而且代码注释都有中文。
A: 约3元人民币(GPU租用)+ 2小时时间。
A: 需要独立显卡,建议RTX 3060以上。
A: 很正常!查看错误信息,调整参数重试。
A:
A:
A:
# 保存模型cp checkpoints/full_sft_512.pth my_model.pth
# 上传到HuggingFace
git push origin main
恭喜你完成了这个教程!你已经掌握了:
✅ 基础概念:理解什么是AI训练
✅ 实践技能:能够独立训练模型
✅ 理论知识:了解背后的原理
✅ 调试能力:会解决常见问题
✅ 创新思维:能设计自己的实验
run_training.bat,开始第一次训练!如果遇到问题:
祝你训练顺利!期待看到属于你的AI模型! 🤖✨