@shao__meng:斯坦福大学 CS 312「Deep Learning Alchemy」秋季新课,由 @tatsu_hashimoto 和 @kothasuhas 主讲……

X AI KOLs Timeline 新闻

摘要

斯坦福大学新开设 CS 312「Deep Learning Alchemy」课程,由 Tatsunori Hashimoto 和 Suhas Kotha 主讲,聚焦深度学习中以经验为主的知识——超参数缩放、优化器不变性(μP、Muon)、损失景观与训练稳定性等,全部作业代码、测验和讲义公开,可视为 CS 336 的续作。

斯坦福大学 CS 312「Deep Learning Alchemy」秋季新课 @tatsu_hashimoto 和 @kothasuhas 两位教授主讲这门课程,主要针对一个普遍存在的问题:深度学习中的大部分核心知识都来自经验,理论解释往往不够充分,而光靠读论文也无法替代亲手实践。 课程以两条信条为核心:炼金术必须亲手实践;预测即理解——能够在运行实验之前准确预判结果,才是真正的掌握。 课程网站: https://deep-learning-alchemy.github.io 课程主要内容: 共七个单元:超参数调优与缩放定律 → 优化器与超参数不变性(NQM、μP、Muon、weight decay)→ 损失景观 → 训练稳定性 → 架构能力 → 数据高效泛化(切换到 DNA 模态)→ 第七个单元尚未公开。阅读书目堪称一张深度学习经验知识地图,其中多个方向(μP、Muon、weight decay 系列)的作者就在团队之中。 作业代码、测验和讲义全部公开,课程视频由 @StanfordOnline 发布,自学者可以使用 Modal 租用 GPU 进行完整复现。这门课可以视为 CS 336(从零构建大语言模型)的续作:那门课教你如何构建模型,这门课教你如何理解模型行为。
查看原文
查看缓存全文

缓存时间: 2026/10/16 00:18

Stanford University CS 312《深度学习炼金术》秋季新课

由教授 @tatsu_hashimoto 和 @kothasuhas 主讲,主要针对一个普遍问题:深度学习的大部分核心知识是经验性的,理论解释往往不够充分,而阅读论文无法替代动手实践。

课程以两条信条为支点:炼金术必须亲手实践;预测即理解——能够在运行实验之前准确预测结果,才是真正的精通。

课程网站: https://deep-learning-alchemy.github.io

主要课程安排

共七个单元:超参数调优与缩放定律 → 优化器与超参数不变性(NQM、μP、Muon、权重衰减)→ 损失景观 → 训练稳定性 → 架构容量 → 数据高效泛化(切换到 DNA 模态)→ 未公开单元。阅读清单作为经验性深度学习的地图,多位作者(μP、Muon、权重衰减系列的作者)就在教学团队中。

作业代码、测验和讲义全部公开,课程视频由 @StanfordOnline 发布,自学者可以使用 Modal 租用 GPU 进行完整复现。可以将其视为 CS 336(从零构建语言模型)的续作:那门课教你如何构建模型,这门课教你如何理解模型行为。


Stanford CS 312 | 深度学习炼金术

来源:https://deep-learning-alchemy.github.io/

示例作业题:从我们预训练的基线深度 8 transformer 出发,使用 614M tokens 进行预训练。该 transformer(代码实现见下)包含多个组件,如 prenorm、attention、MLP、残差连接和位置嵌入。在此问题中,我们希望了解每个组件在多大程度上改善了 loss。请探索以下方向。

  1. 对当前模型中每个组件的作用进行留一消融实验(leave-one-out ablation)。
  2. …
  3. …
  4. 理解残差连接的作用。你能提出不同的方案来提升残差连接带来的 loss 收益吗?

相关代码片段:

class Block(nn.Module):
    def __init__(self, width, ...):
        super().__init__()
        self.attn_norm = RMSNorm(width)
        self.attn = Attention(width, ...)
        self.mlp_norm = RMSNorm(width)
        self.mlp = MLP(width, ...)

    def update(self, x):
        attn = self.attn(self.attn_norm(x))
        mlp = self.mlp(self.mlp_norm(x + attn))
        return attn + mlp

    def forward(self, x):
        return x + self.update(x)

class Transformer(nn.Module):
    def __init__(self, vocab_size, depth=8, ...):
        super().__init__()
        self.token_embed = nn.Embedding(vocab_size, ...)
        self.position_embed = nn.Embedding(...)
        self.blocks = nn.ModuleList(
            [Block(...) for _ in range(depth)]
        )
        self.final_norm = RMSNorm(...)
        self.lm_head = nn.Linear(..., vocab_size)

    def forward(self, tokens):
        positions = torch.arange(
            tokens.size(1), device=tokens.device
        )
        x = self.token_embed(tokens)
        x = x + self.position_embed(positions)
        for block in self.blocks:
            x = block(x)
        return self.lm_head(self.final_norm(x))

