Neural Networks

神经网络的核心思想是将特征提取线性分类整合到一个统一的框架中,让模型端到端地学习如何提取特征

网络结构

  • 线性分类器:
  • 两层神经网络 (2-Layer Neural Network):
    • 第一层
      • (W₁, b₁) 将输入 x 映射到中间的隐藏层 (hidden layer) h。这一步可以看作是可学习的特征提取 。
        W₁ 的每一行都可以被可视化为一个“模板”或特征检测器。
    • max(0, ...) 是一个非线性的激活函数 (Activation Function),最常用的是 ReLU (Rectified Linear Unit)
    • 第二层
      • (W₂, b₂) 在学习到的特征 h 之上进行最终的线性分类。
      notion image
  • 三层神经网络 (3-Layer Neural Network):
  • 通过堆叠更多的层,我们可以构建深度神经网络 (Deep Neural Networks)。网络的深度 (Depth) 指的是层数,宽度 (Width) 指的是每层的大小。
    • notion image

Activation Functions

激活函数为神经网络引入了至关重要的非线性。如果没有激活函数,一个多层网络将退化成一个简单的线性分类器。
  • ReLU (Rectified Linear Unit): ,ReLU 是目前大多数问题的优秀默认选择。
  • Sigmoid:
  • tanh:
  • Leaky ReLU:
  • ELU (Exponential Linear Unit):

Neural Net

 

Universal Approximation Theorem

理论上,一个含有一个隐藏层的神经网络可以以任意精度近似任何连续函数 。
  • 这是通过组合许多简单的ReLU“斜坡”单元来实现的 。例如,可以用四个ReLU单元(四个隐藏单元)构建一个“凸包”函数 (bump function) 。通过叠加足够多的“凸包”,就可以近似任意函数。
notion image
  • 注意:这一定理只说明了神经网络的表达能力 (representational power),并不能保证我们一定能通过SGD等方法学习到这个函数,也不告诉我们需要多少数据才能学好。

Backpropagation

为了用梯度下降法训练神经网络,我们需要计算损失函数L 相对于所有可学习参数的梯度。

Computational Graphs

手动推导复杂模型的梯度公式非常繁琐、易错且不灵活 。更好的方法是将任何复杂的函数表示为一个计算图 (Computational Graph)
  • 前向传播 (Forward Pass): 从输入开始,逐个节点计算并存储每个节点的输出值,直到最终的损失 L
  • 反向传播 (Backward Pass): 从最终输出 L 开始(其梯度为1),沿着图反向传播,根据链式法则 (Chain Rule) 计算每个节点的梯度 。

链式法则与梯度流

链式法则的核心是:[下游梯度] = [上游梯度] × [局部梯度]
  • 上游梯度 (Upstream Gradient): 是指计算图后续节点传回的梯度。
  • 局部梯度 (Local Gradient): 是当前节点输出相对于其直接输入的偏导数。
  • 下游梯度 (Downstream Gradient): 是我们要计算的、传给前面节点的梯度。
notion image

常见节点的梯度流模式:

  • 加法门 (add gate): 将上游梯度等值地分发给所有输入 。
    • notion image
  • 拷贝门 (copy gate): 将来自所有分支的上游梯度相加
    • notion image
 
  • 乘法门 (mul gate): 将上游梯度乘以“另一条边”的输入值,然后交换传给输入。
    • notion image
  • Max门 (max gate): 将上游梯度路由给值最大的那个输入,其他输入的梯度为0。
    • notion image

Backprop Implementation

“Flat” gradient code

这个例子展示了如何将计算图的每一步都写成独立的变量,以及如何反向计算每个变量的梯度。
notion image

Modular API

现代深度学习框架采用模块化的方式,为每个计算单元(层)定义forwardbackward方法。

PyTorch Autograd

在PyTorch中,可以自定义一个层,并分别实现其前向和反向传播逻辑。

Backprop with Vectors & Matrices

notion image
notion image
当处理向量或矩阵时,链式法则中的“乘法”变为雅可比矩阵与向量的乘积 (Jacobian-vector product)
  • 梯度的形状总是与变量的形状保持一致
  • 对于矩阵乘法 y = xw,其梯度可以表示为:
    • dL/dx = (dL/dy) @ wᵀ
    • dL/dw = xᵀ @ (dL/dy)
      • 这里的 @ 代表矩阵乘法。

Another View: Automatic Differentiation

Chain rule

一个深层网络的梯度计算可以看作是一长串雅可比矩阵(Jacobian matrices)的乘积 。例如:
notion image
由于矩阵乘法满足结合律,我们可以选择不同的计算顺序 。

Reverse-Mode AD

反向模式自动微分,也就是我们通常所说的反向传播 (Backpropagation),采用从右到左的顺序计算上述的矩阵乘积 。
  • 这种方法从最终的梯度∂L/∂x₃ (一个向量) 开始,然后逐步向左乘以每个雅可比矩阵 。
  • 其巨大的优势在于,每一步都是一次矩阵-向量乘法,这在计算上非常高效 。
  • 它非常适合深度学习的场景:计算一个标量输出(损失L)相对于所有向量输入的梯度 。
notion image

Forward-Mode AD

这是一种替代方法,它采用从左到右的顺序计算雅可比矩阵的乘积 。
  • 它同样通过一系列矩阵-向量乘法来避免高成本的矩阵-矩阵乘法 。
  • 正向模式适合计算多个输出相对于单个输入的梯度 。
  • PyTorch中也提供了对正向模式AD的实现 。
 
notion image

高阶导数:Hessian-向量积

反向传播不仅可以用于计算一阶导数(梯度),还可以高效地计算高阶导数相关的信息。
  • Hessian矩阵 (Hessian Matrix): 是损失函数L的二阶导数矩阵,记为 H 。对于一个维度为 D₀ 的输入,Hessian矩阵的大小为
    • [D₀ x D₀],在深度学习中这个矩阵会异常庞大。
  • Hessian-向量积 (Hessian-vector product): 与其直接计算和存储完整的Hessian矩阵,不如计算它与一个任意向量 v 的乘积 H·v
  • 计算方法: Hessian-向量积可以通过一个巧妙的技巧算出,即对 (梯度 · v) 这个标量再次进行反向传播 。其数学表达式为:
    • notion image
  • 这个过程大约需要两次反向传播的计算量,但完全避免了构建巨大的Hessian矩阵 。主流深度学习框架(如PyTorch和TensorFlow)都实现了这个功能。
notion image
Loading...