第 9 讲 · 神经网络

SVM 先选一个核函数,再在对应特征空间中找边界。神经网络则把“特征怎样表示”和“怎样分类”放进同一个可训练系统:前面的层逐步变换输入,最后一层完成预测。

从人工神经元到感知机

一个神经元先做加权求和,再过激活函数:

z=w⊤x+b,a=σ(z)z=w^\top x+b,\qquad a=\sigma(z)

早期 MP 神经元和 Hebb 学习规则提供了生物启发,感知机进一步用错分样本调整权重。对标签 y∈{−1,+1}y\in\{-1,+1\},错分时可做:

w←w+ηyx,b←b+ηyw\leftarrow w+\eta yx,\qquad b\leftarrow b+\eta y

感知机能实现 AND、OR 等线性可分逻辑,却无法单层解决 XOR。这不是训练技巧问题,而是几何上不存在一条直线把 XOR 两类分开。

多层网络为什么需要非线性

多层感知机写成:

h=σ(W1x+b1),y^=W2h+b2h=\sigma(W_1x+b_1),\qquad \hat y=W_2h+b_2

如果去掉 σ\sigma,两层仿射变换可合并为一层:

W2(W1x+b1)+b2=(W2W1)x+(W2b1+b2)W_2(W_1x+b_1)+b_2=(W_2W_1)x+(W_2b_1+b_2)

所以网络“深”不是因为矩阵乘得多,而是每层之间的非线性让函数族变丰富。常见激活:

无隐藏层、单隐藏层和双隐藏层网络可表示的决策区域复杂度对比

  • sigmoid 输出 0—1,但饱和区梯度小;
  • tanh 输出 -1—1,仍会饱和;
  • ReLU 为 max⁡(0,z)\max(0,z),正区梯度稳定、计算简单。

反向传播就是链式法则复用

前向传播保存每层中间值并算出损失。反向传播从损失开始,沿计算图反向乘局部导数。例如:

∂L∂W1=∂L∂y^∂y^∂h∂h∂z∂z∂W1\frac{\partial L}{\partial W_1} =\frac{\partial L}{\partial \hat y} \frac{\partial \hat y}{\partial h} \frac{\partial h}{\partial z} \frac{\partial z}{\partial W_1}

同一个中间梯度只算一次,随后分发给前驱节点,这使大网络训练成为可能。所有权重若初始化成相同值,同层神经元会收到相同梯度、永远学成一样,因此要随机初始化;初始化尺度过大或过小又会引起激活和梯度不稳定。

CNN:利用图像的空间结构

全连接层把每个像素连到每个神经元,参数很多,也忽略了邻近像素更相关的事实。卷积神经网络使用:

  • 局部感受野:卷积核只看一个局部窗口;
  • 权重共享:同一个卷积核滑过整张图,检测相同模式;
  • 多通道特征图:不同卷积核学习边缘、纹理和更高层结构;
  • 池化或步幅:缩小空间尺寸,提高一定平移容忍度。

课件依次回顾 LeNet、AlexNet、ZFNet、GoogLeNet、VGG 和 ResNet。与其死背年份,不如记住改进主线:网络变深、激活和训练方法改进、多尺度分支提高效率、统一的小卷积堆叠,以及 ResNet 用残差连接让信息和梯度绕过若干层:

y=F(x)+xy=F(x)+x

RNN:让序列拥有状态

循环神经网络在每一步把当前输入和上一隐藏状态合并:

ht=ϕ(Wxxt+Whht−1+b),yt=Wyht+ch_t=\phi(W_xx_t+W_hh_{t-1}+b),\qquad y_t=W_yh_t+c

同一组参数在所有时间步共享,可表示一对多、多对一和多对多任务。训练时把网络沿时间展开,再用 BPTT 反向传播。长序列上反复乘相似 Jacobian,梯度可能指数变小或变大,形成梯度消失或爆炸。

LSTM:给长期信息一条更平滑的通道

LSTM 维护细胞状态 ctc_t,用门控制信息:

ft=σ(Wf[xt,ht−1]+bf)f_t=\sigma(W_f[x_t,h_{t-1}]+b_f) it=σ(Wi[xt,ht−1]+bi),c~t=tanh⁡(Wc[xt,ht−1]+bc)i_t=\sigma(W_i[x_t,h_{t-1}]+b_i),\qquad \tilde c_t=\tanh(W_c[x_t,h_{t-1}]+b_c) ct=ft⊙ct−1+it⊙c~tc_t=f_t\odot c_{t-1}+i_t\odot\tilde c_t ot=σ(Wo[xt,ht−1]+bo),ht=ot⊙tanh⁡(ct)o_t=\sigma(W_o[x_t,h_{t-1}]+b_o),\qquad h_t=o_t\odot\tanh(c_t)

遗忘门决定保留多少旧状态,输入门决定写入多少新候选,输出门决定暴露多少状态。它缓解长依赖问题,但并未让序列训练完全没有困难。

Fashion-MNIST 实践的完整链路

课件用 28×28 灰度服饰图做十分类。最简单的 MLP 把图像展平为 784 维,经过 256 个隐藏单元,再输出 10 类 logits:

model = nn.Sequential(
    nn.Flatten(),
    nn.Linear(28 * 28, 256),
    nn.ReLU(),
    nn.Linear(256, 10),
)

训练循环的固定结构是:取小批量、前向、算损失、清空旧梯度、反向、优化器更新;测试时关闭梯度并切到评估模式。分类通常把原始 logits 直接交给交叉熵,不要先手工 softmax 后再传一次。

CNN、RNN/LSTM 都把特定结构写进网络。下一讲先从统计语言模型出发,再看到 Attention 和 Transformer 怎样让序列位置直接交互。

评论