Skip to main content

ML Coding 与 Transformer 肌肉记忆训练

Alisa Liu 对 coding 准备给出的最硬建议是:Transformer 的实现和调试要练到 muscle memory,并且练习时完全关闭 AI 辅助。原因很简单,真实面试时你不能依赖 Copilot、ChatGPT 或 Claude。

训练目标

你不是为了写出最优雅的开源库,而是为了在面试环境下稳定做到:

  • 快速写出核心模块。
  • shape 不乱。
  • mask 不错。
  • 能解释每一行为什么这样写。
  • 出 bug 时有系统 debug 路径。
  • 写完能补测试或最小 sanity check。

必练模块

模块必须掌握的点
Token embeddingvocab size、embedding dim、batch/seq shape
Positional encodinglearned、sinusoidal、RoPE、ALiBi 的差异
LayerNorm / RMSNormnormalize 维度、epsilon、scale 参数
Multi-head attentionQKV projection、head split/merge、causal mask
MLP / FFNhidden expansion、activation、SwiGLU / GELU
Residual blockpre-norm vs post-norm
LM headweight tying、logits shape
Cross entropy lossshifted labels、ignore index、padding
Decodinggreedy、temperature、top-k、top-p、beam search
KV cacheprefill、decode、cache shape、position offset

从零实现 Transformer 的最小清单

不要一开始就写完整训练框架。先把模块拆到能单测:

  1. RMSNorm(x):输入 [B, T, C],输出同 shape。
  2. CausalSelfAttention(x):输入 [B, T, C],输出 [B, T, C]
  3. MLP(x):输入 [B, T, C],输出 [B, T, C]
  4. Block(x):attention + MLP + residual。
  5. TransformerLM(input_ids, targets=None):输出 logits 和 loss。
  6. generate():支持 max_new_tokens、temperature、top-k。

每个模块写完都要检查:

  • shape 是否和预期一致。
  • dtype / device 是否一致。
  • mask 是否真的阻止未来 token。
  • loss 是否是标量。
  • 随机小 batch 能否 forward / backward。
  • 梯度是否不是 None,且没有 nan

Attention 写法要烂熟

核心 shape 推荐固定成:

  • 输入:x: [B, T, C]
  • QKV:q, k, v: [B, H, T, D]
  • attention scores:[B, H, T, T]
  • 输出合并:[B, T, C]

最常见 bug:

  • transpose 后忘记 contiguous(),再 view 出错。
  • causal mask shape 不能 broadcast。
  • softmax 维度写错。
  • scale 写成除以 sqrt(C),而不是 sqrt(D)
  • training labels 没 shift,导致模型偷看当前 token。
  • mixed precision 下 mask 用 -inf 引发数值问题,应该知道如何处理。

Decoding 必练

面试非常喜欢 decoding,因为它能同时考察 logits 操作、概率理解、边界条件和代码能力。

必须能写:

  • Greedy:取 argmax
  • Temperature:logits / temperature
  • Top-k:只保留最高 k 个 logits,其余置为负无穷。
  • Top-p:按概率排序,保留累计概率达到 p 的最小集合。
  • Beam search:维护 beam 分数、候选扩展、长度惩罚。

必须能解释:

  • temperature 越高越随机,越低越保守。
  • top-k 固定候选数量,top-p 固定概率质量。
  • beam search 不等于“更有创造力”,常导致安全但无聊的输出。
  • decoding 策略改变的是采样过程,不改变模型本身。

Debug 路径

面试里最怕的是 bug 出现后乱试。建议固定顺序:

  1. 打印 shape:先确认每个 tensor 的 [B, T, C][B, H, T, D]
  2. 检查 dtype / device:CPU/GPU、float/bool/long 是否混乱。
  3. 检查 mask:小矩阵可视化,确认上三角被遮住。
  4. 检查数值:是否有 naninf、极大 logits。
  5. 检查 loss:随机初始化时 loss 是否接近 log(vocab_size)
  6. 检查梯度:参数是否参与计算图。
  7. 用小样本 overfit:几十个 token 能否把 loss 打下来。

关闭 AI 辅助的练习方法

Alisa 的建议是练 coding 时完全关闭 AI 辅助。可以这样执行:

  • 第一轮:允许看官方 PyTorch 文档,不允许看现成实现。
  • 第二轮:只看自己写的接口说明。
  • 第三轮:限时实现,不查资料。
  • 第四轮:找朋友 mock,让对方随机要求你改 mask、改 decoding、加 KV cache。

每次练完都记录:

  • 卡在哪个 API。
  • 哪个 shape 出错。
  • 哪个概念解释不清。
  • 哪个 bug 花了超过 5 分钟。

这些记录比“我今天又写了一遍 Transformer”更有价值。

General Coding 不要丢

Alisa 也把 LeetCode 75NeetCode Blind 75 放进了资源清单。研究岗候选人常常低估这部分,但 general coding 会直接影响 ML coding 的流畅度。

建议优先刷:

  • 滑动窗口:理解上下文窗口、token span 很有帮助。
  • 堆:beam search、top-k 常用。
  • 图搜索:实验 pipeline、依赖关系、搜索问题常出现。
  • 动态规划:序列建模和编辑距离相关问题常见。
  • 字符串:tokenizer、BPE、decode 边界很容易考。

目标不是刷 500 题,而是把基础数据结构和边界条件练稳。