示例测验题(难度:简单):我们使用相同的训练配方和超参数分别训练以下深度 8 的 transformer 变体。请将各变体按最终验证 loss 从低到高排序。在字母之间使用 <、> 或 =;当 loss 差异在 0.01 以内时用 =。

  1. 基线(Baseline)
  2. 无 prenorm(No prenorm)
  3. 无残差(No residual)
  4. 无 MLP(No MLP)
  5. 无 attention(No attention)
  6. 无位置嵌入(No positional embeddings)

无 prenorm diff:

@@ -10,4 +10,4 @@ class Block.update
 def update(self, x):
-    attn = self.attn(self.attn_norm(x))
+    attn = self.attn(x)
-    mlp = self.mlp(self.mlp_norm(x + attn))
+    mlp = self.mlp(x + attn)
     return attn + mlp

无 residual diff:

@@ -16,2 +16,2 @@ class Block.forward
 def forward(self, x):
-    return x + self.update(x)
+    return self.update(x)

无 MLP diff:

@@ -10,4 +10,3 @@ class Block.update
 def update(self, x):
     attn = self.attn(self.attn_norm(x))
-    mlp = self.mlp(self.mlp_norm(x + attn))
-    return attn + mlp
+    return attn

无 attention diff:

@@ -10,4 +10,3 @@ class Block.update
 def update(self, x):
-    attn = self.attn(self.attn_norm(x))
-    mlp = self.mlp(self.mlp_norm(x + attn))
-    return attn + mlp
+    mlp = self.mlp(self.mlp_norm(x))
+    return mlp

无 positional embeddings diff:

@@ -22,2 +22,1 @@ Transformer.__init__
         self.token_embed = nn.Embedding(vocab_size, ...)
-        self.position_embed = nn.Embedding(...)
@@ -30,8 +29,4 @@ Transformer.forward
     def forward(self, tokens):
-        positions = torch.arange(
-            tokens.size(1), device=tokens.device
-        )
         x = self.token_embed(tokens)
-        x = x + self.position_embed(positions)
         for block in self.blocks:
             x = block(x)

示例测验题(难度:困难):我们训练默认的 8 层 transformer 以及一个变体——其中残差连接不是来自前一层,而是取前一层的 0.5 贡献和前两层的 0.5 贡献之和(第一层除外)。对于每种方法,我们取六个学习率 {10⁻⁴, 3 × 10⁻⁴, 10⁻³, 3 × 10⁻³, 10⁻², 3 × 10⁻²} 中的最佳 loss。请预测两种方法之间的 loss 差异(L_mixed residual − L_default)。

Core diff:

@@ -34,3 +34,9 @@ Transformer.forward
 x_two_back = None
 for i, block in enumerate(self.blocks):
-    x = block(x)
+    update = block.update(x)
+    residual = (
+        x if i == 0
+        else 0.5 * x + 0.5 * x_two_back
+    )
+    x_two_back, x = x, residual + update

注意:这两道题都很难,如果在不运行作业中的实验的情况下没有直觉,不要灰心!

Tatsunori Hashimoto (@tatsu_hashimoto): 深度学习常常被当作一套经过整理的事实和数学公式来教授。但 AI 前沿的工作是混乱的、经验性的。

我们的新课程《深度学习炼金术》,旨在以《从零构建语言模型》(Language Modeling From Scratch)的动手实践精神,教授深度学习的艺术与科学。

相似文章

@RuiWu560670:CS336 的老粉丝了。我最喜欢的部分是从前沿实验室的技术报告中提炼实证发现。那些经验教训是用真实的算力换来的,往往比在狭隘假设下推导出来的理论更有用。CS312 在此基础上更进一步:它教你直接观察这些实证现象,再反向推导背后的科学。Stanford 在这方面真的走在前面。我会跟进 CS312 的。

X AI KOLs Timeline

一位 CS336 的老粉丝称赞了课程对实证研究的重视,并对 Stanford 新开设的 CS312《Deep Learning Alchemy》课程表示期待。该课程由 Tatsunori Hashimoto 推出,旨在教授前沿深度学习研究中那些混乱而依赖经验的一面。

@srush_nlp:我一直对 DL Alchemy 课程(https://deep-learning-alchemy.github.io)非常着迷。决定将……

X AI KOLs Timeline

斯坦福大学的 CS 312“深度学习炼金术”课程将构建理论的重担交给学生(以及他们的 Claude 助手),让他们在一个用 6.14 亿个 token 训练的 8 层 Transformer 上开展消融实验,以实证方式探究 Transformer 的各个组件——这引发了一个反思:也许死记硬背的机器学习知识从来就没那么重要。