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

2025博客之星年度评选已开启 10w+人浏览 1.1k人参与

📌 适合对象:计算机视觉初学者、深度学习入门者
⏱️ 预计阅读时间: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+ex1,输出 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)=xy 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等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值