Skip to content

Ada2pro/ai_coding

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AI Coding: 从零手搓小模型学习路线图

这是一个用于个人 AI 学习的代码库。目标不是一开始就做出很大的模型,而是通过自己实现核心组件,理解一个模型从网络结构、前向传播、反向传播、优化器,到预训练、后训练、评估和迭代的完整过程。

项目目标

  1. 用尽量少的依赖理解深度学习的基本机制。
  2. 从零实现一个可训练的小型神经网络框架。
  3. 实现一个小型 Transformer 语言模型。
  4. 完成一个小规模预训练流程。
  5. 尝试基础后训练方法,例如指令微调或偏好优化。
  6. 建立评估体系,根据结果迭代模型和训练策略。

总体原则

  • 先理解,再调库:核心概念优先手写,工程效率部分可以逐步引入 PyTorch。
  • 先小后大:先在玩具数据上跑通,再扩展到真实文本数据。
  • 每一步都要可验证:每个模块都配最小测试或可视化结果。
  • 避免一开始追求 SOTA:重点是掌握训练系统的完整闭环。

推荐目录结构

ai_coding/
├── README.md
├── notes/                 # 论文和学习笔记
├── data/                  # 小型数据集和预处理脚本
├── tinygrad/              # 手写自动求导和基础神经网络组件
├── models/                # MLP、RNN、Transformer 等模型实现
├── training/              # 训练循环、优化器、调度器、checkpoint
├── evaluation/            # loss、perplexity、生成质量等评估脚本
├── experiments/           # 实验配置和结果记录
└── tests/                 # 单元测试

阶段 0:准备基础环境

目标:搭好最小开发环境,明确学习记录方式。

要做的事情:

  • 安装 Python、NumPy、PyTorch、pytest、matplotlib、tqdm。
  • 建立 notes/,每篇论文或教程写一份简短笔记。
  • 建立 experiments/,记录每次实验的配置、loss 曲线、结论。
  • 建立最小测试命令,例如 pytest tests/

建议先实现:

  • 一个 hello_numpy.py,熟悉矩阵乘法、广播、随机初始化。
  • 一个 plot_loss.py,后续用于画训练曲线。

阶段 1:用 NumPy 实现基础神经网络

目标:理解前向传播、损失函数、反向传播和梯度下降。

要实现的模块:

  • Tensor 或简单参数容器。
  • 线性层 Linear
  • 激活函数:ReLU、Sigmoid、Tanh。
  • 损失函数:MSE、Cross Entropy。
  • 优化器:SGD、Momentum。
  • 训练循环:forward、loss、backward、step、zero_grad。

建议任务:

  1. 用线性回归拟合一条直线。
  2. 用 MLP 拟合 XOR。
  3. 在 MNIST 或 sklearn digits 上训练一个分类器。

验收标准:

  • loss 能稳定下降。
  • 手写梯度和数值梯度检查结果接近。
  • 能解释每一层参数的 shape 和梯度来源。

推荐阅读:

  • Michael Nielsen, Neural Networks and Deep Learning
  • Rumelhart, Hinton, Williams, Learning representations by back-propagating errors

阶段 2:实现自动求导引擎

目标:不再为每一层手写 backward,而是实现一个迷你 autograd。

要实现的模块:

  • ValueTensor 计算节点。
  • 计算图记录。
  • 拓扑排序。
  • 自动反向传播。
  • 基础算子:加、减、乘、除、幂、矩阵乘法、sum、mean、exp、log。

建议任务:

  1. 先实现标量版 autograd。
  2. 再扩展到 NumPy ndarray。
  3. 用 autograd 重写阶段 1 的 MLP。

验收标准:

  • 支持链式求导。
  • 支持多分支计算图。
  • 梯度检查通过。
  • 能训练一个小 MLP。

推荐阅读:

  • Andrej Karpathy, micrograd
  • Baydin et al., Automatic Differentiation in Machine Learning: a Survey

阶段 3:实现训练系统基础设施

目标:把单次训练脚本整理成可复用的训练框架。

要实现的模块:

  • DatasetDataLoader
  • 训练循环 Trainer
  • checkpoint 保存和加载。
  • 日志记录:loss、accuracy、learning rate。
  • 学习率调度:constant、warmup、cosine decay。
  • 优化器:Adam、AdamW。

建议任务:

  1. 用统一训练循环训练 MLP。
  2. 支持从 checkpoint 恢复训练。
  3. 对比 SGD、Momentum、Adam、AdamW 的收敛速度。

验收标准:

  • 同一个训练入口可以切换模型、数据集和优化器。
  • 中断训练后可以恢复。
  • 实验结果可以复现。

