文章目录
-
- [📚 学习路线图](#📚 学习路线图)
- 本文内容一览(快速理解)
- [一、为什么需要神经网络(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 向量/矩阵
反向传播
本文内容一览(快速理解)
- 线性分类器的局限性(Limitations of Linear Classifiers):只能学习线性决策边界,无法处理复杂模式
- 神经网络架构(Neural Network Architecture):多层感知机(MLP),全连接层堆叠
- 激活函数(Activation Functions):引入非线性,使神经网络能够学习复杂模式
- 反向传播(Backpropagation):通过计算图高效计算梯度
- 链式法则(Chain Rule):反向传播的数学基础
- 向量和矩阵的反向传播(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):前向传播和反向传播
概念的本质:
反向传播的实现包括两个阶段:
- 前向传播:从输入到输出计算函数值,保存中间结果
- 反向传播:从输出到输入计算梯度,使用保存的中间结果
图解说明:
输入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]
关键点:
- 梯度形状与输入形状相同
- 使用转置匹配形状
- 不需要显式构造雅可比矩阵(太大)
- 直接计算最终梯度
📝 本章总结
核心要点回顾:
-
线性分类器的局限性:
- 只能学习线性决策边界
- 无法处理复杂的非线性模式
-
神经网络架构:
- 多层感知机(MLP)
- 全连接层堆叠
- 激活函数引入非线性
-
激活函数:
- ReLU是最常用的默认选择
- 激活函数是神经网络强大的关键
-
反向传播:
- 通过计算图高效计算梯度
- 使用链式法则组合局部梯度
- 前向传播保存中间结果,反向传播使用
-
向量和矩阵反向传播:
- 使用雅可比矩阵(但隐式计算)
- 梯度形状与输入形状相同
- 不需要显式构造大矩阵
知识地图:
神经网络与反向传播 神经网络架构
MLP 激活函数
ReLU等 反向传播
Backprop 全连接层
Fully-connected 多层堆叠
Multi-layer 非线性变换
Non-linearity ReLU默认
Default choice 计算图
Computational Graph 链式法则
Chain Rule 向量/矩阵
Vector/Matrix
关键决策点:
- 选择网络大小:从简单开始,逐步增加容量
- 选择激活函数:ReLU是默认选择
- 实现反向传播:使用计算图和链式法则
- 处理高维数据:使用隐式矩阵乘法,避免显式构造大矩阵
- 调试梯度:使用数值梯度检查解析梯度
📚 延伸阅读
推荐资源
-
CS231n课程:Stanford CS231n: Convolutional Neural Networks for Visual Recognition
- 详细的神经网络和反向传播课程
-
经典论文:
- "Backpropagation Through Time" - RNN的反向传播
- "Deep Learning" (Goodfellow et al.) - 深度学习的理论基础
-
下一步学习:
- 卷积神经网络:处理图像数据的强大模型
- 循环神经网络:处理序列数据
- 优化技巧:批量归一化、Dropout等