从零训练一个小参数模型 (SLM):用 NanoGPT 训练一个能写唐诗的 10M 模型,搞懂 Transformer 底层原理
2026/4/29 8:59:37 网站建设 项目流程

🤯 前言:为什么要自己训练?

你可能觉得:“调用 API 不就好了吗?”
但是,会调用 API 只能让你成为 AI 的用户,会训练模型才能让你成为 AI 的主人。
通过亲手写下Self-Attention的代码,看着 Loss 曲线下降,看着模型从输出乱码到输出“床前明月光”,这种去魅的过程是任何理论课都给不了的。

我们将使用NanoGPT—— 这是前 Tesla AI 总监 Karpathy 写的最简单的 Transformer 实现,代码极度干净,是学习 LLM 的圣经。


🏗️ 一、 架构拆解:GPT 是怎么工作的?

GPT (Generative Pre-trained Transformer) 的本质就是一个**“文字接龙机器”**。
给定前文,预测下一个字。

它的核心引擎是Transformer Decoder。我们可以把它看作一个多层的“汉堡包”。

模型架构图 (Mermaid):

Transformer Block (重复 N 次)

1. Tokenization
2. Embedding
3. LayerNorm
4. Self-Attention

残差连接 (Add)

5. LayerNorm
6. FeedForward

残差连接 (Add)

7. Linear Head
8. Softmax

输入文字 (Input)

数字序列 (Indices)

词向量 + 位置编码

LayerNorm

多头自注意力 (MSA)

+

LayerNorm

前馈神经网络 (MLP)

+

输出概率分布

预测下一个字


🧪 二、 核心原理:自注意力机制 (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(层数): 6
  • n_head(头数): 6
  • n_embd(向量维度): 384
  • block_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 的真相:

  1. 压缩即智能:模型把 40000 首唐诗“压缩”进了权重矩阵里。
  2. 规模法则 (Scaling Law):我们用了 10M 参数能写打油诗。如果我们把参数加到 100B,再喂给它全互联网的文本,它就能写代码、做数学、讲笑话——这就是 ChatGPT。
  3. 算力门槛:NanoGPT 证明了,学习 Transformer 根本不需要 A100,你的游戏本甚至 Colab 就能跑。

Next Step:
下载NanoGPT源码,把数据集换成周杰伦歌词或者金庸小说,看看你的 AI 能学会什么样的 Style!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询