这是一个用于个人 AI 学习的代码库。目标不是一开始就做出很大的模型,而是通过自己实现核心组件,理解一个模型从网络结构、前向传播、反向传播、优化器,到预训练、后训练、评估和迭代的完整过程。
- 用尽量少的依赖理解深度学习的基本机制。
- 从零实现一个可训练的小型神经网络框架。
- 实现一个小型 Transformer 语言模型。
- 完成一个小规模预训练流程。
- 尝试基础后训练方法,例如指令微调或偏好优化。
- 建立评估体系,根据结果迭代模型和训练策略。
- 先理解,再调库:核心概念优先手写,工程效率部分可以逐步引入 PyTorch。
- 先小后大:先在玩具数据上跑通,再扩展到真实文本数据。
- 每一步都要可验证:每个模块都配最小测试或可视化结果。
- 避免一开始追求 SOTA:重点是掌握训练系统的完整闭环。
ai_coding/
├── README.md
├── notes/ # 论文和学习笔记
├── data/ # 小型数据集和预处理脚本
├── tinygrad/ # 手写自动求导和基础神经网络组件
├── models/ # MLP、RNN、Transformer 等模型实现
├── training/ # 训练循环、优化器、调度器、checkpoint
├── evaluation/ # loss、perplexity、生成质量等评估脚本
├── experiments/ # 实验配置和结果记录
└── tests/ # 单元测试
目标:搭好最小开发环境,明确学习记录方式。
要做的事情:
- 安装 Python、NumPy、PyTorch、pytest、matplotlib、tqdm。
- 建立
notes/,每篇论文或教程写一份简短笔记。 - 建立
experiments/,记录每次实验的配置、loss 曲线、结论。 - 建立最小测试命令,例如
pytest tests/。
建议先实现:
- 一个
hello_numpy.py,熟悉矩阵乘法、广播、随机初始化。 - 一个
plot_loss.py,后续用于画训练曲线。
目标:理解前向传播、损失函数、反向传播和梯度下降。
要实现的模块:
Tensor或简单参数容器。- 线性层
Linear。 - 激活函数:ReLU、Sigmoid、Tanh。
- 损失函数:MSE、Cross Entropy。
- 优化器:SGD、Momentum。
- 训练循环:forward、loss、backward、step、zero_grad。
建议任务:
- 用线性回归拟合一条直线。
- 用 MLP 拟合 XOR。
- 在 MNIST 或 sklearn digits 上训练一个分类器。
验收标准:
- loss 能稳定下降。
- 手写梯度和数值梯度检查结果接近。
- 能解释每一层参数的 shape 和梯度来源。
推荐阅读:
- Michael Nielsen,
Neural Networks and Deep Learning - Rumelhart, Hinton, Williams,
Learning representations by back-propagating errors
目标:不再为每一层手写 backward,而是实现一个迷你 autograd。
要实现的模块:
Value或Tensor计算节点。- 计算图记录。
- 拓扑排序。
- 自动反向传播。
- 基础算子:加、减、乘、除、幂、矩阵乘法、sum、mean、exp、log。
建议任务:
- 先实现标量版 autograd。
- 再扩展到 NumPy ndarray。
- 用 autograd 重写阶段 1 的 MLP。
验收标准:
- 支持链式求导。
- 支持多分支计算图。
- 梯度检查通过。
- 能训练一个小 MLP。
推荐阅读:
- Andrej Karpathy,
micrograd - Baydin et al.,
Automatic Differentiation in Machine Learning: a Survey
目标:把单次训练脚本整理成可复用的训练框架。
要实现的模块:
Dataset和DataLoader。- 训练循环
Trainer。 - checkpoint 保存和加载。
- 日志记录:loss、accuracy、learning rate。
- 学习率调度:constant、warmup、cosine decay。
- 优化器:Adam、AdamW。
建议任务:
- 用统一训练循环训练 MLP。
- 支持从 checkpoint 恢复训练。
- 对比 SGD、Momentum、Adam、AdamW 的收敛速度。
验收标准:
- 同一个训练入口可以切换模型、数据集和优化器。
- 中断训练后可以恢复。
- 实验结果可以复现。
推荐阅读:
- Kingma, Ba,
Adam: A Method for Stochastic Optimization - Loshchilov, Hutter,
Decoupled Weight Decay Regularization
目标:理解文本如何变成模型可训练的 token 序列。
要实现的模块:
- 字符级 tokenizer。
- 简单 BPE tokenizer。
- 文本清洗和切分。
- next-token prediction 数据集。
- batch 构造:
input_ids和labels。
建议任务:
- 先用字符级 tokenizer 训练一个 tiny Shakespeare 模型。
- 再实现或接入 BPE tokenizer。
- 统计 token 频率、序列长度分布、压缩率。
验收标准:
- 能把文本编码成 token,再解码回文本。
- 能生成语言模型训练 batch。
- 能解释 vocabulary size、context length、batch size 的关系。
推荐阅读:
- Sennrich, Haddow, Birch,
Neural Machine Translation of Rare Words with Subword Units - Kudo, Richardson,
SentencePiece: A simple and language independent subword tokenizer
目标:从零实现一个 GPT 风格的小型 decoder-only Transformer。
要实现的模块:
- Token embedding。
- Position embedding。
- LayerNorm。
- Multi-Head Causal Self-Attention。
- Feed Forward Network。
- Residual connection。
- Transformer block。
- GPT 模型主体。
- 生成函数:greedy、temperature、top-k、top-p。
建议任务:
- 实现单层单头 attention,并检查 mask 是否正确。
- 扩展到多头 attention。
- 堆叠多个 Transformer block。
- 在小文本数据上做 next-token prediction。
- 实现文本生成并观察不同采样参数的效果。
验收标准:
- causal mask 能阻止模型看到未来 token。
- 训练 loss 能下降。
- 生成文本从随机乱码逐步变得有局部结构。
- 能解释参数量如何由层数、hidden size、head 数、vocab size 决定。
推荐阅读:
- Vaswani et al.,
Attention Is All You Need - Radford et al.,
Improving Language Understanding by Generative Pre-Training - Brown et al.,
Language Models are Few-Shot Learners
目标:完整跑通一个小语言模型的预训练流程。
要实现的模块:
- 数据集下载和清洗脚本。
- 训练配置文件。
- checkpoint 自动保存。
- validation loss 评估。
- perplexity 计算。
- 简单实验追踪。
建议任务:
- 选一个小型文本数据集,例如 tiny Shakespeare、WikiText-2 或自建中文小语料。
- 训练一个非常小的 GPT,例如 2 到 6 层、hidden size 128 到 384。
- 记录不同模型规模、学习率、batch size、context length 对 loss 的影响。
验收标准:
- 能完成一次从数据预处理到模型生成的完整流程。
- 有训练曲线和验证集 loss。
- 能从实验结果判断下一步应该调什么。
推荐阅读:
- Kaplan et al.,
Scaling Laws for Neural Language Models - Hoffmann et al.,
Training Compute-Optimal Large Language Models
目标:理解预训练模型如何被调整成更符合任务或指令的数据分布。
要实现的模块:
- 指令数据格式:
instruction、input、output。 - supervised fine-tuning 训练脚本。
- 简单 prompt 模板。
- 生成结果评估脚本。
- 可选:LoRA 微调。
建议任务:
- 构造一个很小的指令数据集,例如问答、摘要、格式转换。
- 在预训练 checkpoint 上做 supervised fine-tuning。
- 对比微调前后的生成结果。
- 如果基础稳定,再研究偏好优化。
验收标准:
- 模型能学会特定格式的输出。
- 微调后通用生成能力没有明显崩坏。
- 有一组固定 prompts 用于回归测试。
推荐阅读:
- Ouyang et al.,
Training language models to follow instructions with human feedback - Hu et al.,
LoRA: Low-Rank Adaptation of Large Language Models - Rafailov et al.,
Direct Preference Optimization: Your Language Model is Secretly a Reward Model
目标:建立判断模型是否变好的标准,而不是只凭感觉看生成文本。
要实现的模块:
- validation loss。
- perplexity。
- 固定 prompt 生成对比。
- 简单任务集评估。
- 错误案例记录。
- 实验报告模板。
建议任务:
- 每次训练都保存配置、指标和样例输出。
- 固定一批 prompts,比较不同 checkpoint 的输出。
- 记录失败案例,例如重复、胡说、格式不稳定、不会结束。
- 根据失败类型决定下一轮改数据、模型还是训练参数。
验收标准:
- 每个模型版本都有清晰记录。
- 能回答“这次改动到底有没有变好”。
- 能基于评估结果提出下一轮实验假设。
推荐阅读:
- Papineni et al.,
BLEU: a Method for Automatic Evaluation of Machine Translation - Lin,
ROUGE: A Package for Automatic Evaluation of Summaries - Zheng et al.,
Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena
tinygrad/value.py:标量自动求导。tinygrad/tensor.py:ndarray 自动求导。tinygrad/nn.py:Linear、激活函数、MLP。training/optim.py:SGD、Momentum、AdamW。training/trainer.py:统一训练循环。data/tokenizer.py:字符级 tokenizer。data/lm_dataset.py:next-token prediction 数据集。models/transformer.py:GPT 风格模型。training/pretrain.py:预训练入口。training/sft.py:指令微调入口。evaluation/eval_lm.py:loss、perplexity、样例生成。
实验名称:
日期:
代码版本:
数据集:
模型配置:
训练配置:
最终 train loss:
最终 validation loss:
样例输出:
主要问题:
下一步计划:
第一个可完成目标:
用 NumPy 实现一个可以训练 XOR 的 MLP,并通过数值梯度检查确认反向传播正确。
完成这个目标后,再进入自动求导和 Transformer。这样可以避免一开始就被大模型工程细节淹没,同时能把最关键的训练原理真正吃透。