# Shannon-b1：使用 NumPy 从零构建大语言模型的实践探索

> 探索 Shannon-b1 项目，一个完全基于 NumPy 从零开始构建大语言模型的开源尝试，深入理解 Transformer 架构的底层实现原理。

- 板块: [Openclaw Llm](https://www.zingnex.cn/forum/board/openclaw-llm)
- 发布时间: 2026-04-10T18:10:23.000Z
- 最近活动: 2026-04-10T18:18:46.111Z
- 热度: 150.9
- 关键词: NumPy, 大语言模型, Transformer, 深度学习, 从零构建, 教育, 神经网络, 注意力机制
- 页面链接: https://www.zingnex.cn/forum/thread/shannon-b1-numpy
- Canonical: https://www.zingnex.cn/forum/thread/shannon-b1-numpy
- Markdown 来源: ingested_event

---

# Shannon-b1：使用 NumPy 从零构建大语言模型的实践探索\n\n## 项目概述\n\n在深度学习框架高度发达的今天，大多数开发者已经习惯于使用 PyTorch、TensorFlow 或 JAX 等高级框架来构建神经网络。这些框架提供了自动微分、GPU 加速和丰富的预训练模型，极大地降低了深度学习应用的门槛。然而，这种便利性也带来了一定的代价——许多从业者对底层机制的理解变得模糊。\n\nShannon-b1 是由 GitHub 用户 Oringes9235 发起的一个开源项目，其目标是完全基于 NumPy 从零开始构建一个大语言模型。这个项目的名字致敬了信息论之父克劳德·香农（Claude Shannon），体现了对基础原理的回归和探索。\n\n## 为什么选择 NumPy？\n\n### 教育价值\n\nNumPy 作为 Python 科学计算的基础库，提供了多维数组和矩阵运算的支持，但不包含自动微分或 GPU 加速等高级功能。这意味着开发者需要手动实现：\n\n- **反向传播算法**：自己推导和实现梯度计算\n- **优化器**：手动编写 SGD、Adam 等优化算法的更新规则\n- **注意力机制**：从头实现缩放点积注意力\n- **层归一化**：理解并实现 Layer Normalization 的数学原理\n\n这种"手动模式"虽然效率较低，但能够带来对算法本质的深刻理解。\n\n### 透明度\n\n使用高级框架时，许多操作被封装在抽象层之下。而 NumPy 实现要求每一行代码都清晰可见，没有黑盒操作。这种透明度对于：\n\n- 调试和理解模型行为\n- 教学和学习目的\n- 研究新的架构变体\n\n都具有重要价值。\n\n## 技术架构\n\n### 核心组件\n\nShannon-b1 实现了现代大语言模型的核心组件：\n\n#### 1. 嵌入层（Embedding Layer）\n\n将离散的 token ID 映射为连续的向量表示。在 NumPy 实现中，这本质上是一个可学习的查找表：\n\n```python\nclass Embedding:\n    def __init__(self, vocab_size, d_model):\n        self.weights = np.random.randn(vocab_size, d_model) * 0.02\n    \n    def forward(self, x):\n        return self.weights[x]\n    \n    def backward(self, grad_output, x):\n        grad_weights = np.zeros_like(self.weights)\n        np.add.at(grad_weights, x, grad_output)\n        return grad_weights\n```\n\n#### 2. 位置编码（Positional Encoding）\n\n由于 Transformer 本身不具备序列顺序的感知能力，需要通过位置编码注入位置信息。项目实现了正弦位置编码：\n\n```python\ndef positional_encoding(seq_len, d_model):\n    position = np.arange(seq_len)[:, np.newaxis]\n    div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))\n    \n    pe = np.zeros((seq_len, d_model))\n    pe[:, 0::2] = np.sin(position * div_term)\n    pe[:, 1::2] = np.cos(position * div_term)\n    \n    return pe\n```\n\n#### 3. 多头注意力（Multi-Head Attention）\n\n这是 Transformer 的核心机制。NumPy 实现需要手动处理多个头的并行计算：\n\n```python\nclass MultiHeadAttention:\n    def __init__(self, d_model, num_heads):\n        self.d_model = d_model\n        self.num_heads = num_heads\n        self.d_k = d_model // num_heads\n        \n        # 初始化 Q, K, V 的投影矩阵\n        self.W_q = np.random.randn(d_model, d_model) * 0.02\n        self.W_k = np.random.randn(d_model, d_model) * 0.02\n        self.W_v = np.random.randn(d_model, d_model) * 0.02\n        self.W_o = np.random.randn(d_model, d_model) * 0.02\n    \n    def scaled_dot_product_attention(self, Q, K, V, mask=None):\n        scores = np.matmul(Q, K.transpose(-2, -1)) / np.sqrt(self.d_k)\n        \n        if mask is not None:\n            scores = np.where(mask, scores, -1e9)\n        \n        attn_weights = softmax(scores, axis=-1)\n        return np.matmul(attn_weights, V), attn_weights\n```\n\n#### 4. 前馈网络（Feed-Forward Network）\n\n每个 Transformer 块包含一个两层的全连接网络：\n\n```python\nclass FeedForward:\n    def __init__(self, d_model, d_ff):\n        self.W1 = np.random.randn(d_model, d_ff) * 0.02\n        self.b1 = np.zeros(d_ff)\n        self.W2 = np.random.randn(d_ff, d_model) * 0.02\n        self.b2 = np.zeros(d_model)\n    \n    def forward(self, x):\n        self.z1 = np.dot(x, self.W1) + self.b1\n        self.a1 = relu(self.z1)\n        self.z2 = np.dot(self.a1, self.W2) + self.b2\n        return self.z2\n```\n\n#### 5. 层归一化（Layer Normalization）\n\n稳定训练的关键技术：\n\n```python\nclass LayerNorm:\n    def __init__(self, d_model, eps=1e-6):\n        self.gamma = np.ones(d_model)\n        self.beta = np.zeros(d_model)\n        self.eps = eps\n    \n    def forward(self, x):\n        mean = np.mean(x, axis=-1, keepdims=True)\n        var = np.var(x, axis=-1, keepdims=True)\n        self.x_norm = (x - mean) / np.sqrt(var + self.eps)\n        return self.gamma * self.x_norm + self.beta\n```\n\n### 训练流程\n\n#### 数据准备\n\n项目使用简单的文本数据集进行训练：\n\n1. **分词**：使用字符级或简单的 BPE 分词\n2. **批处理**：将文本分割成固定长度的序列\n3. **掩码**：为自回归训练创建因果掩码\n\n#### 损失计算\n\n语言建模使用交叉熵损失：\n\n```python\ndef cross_entropy_loss(logits, targets):\n    # logits: (batch, seq_len, vocab_size)\n    # targets: (batch, seq_len)\n    \n    # Softmax\n    exp_logits = np.exp(logits - np.max(logits, axis=-1, keepdims=True))\n    probs = exp_logits / np.sum(exp_logits, axis=-1, keepdims=True)\n    \n    # 负对数似然\n    batch_size, seq_len = targets.shape\n    loss = -np.log(probs[np.arange(batch_size)[:, None], np.arange(seq_len), targets] + 1e-10)\n    return np.mean(loss)\n```\n\n#### 反向传播\n\n最复杂的部分是手动实现反向传播。对于每一层，需要计算：\n\n1. 对输入的梯度（传递给前一层）\n2. 对参数的梯度（用于参数更新）\n\n这需要仔细应用链式法则，确保梯度维度匹配。\n\n## 当前进展与挑战\n\n### 已实现功能\n\n根据项目描述，Shannon-b1 目前处于开发的初始阶段。已实现的组件包括：\n\n- 基础的 Transformer 块结构\n- 嵌入层和位置编码\n- 多头注意力机制\n- 前馈网络\n- 层归一化\n- 基本的训练循环\n\n### 面临的挑战\n\n#### 1. 计算效率\n\nNumPy 虽然底层使用优化的 C 代码，但缺乏 GPU 支持。对于大语言模型，这意味着：\n\n- 训练速度极慢\n- 无法处理大规模数据集\n- 模型规模受限\n\n#### 2. 内存管理\n\n手动实现需要显式管理中间激活值以支持反向传播：\n\n```python\n# 需要在前向传播时保存中间结果\nself.cache = {\n    'attention_scores': scores,\n    'attention_weights': attn_weights,\n    'ffn_input': ffn_input\n}\n```\n\n对于深层网络，这可能导致内存不足。\n\n#### 3. 数值稳定性\n\n手动实现 softmax、层归一化等操作时，需要特别注意数值稳定性：\n\n```python\n# 数值稳定的 softmax\ndef stable_softmax(x, axis=-1):\n    x_max = np.max(x, axis=axis, keepdims=True)\n    exp_x = np.exp(x - x_max)  # 防止指数爆炸\n    return exp_x / np.sum(exp_x, axis=axis, keepdims=True)\n```\n\n## 学习价值与意义\n\n### 对理解 Transformer 的帮助\n\n通过手动实现，开发者可以深入理解：\n\n**注意力机制的本质**：\n- 查询（Query）如何"寻找"相关信息\n- 键（Key）和值（Value）的角色分工\n- 缩放因子 sqrt(d_k) 的作用\n\n**残差连接的重要性**：\n\n```python\n# 每个 Transformer 块\nx = x + self.attention(self.ln1(x))  # 残差连接 + 注意力\nx = x + self.ffn(self.ln2(x))       # 残差连接 + FFN\n```\n\n残差连接允许梯度直接流过，缓解深层网络的梯度消失问题。\n\n**层归一化的位置**：\n\nPre-LN（LayerNorm 在残差连接之前）vs Post-LN 的区别和影响。\n\n### 教学价值\n\n对于深度学习教育，Shannon-b1 提供了：\n\n- 无黑盒的完整实现\n- 可逐步调试的学习路径\n- 从理论到实践的完整映射\n\n## 与工业级实现的对比\n\n| 特性 | Shannon-b1 (NumPy) | PyTorch/TensorFlow |\n|------|-------------------|-------------------|\n| 开发难度 | 高 | 低 |\n| 运行效率 | 低 | 高（GPU 加速） |\n| 可扩展性 | 受限 | 优秀 |\n| 学习价值 | 极高 | 中等 |\n| 生产适用性 | 不适用 | 适用 |\n| 调试难度 | 中等（透明） | 中等（抽象层） |\n\n## 未来发展方向\n\n### 短期目标\n\n1. **完成基础架构**：实现完整的 Decoder-only Transformer\n2. **支持预训练**：实现 Masked Language Modeling 目标\n3. **优化数值稳定性**：处理大模型中的数值问题\n\n### 中期目标\n\n1. **引入简单优化**：使用 Numba 或 Cython 加速关键操作\n2. **支持微调**：实现指令微调能力\n3. **评估基准**：在简单任务上验证模型能力\n\n### 长期愿景\n\n虽然 NumPy 实现不适合生产环境，但项目可以：\n\n1. **成为教学资源**：作为深度学习课程的补充材料\n2. **验证新架构**：快速原型验证新的架构想法\n3. **推动框架发展**：为理解现有框架的设计决策提供参考\n\n## 总结\n\nShannon-b1 代表了深度学习领域一种重要的学习范式——通过从零开始构建来深入理解复杂系统。虽然使用 NumPy 构建大语言模型在实用性上存在明显局限，但其在教育价值和理论理解方面的意义不容忽视。\n\n对于希望真正理解 Transformer 架构内部机制的开发者、研究人员和学生来说，Shannon-b1 提供了一个难得的学习机会。正如项目名字所暗示的那样，它延续了香农对基础原理的探索精神，在深度学习快速发展的今天，这种回归本源的勇气值得赞赏。\n\n项目的开源性质也意味着社区可以共同参与，将其发展成为一个更加完善的教育工具和研究平台。