推荐阅读:

  • Kingma, Ba, Adam: A Method for Stochastic Optimization
  • Loshchilov, Hutter, Decoupled Weight Decay Regularization

阶段 4:进入语言模型:Tokenizer 和数据管线

目标:理解文本如何变成模型可训练的 token 序列。

要实现的模块:

  • 字符级 tokenizer。
  • 简单 BPE tokenizer。
  • 文本清洗和切分。
  • next-token prediction 数据集。
  • batch 构造:input_idslabels

建议任务:

  1. 先用字符级 tokenizer 训练一个 tiny Shakespeare 模型。
  2. 再实现或接入 BPE tokenizer。
  3. 统计 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

阶段 5:实现小型 Transformer 语言模型

目标:从零实现一个 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。

建议任务:

  1. 实现单层单头 attention,并检查 mask 是否正确。
  2. 扩展到多头 attention。
  3. 堆叠多个 Transformer block。
  4. 在小文本数据上做 next-token prediction。
  5. 实现文本生成并观察不同采样参数的效果。

验收标准:

  • 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

阶段 6:小规模预训练

目标:完整跑通一个小语言模型的预训练流程。

要实现的模块:

  • 数据集下载和清洗脚本。
  • 训练配置文件。
  • checkpoint 自动保存。
  • validation loss 评估。
  • perplexity 计算。
  • 简单实验追踪。

建议任务:

  1. 选一个小型文本数据集,例如 tiny Shakespeare、WikiText-2 或自建中文小语料。
  2. 训练一个非常小的 GPT,例如 2 到 6 层、hidden size 128 到 384。
  3. 记录不同模型规模、学习率、batch size、context length 对 loss 的影响。

验收标准:

  • 能完成一次从数据预处理到模型生成的完整流程。
  • 有训练曲线和验证集 loss。
  • 能从实验结果判断下一步应该调什么。

推荐阅读:

  • Kaplan et al., Scaling Laws for Neural Language Models
  • Hoffmann et al., Training Compute-Optimal Large Language Models

阶段 7:基础后训练

目标:理解预训练模型如何被调整成更符合任务或指令的数据分布。

要实现的模块:

  • 指令数据格式:instructioninputoutput
  • supervised fine-tuning 训练脚本。
  • 简单 prompt 模板。
  • 生成结果评估脚本。
  • 可选:LoRA 微调。

建议任务:

  1. 构造一个很小的指令数据集,例如问答、摘要、格式转换。
  2. 在预训练 checkpoint 上做 supervised fine-tuning。
  3. 对比微调前后的生成结果。
  4. 如果基础稳定,再研究偏好优化。

验收标准:

  • 模型能学会特定格式的输出。
  • 微调后通用生成能力没有明显崩坏。
  • 有一组固定 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

阶段 8:评估和迭代

目标:建立判断模型是否变好的标准,而不是只凭感觉看生成文本。

要实现的模块:

  • validation loss。
  • perplexity。
  • 固定 prompt 生成对比。
  • 简单任务集评估。
  • 错误案例记录。
  • 实验报告模板。

建议任务:

  1. 每次训练都保存配置、指标和样例输出。
  2. 固定一批 prompts,比较不同 checkpoint 的输出。
  3. 记录失败案例,例如重复、胡说、格式不稳定、不会结束。
  4. 根据失败类型决定下一轮改数据、模型还是训练参数。

验收标准:

  • 每个模型版本都有清晰记录。
  • 能回答“这次改动到底有没有变好”。
  • 能基于评估结果提出下一轮实验假设。

推荐阅读:

  • 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

推荐实现顺序

  1. tinygrad/value.py:标量自动求导。
  2. tinygrad/tensor.py:ndarray 自动求导。
  3. tinygrad/nn.py:Linear、激活函数、MLP。
  4. training/optim.py:SGD、Momentum、AdamW。
  5. training/trainer.py:统一训练循环。
  6. data/tokenizer.py:字符级 tokenizer。
  7. data/lm_dataset.py:next-token prediction 数据集。
  8. models/transformer.py:GPT 风格模型。
  9. training/pretrain.py:预训练入口。
  10. training/sft.py:指令微调入口。
  11. evaluation/eval_lm.py:loss、perplexity、样例生成。

每次实验应该记录什么

实验名称:
日期:
代码版本:
数据集:
模型配置:
训练配置:
最终 train loss:
最终 validation loss:
样例输出:
主要问题:
下一步计划:

当前最小里程碑

第一个可完成目标:

用 NumPy 实现一个可以训练 XOR 的 MLP,并通过数值梯度检查确认反向传播正确。

完成这个目标后,再进入自动求导和 Transformer。这样可以避免一开始就被大模型工程细节淹没,同时能把最关键的训练原理真正吃透。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages