EECS498 · Deep Learning Revisited · 01

Neural Networks Are Functions

你当年从 KNN、linear classifier 走到 two-layer net,真正发生的变化不是 API 变多了,而是“数据怎样变成可学习的 representation”第一次闭环。

45–60 分钟 A1–A2 Shape first

30-second recall

30 秒回忆

你当年实现了距离矩阵、线性 scores、ReLU hidden layer、softmax loss 和参数更新。

  1. 一个 batch 在每层代表什么?
  2. 参数与 activation 有什么不同?
  3. 训练为何最终能写成一条函数链?

Why Did We Need This?

KNN 没有学习一个参数化表示:预测时仍要把测试样本与训练集比较。A2 的线性分类器第一次把经验压进 W;two-layer net 又允许数据先经过一个可学习 hidden representation,再变成 class scores。

images X [N,D]
hidden H [N,H]
scores S [N,C]
loss L scalar

What You Actually Implemented

File Implemented in repository Evidence
A1/knn.py three distance kernels, label vote, K-fold CV zip diff;Notebook test 33.86%
A2/linear_classifier.py SVM / softmax naive+vectorized, minibatch SGD zip diff;two saved checkpoints
A2/two_layer_net.py affine → ReLU → affine, softmax, manual gradients zip diff;test 53.59%

CourseStack Explanation “函数链”是本课程为复习建立的统一视角,不声称是你当年的原话。

Mental model

神经网络不是一袋 layer;它是把输入 representation 逐层改写,最后让正确答案的 score 更容易胜出的参数化函数。

Mechanism · 每个 tensor 到底是谁

把 CIFAR-10 图片 flatten 后,X[n] 是第 n 个样本;W1[:,h] 是生成第 h 个 hidden feature 的参数;hidden[n,h] 是这个样本在该 feature 上的 activation。参数跨样本共享,activation 随输入改变。

用最小公式恢复链条:

H = ReLU(XW₁ + b₁)      [N,D]·[D,H] → [N,H]
S = HW₂ + b₂             [N,H]·[H,C] → [N,C]
L = softmax_loss(S, y)   [N,C] + [N] → scalar

Code Lens

Your code · 2022

A2/two_layer_net.py · nn_forward_pass()

View source →
hidden = X.mm(W1) + b1
hidden *= 1 * (hidden > 0)  # ReLU
scores = hidden.mm(W2) + b2

这三行已经包含了深度学习最持久的结构:线性混合负责“组合已有特征”,非线性负责让多层不坍缩成一次矩阵乘法。

Why This Design?

如果没有 hidden layer

每个 class 只能用一个线性分界面组织像素,表示能力受限。

如果没有 ReLU

XW1W2 仍等价于单个线性变换;“两层”只有记账意义。

Common Misconception

Score 不是 probability,hidden unit 也不是预先命名的“眼睛检测器”。它们先是训练过程塑造出的数值 representation;softmax 才把相对 score 解释成归一化分布。

Then vs Now

现代 Transformer 仍做同一件事:token IDs → embedding → 多层 hidden representations → vocabulary scores → scalar loss。模型更大、block 更复杂,但“参数共享的函数链”没有改变。

Concept Checks

输入 X=[32,3072],W1=[3072,128],hidden 是什么 shape?

[32,128]。每个样本得到 128 个 hidden features;3072 是被加权汇总的输入维。

如果删掉 ReLU,再堆十个 linear layer,表达能力发生什么?

忽略 bias 后仍可合并成一个矩阵;加入 bias 仍只是 affine。深度没有创造分段非线性边界。

为什么参数 W 不带 batch 维,而 hidden 带 N?

W 是所有样本共享的规则;hidden 是每个样本经过规则后产生的状态。

Depth Lab · 从 nearest neighbor 推到 two-layer network

最朴素的 KNN 保存训练样本,预测时比较新输入与所有旧样本;它没有学出一组可复用参数,推理成本随训练集增长。Linear classifier 把分类规则压进 W,但只有线性 decision boundary;two-layer network 再加入可学习 hidden representation 与非线性。

取 N=2,D=3,H=4,C=2:

X                 [2,3]   data
W1                [3,4]   parameter
XW1+b1            [2,4]   preactivation
ReLU              [2,4]   hidden activation
W2                [4,2]   parameter
scores             [2,2]   class evidence
softmax loss       scalar  objective

H=4 是模型构造的四个 learned features;C=2 才是类别轴。

  1. W1 的 columns 定义 hidden units 如何读取输入。
  2. ReLU 让不同 example 激活不同 hidden subset。
  3. W2 把 learned features 组合成 class scores。
  4. Loss 量化 scores 与 labels 的不一致。
  5. Backward 产生 gradients;optimizer 才更新 parameters。
如果去掉 ReLU?

XW1W2 可合并成一张矩阵 XW;堆两层没有扩大线性函数族。

对象身份是否随 example 变化
X / hidden / scoresactivations是
W1,b1,W2,b2parameters否(只在 update 改)
dW1,db1,dW2,db2gradients随 batch/loss 变化
Misconception diagnosis

Hidden activation 不是模型参数。模型学的是生成 activation 的 weights;activation 还依赖当前 X。

N 从 2 变 64,哪些 shapes 改变?

activations 第一轴变 64;W1/W2 不变。batch size 不是 model capacity。

若 ReLU preactivation=-2,这个局部 path 的 backward 怎样?

forward 输出 0;对该 preactivation 的 local gradient 为 0。

Transfer Question

把 input 换成 9 个 token vectors,普通 FC 如何跨 positions 连接?这会暴露什么结构缺口?

闭卷解释

  1. 区分 parameter、activation、gradient。
  2. 从“线性层可合并”解释 ReLU。
  3. 沿 shape 说清 input 如何变成 scalar loss。

Connection

Forward 构造 scores;下一课反向追问一个 scalar loss 怎样为 W1 的每个元素产生方向。

Based on your implementation