🤯 前言:为什么要自己训练?
你可能觉得:“调用 API 不就好了吗?”
但是,会调用 API 只能让你成为 AI 的用户,会训练模型才能让你成为 AI 的主人。
通过亲手写下Self-Attention的代码,看着 Loss 曲线下降,看着模型从输出乱码到输出“床前明月光”,这种去魅的过程是任何理论课都给不了的。
我们将使用NanoGPT—— 这是前 Tesla AI 总监 Karpathy 写的最简单的 Transformer 实现,代码极度干净,是学习 LLM 的圣经。
🏗️ 一、 架构拆解:GPT 是怎么工作的?
GPT (Generative Pre-trained Transformer) 的本质就是一个**“文字接龙机器”**。
给定前文,预测下一个字。
它的核心引擎是Transformer Decoder。我们可以把它看作一个多层的“汉堡包”。
模型架构图 (Mermaid):
🧪 二、 核心原理:自注意力机制 (Self-Attention)
这是 Transformer 的灵魂。模型通过它来理解“字与字之间的关系”。
比如“孤帆远影碧空尽”,“孤”和“帆”的关系很近,和“尽”的关系较远。
Attention 的计算公式是面试必考题:
- Q (Query):我想查什么?
- K (Key):我有什么特征?
- V (Value):我的内容是什么?
PyTorch 代码实现 (NanoGPT 核心):
classCausalSelfAttention(nn.Module):def__init__(self,config):super().__init__()# Q, K, V 的投影矩阵self.c_attn=nn.Linear(config.n_embd,3*config.n_embd,bias=False)self.c_proj=nn.Linear(config.n_embd,config.n_embd,bias=False)defforward(self,x):B,T,C=x.size()# Batch, Time(Sequence Length), Channel(Embedding Size)# 1. 计算 Q, K, Vq,k,v=self.c_attn(x).split(self.config.n_embd,dim=2)# 2. 计算 Attention Scores (Q @ K转置)# 这里的 mask 保证了模型只能看过去,不能看未来 (Causal)att=(q @ k.transpose(-2,-1))*(1.0/math.sqrt(k.size(-1)))att=att.masked_fill(self.bias[:,:,:T,:T]==0,float('-inf'))att=F.softmax(att,dim=-1)# 3. 聚合信息 (Scores @ V)y=att @ vreturnself.c_proj(y)🛠️ 三、 实战步骤:训练诗人
1. 准备数据 (The Fuel)
我们需要一本《全唐诗》。数据格式很简单,就是一个巨大的input.txt文件,里面塞满了诗句。
Tokenizer:对于中文,最简单的 Tokenizer 就是字级别 (Character-level)。把每个汉字映射为一个整数。
例如:
床: 102,前: 55,明: 890…Vocab Size:全唐诗常用的汉字大约 3000-5000 个。
# 读取数据withopen('tang_poems.txt','r',encoding='utf-8')asf:text=f.read()# 构建词表chars=sorted(list(set(text)))vocab_size=len(chars)stoi={ch:ifori,chinenumerate(chars)}# 字转数字itos={i:chfori,chinenumerate(chars)}# 数字转字# 编码data=torch.tensor([stoi[c]forcintext],dtype=torch.long)2. 配置模型 (The Engine)
我们要训练一个Baby GPT,参数量控制在 10M 左右,适合 T4 显卡(16GB 显存)快速跑完。
n_layer(层数): 6n_head(头数): 6n_embd(向量维度): 384block_size(上下文长度): 256 (写诗够用了)
3. 开始训练 (The Training)
将数据喂给 NanoGPT 的train.py。
python train.py config/train_shakespeare_char.py\--device=cuda\--compile=True\--eval_interval=250\--max_iters=5000\--batch_size=64你会在终端看到 Loss(损失函数)疯狂下降:
- Iter 0: Loss 10.5 (完全在瞎猜)
- Iter 1000: Loss 4.2 (学会了逗号和句号)
- Iter 3000: Loss 2.1 (学会了五言、七言格式)
- Iter 5000: Loss 1.5 (学会了对仗和押韵)
✨ 四、 见证奇迹:模型生成
训练 15 分钟后,我们让模型写首诗。
Prompt:“明月”
模型输出 (Temperature=0.8):
明月照高楼,
含光入如虚。
愁心不可转,
只有泪沾裾。
点评:
这就很离谱!这首诗在《全唐诗》里是不存在的,是模型原创的。
- “明月照高楼”:意境对了。
- “泪沾裾”:悲伤的情绪也对上了。
- 虽然逻辑经不起深推,但格式、韵律完全符合唐诗规范。
📊 五、 总结与思考
通过这个仅有 10M 参数的小模型,我们揭示了 LLM 的真相:
- 压缩即智能:模型把 40000 首唐诗“压缩”进了权重矩阵里。
- 规模法则 (Scaling Law):我们用了 10M 参数能写打油诗。如果我们把参数加到 100B,再喂给它全互联网的文本,它就能写代码、做数学、讲笑话——这就是 ChatGPT。
- 算力门槛:NanoGPT 证明了,学习 Transformer 根本不需要 A100,你的游戏本甚至 Colab 就能跑。
Next Step:
下载NanoGPT源码,把数据集换成周杰伦歌词或者金庸小说,看看你的 AI 能学会什么样的 Style!