【计算机视觉(12)】神经网络与反向传播基础篇:从线性分类器到多层感知机

文章目录

    • [📚 学习路线图](#📚 学习路线图)
    • 本文内容一览(快速理解)
    • [一、为什么需要神经网络(Why Neural Networks):线性分类器的局限性](#一、为什么需要神经网络(Why Neural Networks):线性分类器的局限性)
      • [1.1 线性分类器的局限性(Limitations of Linear Classifiers):只能学习线性边界](#1.1 线性分类器的局限性(Limitations of Linear Classifiers):只能学习线性边界)
      • [1.2 特征变换的解决方案(Feature Transformation):手动设计特征](#1.2 特征变换的解决方案(Feature Transformation):手动设计特征)
    • [二、神经网络架构(Neural Network Architecture):多层感知机](#二、神经网络架构(Neural Network Architecture):多层感知机)
      • [2.1 从线性分类器到神经网络(From Linear to Neural Networks):添加隐藏层](#2.1 从线性分类器到神经网络(From Linear to Neural Networks):添加隐藏层)
      • [2.2 激活函数的重要性(Importance of Activation Functions):引入非线性](#2.2 激活函数的重要性(Importance of Activation Functions):引入非线性)
      • [2.3 常见的激活函数(Common Activation Functions):ReLU、Sigmoid、Tanh等](#2.3 常见的激活函数(Common Activation Functions):ReLU、Sigmoid、Tanh等)
      • [2.4 神经网络的容量(Neural Network Capacity):更多神经元=更强能力](#2.4 神经网络的容量(Neural Network Capacity):更多神经元=更强能力)
    • 三、反向传播(Backpropagation):如何计算梯度
      • [3.1 计算图(Computational Graph):将函数分解为简单操作](#3.1 计算图(Computational Graph):将函数分解为简单操作)
      • [3.2 链式法则(Chain Rule):反向传播的数学基础](#3.2 链式法则(Chain Rule):反向传播的数学基础)
      • [3.3 常见操作的梯度模式(Gradient Patterns):加法门、乘法门、最大值门](#3.3 常见操作的梯度模式(Gradient Patterns):加法门、乘法门、最大值门)
      • [3.4 反向传播的实现(Backpropagation Implementation):前向传播和反向传播](#3.4 反向传播的实现(Backpropagation Implementation):前向传播和反向传播)
    • [四、向量和矩阵的反向传播(Vector/Matrix Backpropagation):处理高维数据](#四、向量和矩阵的反向传播(Vector/Matrix Backpropagation):处理高维数据)
      • [4.1 向量反向传播(Vector Backpropagation):使用雅可比矩阵](#4.1 向量反向传播(Vector Backpropagation):使用雅可比矩阵)
      • [4.2 矩阵反向传播(Matrix Backpropagation):矩阵乘法的梯度](#4.2 矩阵反向传播(Matrix Backpropagation):矩阵乘法的梯度)
    • [📝 本章总结](#📝 本章总结)
    • [📚 延伸阅读](#📚 延伸阅读)

📌 适合对象 :计算机视觉初学者、深度学习入门者

⏱️ 预计阅读时间 :60-70分钟

🎯 学习目标:理解神经网络的架构和原理,掌握反向传播算法,学会计算复杂模型的梯度


📚 学习路线图

线性分类器
局限性 神经网络
多层感知机 激活函数
非线性变换 前向传播
Forward Pass 反向传播
Backpropagation 计算图
Computational Graph 链式法则
Chain Rule 向量/矩阵
反向传播


本文内容一览(快速理解)

  1. 线性分类器的局限性(Limitations of Linear Classifiers):只能学习线性决策边界,无法处理复杂模式
  2. 神经网络架构(Neural Network Architecture):多层感知机(MLP),全连接层堆叠
  3. 激活函数(Activation Functions):引入非线性,使神经网络能够学习复杂模式
  4. 反向传播(Backpropagation):通过计算图高效计算梯度
  5. 链式法则(Chain Rule):反向传播的数学基础
  6. 向量和矩阵的反向传播(Vector/Matrix Backprop):处理高维数据的梯度计算

一、为什么需要神经网络(Why Neural Networks):线性分类器的局限性

这一章要建立的基础:理解线性分类器的局限性,以及为什么需要更强大的模型

核心问题:线性分类器为什么不够强大?如何解决这个问题?


!NOTE

📝 关键点总结:线性分类器只能学习线性决策边界,无法处理复杂的非线性模式。解决方案是使用神经网络,通过多层非线性变换学习复杂的决策边界。

1.1 线性分类器的局限性(Limitations of Linear Classifiers):只能学习线性边界

概念的本质

线性分类器只能学习线性决策边界。对于某些问题(如XOR问题、多模态分布),线性分类器无法正确分类。这限制了它的应用范围。

图解说明
线性分类器 线性决策边界
一条直线 问题1
XOR问题 问题2
多模态分布 问题3
环形分布 无法解决
需要非线性边界

💡 说明

  • 线性边界:线性分类器只能画直线(或超平面)分割空间
  • 复杂模式:对于需要曲线边界的问题,线性分类器无法处理
  • 解决方案:使用神经网络,可以学习非线性决策边界

类比理解

想象你在用笔画分割线。线性分类器就像:

  • 只能画直线:无论多复杂的问题,都只能用直线分割
  • 复杂问题:有些问题需要曲线才能分割(如圆形区域)
  • 神经网络:就像可以用曲线分割,更灵活

实际例子

复制代码
线性分类器无法处理的问题:

1. XOR问题:
   类别1:第一象限和第三象限
   类别2:第二象限和第四象限
   - 无法用一条直线分开
   - 需要两条直线(非线性)

2. 多模态分布:
   类别1:两个分离的区域
   类别2:其他区域
   - 线性分类器只能用一个超平面
   - 无法处理多个分离的区域

3. 环形分布:
   类别1:$L_2$范数在$1$到$2$之间
   类别2:其他
   - 需要环形边界
   - 线性分类器无法处理

解决方案:
- 特征变换:手动设计特征(如HoG、颜色直方图)
- 神经网络:自动学习特征和分类边界

1.2 特征变换的解决方案(Feature Transformation):手动设计特征

概念的本质

一种解决方案是手动设计特征变换,将原始数据转换到新的特征空间,然后在新空间中使用线性分类器。例如,将笛卡尔坐标(x,y)转换为极坐标(r,θ),可能使问题变得线性可分。

图解说明
原始数据
(x, y) 特征变换
f(x, y) 新特征空间
(r, θ) 线性分类器
在新空间

💡 说明

  • 特征变换:将数据从原始空间转换到新空间
  • 线性分类:在新空间中使用线性分类器
  • 问题:需要手动设计特征,费时费力

类比理解

想象你在看一幅画。特征变换就像:

  • 原始视角:从正面看,很难区分
  • 变换视角:换个角度(如侧面),可能更容易区分
  • 问题:需要知道哪个角度最好(手动设计)

实际例子

复制代码
特征变换的例子:

1. 极坐标变换:
   原始:(x, y) - 笛卡尔坐标
   变换:(r, θ) - 极坐标
   - 可能使某些问题变得线性可分

2. 图像特征:
   - 颜色直方图:统计颜色分布
   - HoG(方向梯度直方图):统计梯度方向
   - 这些特征可能更适合分类

3. 问题:
   - 需要领域知识
   - 费时费力
   - 可能不是最优的

更好的方案:
- 神经网络:自动学习特征
- 不需要手动设计
- 可以学习最优特征

二、神经网络架构(Neural Network Architecture):多层感知机

这一章要建立的基础:理解神经网络的基本架构和组成

核心问题:神经网络是如何构建的?它如何比线性分类器更强大?


!NOTE

📝 关键点总结:神经网络(多层感知机)由多个全连接层堆叠而成。每层包含线性变换和激活函数。通过多层非线性变换,神经网络可以学习复杂的决策边界。

2.1 从线性分类器到神经网络(From Linear to Neural Networks):添加隐藏层

概念的本质

神经网络是在线性分类器的基础上添加隐藏层。线性分类器: f ( x , W ) = W x + b f(x,W) = Wx + b f(x,W)=Wx+b。 2 2 2层神经网络: h = max ⁡ ( 0 , W 1 x + b 1 ) h = \max(0, W_1x + b_1) h=max(0,W1x+b1), s = W 2 h + b 2 s = W_2h + b_2 s=W2h+b2。通过添加隐藏层和激活函数,神经网络可以学习非线性模式。

图解说明
输入x
3072维 隐藏层h
100维 输出s
10维 W1
100×3072 W2
10×100 激活函数
ReLU

💡 说明

  • 输入层 :原始数据(如 3072 3072 3072维图像)
  • 隐藏层 :中间表示(如 100 100 100维)
  • 输出层 :类别分数(如 10 10 10维)
  • 激活函数:引入非线性(如ReLU)

类比理解

想象你在做决策。神经网络就像:

  • 线性分类器:直接根据输入做决策(简单但有限)
  • 神经网络:先提取特征(隐藏层),再根据特征做决策(复杂但强大)
  • 多层:可以提取更抽象的特征

实际例子

复制代码
$2$层神经网络的例子(CIFAR-10):

输入:$x$($32 \times 32 \times 3 = 3072$维图像)

第$1$层(隐藏层):
$$h = \max(0, W_1x + b_1)$$
- $W_1$:$100 \times 3072$权重矩阵
- $b_1$:$100$维偏置向量
- $h$:$100$维隐藏层输出

第$2$层(输出层):
$$s = W_2h + b_2$$
- $W_2$:$10 \times 100$权重矩阵
- $b_2$:$10$维偏置向量
- $s$:$10$维类别分数

参数数量:
- $W_1$:$100 \times 3072 = 307,200$
- $b_1$:$100$
- $W_2$:$10 \times 100 = 1,000$
- $b_2$:$10$
- 总计:约$308,310$个参数

命名:
- "$2$层神经网络"或"$1$隐藏层神经网络"
- "全连接网络"或"多层感知机(MLP)"

2.2 激活函数的重要性(Importance of Activation Functions):引入非线性

概念的本质

激活函数是神经网络的关键组件。如果没有激活函数,多层神经网络等价于单层线性分类器。激活函数引入非线性,使神经网络能够学习复杂的模式。

图解说明
没有激活函数 多层线性变换 等价于
单层线性分类器 有激活函数 多层非线性变换 可以学习
复杂模式

💡 说明

  • 没有激活函数 : f ( x ) = W 2 ( W 1 x + b 1 ) + b 2 = ( W 2 W 1 ) x + ( W 2 b 1 + b 2 ) f(x) = W_2(W_1x + b_1) + b_2 = (W_2W_1)x + (W_2b_1 + b_2) f(x)=W2(W1x+b1)+b2=(W2W1)x+(W2b1+b2),仍然是线性变换
  • 有激活函数 : f ( x ) = W 2 max ⁡ ( 0 , W 1 x + b 1 ) + b 2 f(x) = W_2 \max(0, W_1x + b_1) + b_2 f(x)=W2max(0,W1x+b1)+b2,引入非线性
  • 结论:激活函数是神经网络强大的关键

类比理解

想象你在做计算。激活函数就像:

  • 没有激活函数:只是简单的加减乘除(线性)
  • 有激活函数:引入了"阈值"、"选择"等非线性操作
  • 结果:可以表达更复杂的函数

实际例子

复制代码
激活函数的重要性:

没有激活函数:
$h = W_1x + b_1$(线性)
$$s = W_2h + b_2 = W_2(W_1x + b_1) + b_2$$
$$= (W_2W_1)x + (W_2b_1 + b_2)$$
$$= W'x + b'$$(仍然是线性!)

有激活函数(ReLU):
$h = \max(0, W_1x + b_1)$(非线性)
$s = W_2h + b_2$(线性)
整体:非线性函数

为什么需要非线性?
- 线性函数的组合仍然是线性函数
- 只有非线性函数才能学习非线性模式
- 激活函数引入非线性,使神经网络强大

2.3 常见的激活函数(Common Activation Functions):ReLU、Sigmoid、Tanh等

概念的本质

常见的激活函数包括ReLU、Sigmoid、Tanh、Leaky ReLU、Maxout、ELU等。ReLU是最常用的默认选择,因为它简单、高效,且在实践中表现良好。

图解说明
激活函数 ReLU
max(0, x) Sigmoid
1/(1+e^(-x)) Tanh
tanh(x) Leaky ReLU
max(0.01x, x) 最常用
默认选择

💡 说明

  • ReLU : max ⁡ ( 0 , x ) \max(0, x) max(0,x),简单高效,最常用
  • Sigmoid : 1 1 + e − x \frac{1}{1+e^{-x}} 1+e−x1,输出 0 0 0- 1 1 1,但容易饱和
  • Tanh : tanh ⁡ ( x ) \tanh(x) tanh(x),输出 − 1 -1 −1到 1 1 1,比Sigmoid好
  • Leaky ReLU : max ⁡ ( 0.01 x , x ) \max(0.01x, x) max(0.01x,x),解决ReLU的"死神经元"问题

类比理解

想象你在处理信号。激活函数就像:

  • ReLU:只传递正信号,简单直接
  • Sigmoid:平滑压缩到0-1,像"开关"
  • Tanh:平滑压缩到-1到1,像"平衡器"

实际例子

复制代码
激活函数的比较:

ReLU:$f(x) = \max(0, x)$
- 优点:简单、高效、不会饱和
- 缺点:$x<0$时梯度为$0$(死神经元)
- 应用:最常用,默认选择

Sigmoid:$f(x) = \frac{1}{1+e^{-x}}$
- 优点:输出$0$-$1$,适合概率
- 缺点:容易饱和,梯度消失
- 应用:输出层(二分类)

Tanh:$f(x) = \tanh(x)$
- 优点:输出$-1$到$1$,零中心
- 缺点:仍然可能饱和
- 应用:隐藏层(较少用)

Leaky ReLU:$f(x) = \max(0.01x, x)$
- 优点:解决ReLU的死神经元问题
- 缺点:需要选择斜率参数
- 应用:替代ReLU

选择建议:
- 隐藏层:ReLU(默认)
- 输出层:根据任务选择(Sigmoid、Softmax等)

2.4 神经网络的容量(Neural Network Capacity):更多神经元=更强能力

概念的本质

神经网络的容量(表示能力)与神经元的数量相关。更多的神经元意味着更强的表示能力,可以学习更复杂的模式。但也要注意过拟合的风险。

图解说明
神经网络容量 更多神经元
更强能力 可以学习
更复杂模式 但可能
过拟合 需要平衡
容量和泛化

💡 说明

  • 容量:神经网络的表示能力
  • 更多神经元:更强的容量,可以学习更复杂的模式
  • 权衡:需要平衡容量和泛化能力,避免过拟合

类比理解

想象你在学习。神经网络的容量就像:

  • 更多神经元:像有更多的"脑细胞",可以学习更复杂的知识
  • 但要注意:如果"记忆"太多细节,可能无法泛化到新问题
  • 平衡:找到合适的"脑容量"

实际例子

复制代码
神经网络容量的例子:

小网络(100个隐藏神经元):
- 参数少:约308,310个
- 容量小:可能无法学习复杂模式
- 泛化好:不容易过拟合

大网络(1000个隐藏神经元):
- 参数多:约3,083,010个
- 容量大:可以学习复杂模式
- 可能过拟合:需要正则化

选择原则:
- 从简单开始:先尝试小网络
- 逐步增加:如果欠拟合,增加神经元
- 使用正则化:防止过拟合
- 交叉验证:找到最佳容量

三、反向传播(Backpropagation):如何计算梯度

这一章要建立的基础:理解如何高效地计算神经网络的梯度

核心问题:如何计算复杂神经网络的梯度?如何高效地更新参数?


!NOTE

📝 关键点总结:反向传播通过计算图高效地计算梯度。使用链式法则,从输出层向输入层反向传播梯度。计算图将复杂的函数分解为简单的操作,每个操作有局部梯度,通过链式法则组合得到最终梯度。

3.1 计算图(Computational Graph):将函数分解为简单操作

概念的本质

计算图将复杂的函数分解为一系列简单的操作(如加法、乘法、激活函数)。每个操作是一个节点,操作之间的依赖关系是边。通过计算图,可以高效地计算梯度。

图解说明
x * y + z f

💡 说明

  • 节点:变量或操作
  • :数据流
  • 前向传播:从输入到输出计算函数值
  • 反向传播:从输出到输入计算梯度

类比理解

想象你在做复杂的计算。计算图就像:

  • 分解:将复杂计算分解为简单步骤
  • 记录:记录每一步的计算结果
  • 反向:从结果向前追溯,计算每一步的贡献

实际例子

复制代码
计算图的例子:

函数:$f(x, y, z) = (x * y) + z$

计算图:
$x \to [*] \to q$
$y \to [*] \to q \to [+] \to f$
$z \to [+] \to f$

前向传播($x=-2, y=5, z=-4$):
$$q = x * y = -2 * 5 = -10$$
$$f = q + z = -10 + (-4) = -14$$

反向传播(计算梯度):
$$\frac{df}{df} = 1$$(起始)
$$\frac{df}{dq} = \frac{df}{df} \times \frac{df}{dq} = 1 \times 1 = 1$$
$$\frac{df}{dz} = \frac{df}{df} \times \frac{df}{dz} = 1 \times 1 = 1$$
$$\frac{df}{dx} = \frac{df}{dq} \times \frac{dq}{dx} = 1 \times y = 5$$
$$\frac{df}{dy} = \frac{df}{dq} \times \frac{dq}{dy} = 1 \times x = -2$$

优势:
- 将复杂函数分解为简单操作
- 每个操作有简单的局部梯度
- 通过链式法则组合得到最终梯度

3.2 链式法则(Chain Rule):反向传播的数学基础

概念的本质

链式法则是反向传播的数学基础。如果 y = f ( u ) y = f(u) y=f(u), u = g ( x ) u = g(x) u=g(x),那么 d y d x = d y d u × d u d x \frac{dy}{dx} = \frac{dy}{du} \times \frac{du}{dx} dxdy=dudy×dxdu。在反向传播中,上游梯度乘以局部梯度得到下游梯度。

图解说明
x 局部梯度
du/dx u 局部梯度
dy/du y 上游梯度
dy/dy=1 下游梯度
dy/dx

💡 说明

  • 链式法则 : d y d x = d y d u × d u d x \frac{dy}{dx} = \frac{dy}{du} \times \frac{du}{dx} dxdy=dudy×dxdu
  • 上游梯度 :从输出传来的梯度( d y d u \frac{dy}{du} dudy)
  • 局部梯度 :当前操作的梯度( d u d x \frac{du}{dx} dxdu)
  • 下游梯度 :传递给输入的梯度( d y d x = 上游梯度 × 局部梯度 \frac{dy}{dx} = 上游梯度 \times 局部梯度 dxdy=上游梯度×局部梯度)

类比理解

想象你在传递信息。链式法则就像:

  • 上游梯度:从后面传来的"影响"
  • 局部梯度:当前步骤的"放大倍数"
  • 下游梯度:传递给前面的"总影响" = 影响 × 放大倍数

实际例子

复制代码
链式法则的例子:

函数:$f(x, y) = (x + y) * z$

计算图:
$x \to [+] \to q \to [*] \to f$
$y \to [+] \to q$
$z \to [*] \to f$

前向传播($x=-2, y=5, z=-4$):
$$q = x + y = -2 + 5 = 3$$
$$f = q * z = 3 * (-4) = -12$$

反向传播:

步骤1:计算$\frac{df}{df} = 1$

步骤2:计算$\frac{df}{dq}$(乘法门):
$$\frac{df}{dq} = \frac{df}{df} \times \frac{df}{dq} = 1 \times z = -4$$
$$\frac{df}{dz} = \frac{df}{df} \times \frac{df}{dz} = 1 \times q = 3$$

步骤3:计算$\frac{df}{dx}$和$\frac{df}{dy}$(加法门):
$$\frac{df}{dx} = \frac{df}{dq} \times \frac{dq}{dx} = -4 \times 1 = -4$$
$$\frac{df}{dy} = \frac{df}{dq} \times \frac{dq}{dy} = -4 \times 1 = -4$$

链式法则的应用:
- 上游梯度:$\frac{df}{dq} = -4$
- 局部梯度:$\frac{dq}{dx} = 1$(加法门)
- 下游梯度:$\frac{df}{dx} = -4 \times 1 = -4$

3.3 常见操作的梯度模式(Gradient Patterns):加法门、乘法门、最大值门

概念的本质

不同操作有不同的梯度传播模式:

  • 加法门:梯度分配器,梯度直接传递
  • 乘法门:梯度交换器,梯度乘以另一个输入
  • 最大值门:梯度路由器,梯度只传递给最大值

图解说明
操作类型 加法门
梯度分配器 乘法门
梯度交换器 最大值门
梯度路由器 梯度直接传递
不改变 梯度乘以
另一个输入 梯度只传递给
最大值

💡 说明

  • 加法门 : f ( x , y ) = x + y f(x, y) = x + y f(x,y)=x+y, d f d x = 1 \frac{df}{dx} = 1 dxdf=1, d f d y = 1 \frac{df}{dy} = 1 dydf=1(梯度直接传递)
  • 乘法门 : f ( x , y ) = x ∗ y f(x, y) = x * y f(x,y)=x∗y, d f d x = y \frac{df}{dx} = y dxdf=y, d f d y = x \frac{df}{dy} = x dydf=x(梯度乘以另一个输入)
  • 最大值门 : f ( x , y ) = max ⁡ ( x , y ) f(x, y) = \max(x, y) f(x,y)=max(x,y),梯度只传递给最大值

类比理解

想象你在分配资源。梯度模式就像:

  • 加法门:资源平均分配(各得一份)
  • 乘法门:资源按比例分配(乘以另一个值)
  • 最大值门:资源只给最大的(赢者通吃)

实际例子

复制代码
梯度模式的例子:

1. 加法门:$f(x, y) = x + y$
   上游梯度:$\frac{df}{df} = 1$
   局部梯度:$\frac{df}{dx} = 1$,$\frac{df}{dy} = 1$
   下游梯度:
   - $\frac{df}{dx} = 1 \times 1 = 1$(直接传递)
   - $\frac{df}{dy} = 1 \times 1 = 1$(直接传递)

2. 乘法门:$f(x, y) = x * y$
   上游梯度:$\frac{df}{df} = 1$
   局部梯度:$\frac{df}{dx} = y$,$\frac{df}{dy} = x$
   下游梯度:
   - $\frac{df}{dx} = 1 \times y = y$(乘以另一个输入)
   - $\frac{df}{dy} = 1 \times x = x$(乘以另一个输入)

3. 最大值门:$f(x, y) = \max(x, y)$
   如果$x > y$:
   - $\frac{df}{dx} = 1$(梯度传递)
   - $\frac{df}{dy} = 0$(梯度不传递)
   如果$y > x$:
   - $\frac{df}{dx} = 0$(梯度不传递)
   - $\frac{df}{dy} = 1$(梯度传递)

这些模式帮助我们:
- 快速理解梯度如何传播
- 高效实现反向传播
- 调试梯度计算

3.4 反向传播的实现(Backpropagation Implementation):前向传播和反向传播

概念的本质

反向传播的实现包括两个阶段:

  1. 前向传播:从输入到输出计算函数值,保存中间结果
  2. 反向传播:从输出到输入计算梯度,使用保存的中间结果

图解说明
输入x 前向传播
Forward Pass 保存中间结果
q, f等 输出f 反向传播
Backward Pass 使用中间结果
计算梯度 梯度
df/dx等

💡 说明

  • 前向传播:计算函数值,保存中间结果(用于反向传播)
  • 反向传播:计算梯度,使用保存的中间结果
  • 实现:每个操作实现forward()和backward()方法

类比理解

想象你在做复杂的计算。反向传播就像:

  • 前向传播:一步步计算,记录每一步的结果
  • 反向传播:从结果向前追溯,使用记录的结果计算每一步的贡献

实际例子

复制代码
反向传播的实现:

前向传播:
def forward(x, y, z):
    q = x + y  # 保存q
    f = q * z  # 保存f和z
    return f

反向传播:
def backward(upstream_grad):
    # upstream_grad = df/df = 1
    df_dq = upstream_grad * z  # 使用保存的z
    df_dz = upstream_grad * q  # 使用保存的q
    
    df_dx = df_dq * 1  # 加法门
    df_dy = df_dq * 1  # 加法门
    
    return df_dx, df_dy, df_dz

关键点:
- 前向传播时保存中间结果
- 反向传播时使用保存的结果
- 避免重复计算,提高效率

模块化实现:
- 每个操作是一个模块
- 实现forward()和backward()方法
- 组合成复杂的网络

四、向量和矩阵的反向传播(Vector/Matrix Backpropagation):处理高维数据

这一章要建立的基础:理解如何计算向量和矩阵的梯度

核心问题:如何计算高维数据的梯度?如何高效地处理矩阵运算?


!NOTE

📝 关键点总结:向量和矩阵的反向传播使用雅可比矩阵(Jacobian)。但不需要显式构造雅可比矩阵,而是使用隐式乘法。梯度dL/dx的形状总是与x相同。

4.1 向量反向传播(Vector Backpropagation):使用雅可比矩阵

概念的本质

对于向量函数y = f(x),梯度是雅可比矩阵(Jacobian)。但不需要显式构造雅可比矩阵,而是使用隐式乘法。对于逐元素操作(如ReLU),雅可比矩阵是对角矩阵,可以直接计算。

图解说明
向量x

x1, x2, x3, x4\] 函数f 逐元素操作 向量y \[y1, y2, y3, y4\] 上游梯度 dL/dy 雅可比矩阵 dy/dx 下游梯度 dL/dx > 💡 **说明**: > > * **雅可比矩阵**:dy/dx,描述y的每个元素如何受x的每个元素影响 > * **逐元素操作**:雅可比矩阵是对角矩阵,可以直接计算 > * **隐式乘法**:不需要显式构造雅可比矩阵,直接计算dL/dx **类比理解**: 想象你在处理多个变量。向量反向传播就像: * **雅可比矩阵**:描述每个输出如何受每个输入影响 * **逐元素操作**:每个输出只受对应输入影响(对角矩阵) * **隐式计算**:不需要存储整个矩阵,直接计算结果 **实际例子**: 向量反向传播的例子(ReLU): 函数:f(x) = max(0, x)(逐元素) 输入:x = [1, -2, 3, -1] 输出:y = [1, 0, 3, 0] 上游梯度:dL/dy = [4, -1, 5, 9] 雅可比矩阵(对角): dy/dx = [1, 0, 0, 0] [0, 0, 0, 0] [0, 0, 1, 0] [0, 0, 0, 0] 下游梯度: dL/dx = (dy/dx) × (dL/dy) = [1×4, 0×(-1), 0×5, 0×9] [0×4, 0×(-1), 0×5, 0×9] [0×4, 0×(-1), 1×5, 0×9] [0×4, 0×(-1), 0×5, 0×9] = [4, 0, 5, 0](逐元素) 简化计算: - 对于x[i] > 0:dL/dx[i] = dL/dy[i] - 对于x[i] ≤ 0:dL/dx[i] = 0 - 不需要显式构造雅可比矩阵 *** ** * ** *** #### 4.2 矩阵反向传播(Matrix Backpropagation):矩阵乘法的梯度 **概念的本质**: 对于矩阵乘法y = xW,梯度计算需要考虑矩阵的形状。dL/dx的形状与x相同,dL/dW的形状与W相同。使用矩阵乘法的规则计算梯度。 **图解说明**: 矩阵x \[N×D\] 矩阵乘法 y = xW 矩阵W \[D×M\] 矩阵y \[N×M\] 上游梯度 dL/dy \[N×M\] 计算梯度 dL/dx \[N×D\] dL/dW \[D×M

💡 说明

  • 矩阵乘法:y = xW,其中x是[N×D],W是[D×M],y是[N×M]
  • 梯度形状:dL/dx是[N×D],dL/dW是[D×M],与输入形状相同
  • 计算公式:dL/dx = dL/dy × W^T,dL/dW = x^T × dL/dy

类比理解

想象你在做矩阵运算。矩阵反向传播就像:

  • 形状匹配:梯度的形状必须与输入相同
  • 矩阵转置:需要转置来匹配形状
  • 矩阵乘法:通过矩阵乘法组合梯度

实际例子

复制代码
矩阵反向传播的例子:

前向传播:
x: [2×3] = [[2, 1, -3],
            [-3, 4, 2]]
W: [3×4] = [[3, 2, 1, -1],
            [2, 1, 3, 2],
            [3, 2, 1, -2]]
y = xW: [2×4] = [[13, 9, -2, -6],
                 [5, 2, 17, 1]]

上游梯度:
dL/dy: [2×4] = [[2, 3, -3, 9],
                [-8, 1, 4, 6]]

反向传播:

dL/dx = dL/dy × W^T
      = [2×4] × [4×3]
      = [2×3]

dL/dW = x^T × dL/dy
      = [3×2] × [2×4]
      = [3×4]

关键点:
- 梯度形状与输入形状相同
- 使用转置匹配形状
- 不需要显式构造雅可比矩阵(太大)
- 直接计算最终梯度

📝 本章总结

核心要点回顾

  1. 线性分类器的局限性

    • 只能学习线性决策边界
    • 无法处理复杂的非线性模式
  2. 神经网络架构

    • 多层感知机(MLP)
    • 全连接层堆叠
    • 激活函数引入非线性
  3. 激活函数

    • ReLU是最常用的默认选择
    • 激活函数是神经网络强大的关键
  4. 反向传播

    • 通过计算图高效计算梯度
    • 使用链式法则组合局部梯度
    • 前向传播保存中间结果,反向传播使用
  5. 向量和矩阵反向传播

    • 使用雅可比矩阵(但隐式计算)
    • 梯度形状与输入形状相同
    • 不需要显式构造大矩阵

知识地图
神经网络与反向传播 神经网络架构
MLP 激活函数
ReLU等 反向传播
Backprop 全连接层
Fully-connected 多层堆叠
Multi-layer 非线性变换
Non-linearity ReLU默认
Default choice 计算图
Computational Graph 链式法则
Chain Rule 向量/矩阵
Vector/Matrix

关键决策点

  • 选择网络大小:从简单开始,逐步增加容量
  • 选择激活函数:ReLU是默认选择
  • 实现反向传播:使用计算图和链式法则
  • 处理高维数据:使用隐式矩阵乘法,避免显式构造大矩阵
  • 调试梯度:使用数值梯度检查解析梯度

📚 延伸阅读

推荐资源

  1. CS231n课程:Stanford CS231n: Convolutional Neural Networks for Visual Recognition

    • 详细的神经网络和反向传播课程
  2. 经典论文

    • "Backpropagation Through Time" - RNN的反向传播
    • "Deep Learning" (Goodfellow et al.) - 深度学习的理论基础
  3. 下一步学习

    • 卷积神经网络:处理图像数据的强大模型
    • 循环神经网络:处理序列数据
    • 优化技巧:批量归一化、Dropout等
相关推荐
一水鉴天3 小时前
整体设计 定稿 之 5 讨论问题汇总 和新建 表述总表/项目结构表 文档分析,到读表工具核心设计讨论(豆包助手)
数据库·人工智能·重构
源于花海3 小时前
迁移学习的基本方法——基于样本、特征、模型、关系的迁移
人工智能·机器学习·迁移学习
Xiaoxiaoxiao02093 小时前
GAEA AudioVisual:用“真实情绪数据”训练 AI 的一次尝试
人工智能
怎么全是重名3 小时前
Stacked U-Nets: A No-Frills Approach to Natural Image Segmentation
深度学习·神经网络·计算机视觉·语义分割
Deepoch3 小时前
具身智能:正打破农业机器人的“自动化孤岛”
人工智能·机器人·自动化·具身模型·deepoc
志凌海纳SmartX3 小时前
AI知识科普丨学习框架和推理引擎有什么区别?
人工智能
free-elcmacom3 小时前
机器学习高阶教程<2>优化理论实战:BERT用AdamW、强化学习爱SGD
人工智能·python·机器学习·bert·强化学习·大模型训练的优化器选择逻辑
古城小栈4 小时前
教育科技:AI+Java 智能题库系统开发实践
java·人工智能·科技
心疼你的一切4 小时前
生成式AI_GAN与扩散模型详解
人工智能·深度学习·神经网络·机器学习·生成对抗网络