# Train Your Own LLM from Scratch

> 来源：[HackerNews](https://github.com/angelos-p/llm-from-scratch)

```markdown
# Train Your Own LLM from Scratch：从零开始训练大语言模型的完整指南

## 背景与概述

大语言模型（LLM）已经成为当今人工智能领域最热门的技术方向之一。从 ChatGPT 到 Claude，从开源的 Llama 到国内的 ChatGLM，这些模型展现出了惊人的语言理解和生成能力。然而，对于绝大多数开发者而言，LLM 仍然是一个"黑盒"——我们调用 API，却对其内部机制一知半解；我们微调模型，却不清楚预训练阶段究竟发生了什么。

这种知识断层带来了一个核心问题：**如果我们真正理解 LLM，就应该能够从最基础的数学原理出发，亲手搭建并训练一个属于自己的模型。** 这正是 GitHub 项目 `llm-from-scratch` 的出发点。该项目在 HackerNews 社区引发了广泛讨论，它不提供封装好的训练框架，也不依赖 Hugging Face 的便捷接口，而是从最原始的 PyTorch 张量操作开始，一步步构建完整的 GPT 风格语言模型。

对于中国的 AI 开发者和研究者来说，这个项目具有特殊的价值。在国内大模型"百模大战"的背景下，真正掌握从头训练能力的工程师仍然稀缺。通过亲手实践这个项目，开发者不仅能深入理解 Transformer 架构的每一个细节，更能为后续的模型优化、架构创新和领域适配打下坚实基础。

## 核心内容

### 1. 极简依赖：纯 PyTorch 实现

与大多数 LLM 项目依赖复杂的训练框架不同，`llm-from-scratch` 坚持仅使用 PyTorch 基础功能。没有 `transformers` 库，没有 `deepspeed`，甚至没有 `accelerate`。这种"极端"的简化设计让代码的每一行都清晰可见：

```python
import torch
import torch.nn as nn
import torch.nn.functional as F

class CausalSelfAttention(nn.Module):
    def __init__(self, config):
        super().__init__()
        assert config.n_embd % config.n_head == 0
        # key, query, value projections for all heads
        self.c_attn = nn.Linear(config.n_embd, 3 * config.n_embd)
        # output projection
        self.c_proj = nn.Linear(config.n_embd, config.n_embd)
        self.n_head = config.n_head
        self.n_embd = config.n_embd
        # causal mask to ensure attention only attends to left in the input
        self.register_buffer("bias", torch.tril(torch.ones(config.block_size, config.block_size))
                                     .view(1, 1, config.block_size, config.block_size))
```

这种写法虽然冗长，但每个张量变换的维度都一目了然，非常适合学习理解。

### 2. 完整的训练流水线

项目涵盖了从数据预处理到模型训练、再到文本生成的完整流程。数据加载不依赖 `datasets` 库，而是直接处理原始文本；tokenizer 可以选择简单的字符级实现或集成 BPE（Byte Pair Encoding）；训练循环完全手写，包括梯度累积、学习率调度、损失计算等关键环节。

### 3. 可扩展的模型配置

项目提供了类似 GPT-2 系列的配置系统，从微型模型（适合 CPU 训练）到标准规模（需要 GPU 加速）均可灵活调整：

```python
@dataclass
class GPTConfig:
    block_size: int = 1024    # 最大序列长度
    vocab_size: int = 50257   # GPT-2 词表大小
    n_layer: int = 12         # Transformer 层数
    n_head: int = 12          # 注意力头数
    n_embd: int = 768         # 嵌入维度
```

开发者可以从 `block_size=64, n_layer=4, n_head=4, n_embd=128` 这样的微型配置开始，在本地笔记本上完成端到端的训练验证。

### 4. 生成策略的实现

除了训练，项目还完整实现了多种文本生成策略：贪婪解码（greedy decoding）、温度采样（temperature sampling）、Top-k 采样和 Top-p（nucleus）采样。这些策略的代码实现直接对应论文中的数学公式，帮助开发者建立从理论到实践的清晰映射。

### 5. 性能优化与生产化路径

尽管追求简洁，项目并未忽视实际训练中的关键优化。包括混合精度训练（AMP）的支持、梯度裁剪、检查点保存与恢复，以及分布式训练的基础准备。这为学习者提供了从"能跑通"到"跑得快"的平滑过渡路径。

## 技术分析

从技术架构来看，`llm-from-scratch` 严格遵循了 GPT 系列的 decoder-only 设计。其核心是堆叠的多头自注意力层（Multi-Head Self-Attention）与前馈网络（Feed-Forward Network），配合层归一化（LayerNorm）和残差连接（Residual Connection）。

**注意力机制的实现**是理解整个模型的关键。项目采用了经典的缩放点积注意力（Scaled Dot-Product Attention），并通过因果掩码（Causal Mask）确保模型在预测第 i 个 token 时只能看到前 i-1 个位置的信息。这种"从左到右"的生成约束是 GPT 作为自回归语言模型的本质特征。

在**位置编码**方面，项目使用了可学习的位置嵌入（Learnable Positional Embeddings），而非原始的三角函数式绝对位置编码，也非后来流行的 RoPE（旋转位置编码）。这种选择简化了代码，但在处理超长序列时可能表现不佳——这也是学习者可以自行探索改进的方向。

**训练目标**采用标准的下一 token 预测（Next Token Prediction），即语言建模损失。数学上，这等价于最大化训练数据的对数似然：

$$\mathcal{L} = -\sum_{i} \log P(x_i | x_{<i}; \theta)$$

项目代码直接对应了这一公式，交叉熵损失的计算清晰透明。

一个值得注意的技术细节是**权重初始化**。GPT-2 采用了一种特殊的初始化策略：在残差连接的分支输出处，权重矩阵按层数深度的平方根进行缩放。这种技巧对训练深层 Transformer 的稳定性至关重要，项目中也忠实地实现了这一点。

## 实践建议

对于希望跟随这个项目实践的开发者，我建议采用**分阶段递进**的学习路径：

**第一阶段：通读代码，建立直觉（1-2 天）**
不要急于运行，先完整阅读项目的主文件，理解模块间的调用关系。可以配合绘制架构图，标注每个张量的形状变化。

**第二阶段：微型模型验证（2-3 天）**
使用最小配置在本地 CPU 上训练。选择一个极小的文本数据集（如莎士比亚戏剧、中文古诗词），观察模型如何从随机输出逐渐学习到语法结构和主题一致性。

```python
# 推荐起步配置
config = GPTConfig(
    block_size=64,
    vocab_size=100,  # 字符级词表可很小
    n_layer=4,
    n_head=4,
    n_embd=128
)
```

**第三阶段：扩展实验（1-2 周）**
迁移到 GPU 环境，尝试更大的模型和数据集。可以对比不同超参数的影响：注意力头数的变化、层归一化位置的选择（Pre-Norm vs Post-Norm）、学习率调度的差异等。

**第四阶段：自主改进**
在理解基础实现后，可以尝试集成现代优化技术：将位置编码替换为 RoPE、实现 Flash Attention 加速、添加 LoRA 支持以便后续微调等。这些改进本身就是很好的技术博客素材。

**环境准备提示**：国内开发者可以优先使用阿里云 PAI、AutoDL 等平台的 GPU 实例，或申请高校/企业的计算资源。数据集方面，可以尝试中文 Wikipedia 语料、悟道开源数据集等。

## 总结

`llm-from-scratch` 的价值不在于它提供了一个"最先进"的模型——恰恰相反，它的模型规模和能力远不及商业产品。其真正意义在于**祛魅**：它将 LLM 从云端拉回到本地，从黑盒还原为白盒，让每个有基础的开发者都能亲手触摸到这项技术的本质。在 AI 技术快��迭代、框架日益复杂的今天，这种回归底层的实践精神尤为珍贵。对于中国的 AI 从业者而言，深入理解这些基础原理，不仅是个人技术成长的必经之路，更是在大模型竞赛中实现真正创新的根基。毕竟，能够训练 GPT-2 的人，才更有可能设计出 GPT-4 之后的新架构。
```