
在深度学习框架主导的今天,PyTorch 和 TensorFlow 几乎成了构建神经网络的默认选择。但你是否想过:如果不用任何现成框架,只靠基础线性代数,能否自己实现一个完整的 Transformer 模型?
Rust LLM from Scratch 正是这样一个项目——它使用 纯 Rust 实现了一个具备预训练与指令微调能力的语言模型,仅依赖 ndarray 进行矩阵运算,不引入任何外部机器学习库。

这不是为了替代主流框架,而是为了回答一个问题:
“大语言模型的底层,到底是怎么跑起来的?”
它是什么?一个教学导向的“透明盒子”
这个项目的核心目标不是性能或规模,而是可理解性。
通过从头编写前向传播、反向传播、注意力机制和训练流程,作者完整展示了现代语言模型的关键组件是如何协同工作的。
你可以看到:
- 权重如何初始化
- 梯度如何逐层反传
- 注意力分数如何计算
- 文本如何一步步生成
所有代码都在你的掌控之中,没有隐藏的 C++ 内核或自动微分黑盒。
✅ 适合人群:想深入理解 Transformer 架构、反向传播机制和模型训练流程的开发者与学习者。
它不是什么?明确边界
需要强调的是:
❌ 这不是一个生产级模型
❌ 不支持百亿参数或长上下文推理
❌ 无法与 GPT、Llama 等商用模型竞争性能
它是一个玩具级实现(toy implementation),但在教育意义上极具价值。正如编译器课程中手写递归下降解析器一样,它的意义在于“亲手造轮子”,而非实际部署。
核心架构概览
模型结构
- 词汇量:动态构建(基于训练数据)
- 嵌入维度:128
- 隐藏层维度:256
- 最大序列长度:80 tokens
- 主干架构:3 层 Transformer 块(含自注意力 + FFN + LayerNorm)
- 输出头:线性投影 + softmax
训练流程
分为两个阶段:
1. 预训练(Pretraining)
任务:根据上文预测下一个词
数据示例:
"太阳从东方升起,在西方落下"
"水因重力向下流动"
"山脉是高大且岩石构成的地貌"
目标:让模型掌握基本事实知识和语法结构。
2. 指令微调(Instruction Tuning)
任务:模拟对话响应
数据示例:
用户:山脉是如何形成的?
助手:山脉通过构造力形成……
目标:使模型学会遵循指令、回应问候、处理追问。
技术实现亮点
🔧 纯 Rust 实现,仅依赖少量库
| 依赖 | 用途 |
|---|---|
ndarray | N 维数组与矩阵运算 |
rand / rand_distr | 参数初始化(正态分布) |
⚠️ 不使用 PyTorch、TensorFlow、Candle 或任何自动微分框架 —— 所有梯度手动推导并实现。
📐 自定义模块化设计
各组件职责清晰,接口统一:
trait Module {
fn forward(&self, x: &Array) -> Array;
fn backward(&mut self, grad: &Array) -> Array;
}
目前已实现:
- Embedding 层
- Linear 层
- Layer Normalization
- Self-Attention(单头)
- Feed-Forward Network
- CrossEntropyLoss with LogSoftmax
⚙️ 完整训练栈支持
- 优化器:Adam(手动实现)
- 梯度裁剪:L2 范数上限设为 5.0,防止爆炸
- 学习率:
- 预训练:0.0005(100 epochs)
- 微调:0.0001(100 epochs)
- 解码策略:贪婪解码(greedy decoding)
🧪 全面测试覆盖
关键数学操作均有单元测试验证,例如:
- 矩阵乘法梯度正确性
- LayerNorm 数值稳定性
- Attention 输出范围
- Loss 函数对称性
确保每一步变换都符合预期。
当前局限与未来方向
虽然功能完整,但仍有明显限制:
❌ 当前不足
- 所有参数驻留内存,不支持持久化(无法保存/加载模型)
- 使用单头注意力,缺乏位置编码(影响长程依赖建模)
- 解码方式仅为贪婪搜索,缺乏多样性
- 批处理大小为 1,训练效率低
高优先级改进计划
该项目采用开放协作模式,非常适合 Rust 初学者和系统编程爱好者参与。以下是社区关注的重点方向:
| 优先级 | 改进项 | 推荐难度 |
|---|---|---|
| 🏪 模型持久化 | 实现 save/load 参数到磁盘(JSON 或 bincode) | 🔼 初学者 |
| ⚡ 性能优化 | 引入 SIMD 加速、并行训练、减少内存拷贝 | 🔥 中级 |
| 🎯 采样增强 | 添加 top-k、top-p、温度控制、束搜索 | 🔥 中级 |
| 📊 训练可视化 | 输出 loss 曲线、准确率、困惑度指标 | 🔼 初学者 |
| 🧭 位置编码 | 实现 RoPE 或绝对位置嵌入 | 🔥 中级 |
| 🧠 多头注意力 | 扩展为多头结构,提升表达能力 | ⚡ 高级 |
| 🔁 优化器扩展 | 支持学习率调度、权重衰减、其他优化算法 | ⚡ 高级 |
为什么值得一看?
如果你希望真正理解以下问题,这个项目非常值得一读:
- 反向传播在代码中到底长什么样?
- Transformer 的每一层梯度是如何传递的?
- Adam 优化器是如何一步步更新参数的?
- 模型是如何从一串字符变成概率分布并生成文本的?
这些问题的答案,在大多数框架中都被封装得太深。而在这里,每一行梯度计算都写给你看。
数据统计
相关导航


Refly

FlowGram.AI

Magentic-UI

MCP Containers

Stax

YouMind






