文章目录
📌 适合对象:计算机视觉初学者、深度学习入门者
⏱️ 预计阅读时间:60-70分钟
🎯 学习目标:理解神经网络的架构和原理,掌握反向传播算法,学会计算复杂模型的梯度
📚 学习路线图
本文内容一览(快速理解)
- 线性分类器的局限性(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问题:
类别1:第一象限和第三象限
类别2:第二象限和第四象限
- 无法用一条直线分开
- 需要两条直线(非线性)
2. 多模态分布:
类别1:两个分离的区域
类别2:其他区域
- 线性分类器只能用一个超平面
- 无法处理多个分离的区域
3. 环形分布:
类别1:$L_2$范数在$1$到$2$之间
类别2:其他
- 需要环形边界
- 线性分类器无法处理
解决方案:
- 特征变换:手动设计特征(如HoG、颜色直方图)
- 神经网络:自动学习特征和分类边界
1.2 特征变换的解决方案(Feature Transformation):手动设计特征
概念的本质:
一种解决方案是手动设计特征变换,将原始数据转换到新的特征空间,然后在新空间中使用线性分类器。例如,将笛卡尔坐标(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。通过添加隐藏层和激活函数,神经网络可以学习非线性模式。
图解说明:
💡 说明:
- 输入层:原始数据(如 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 ) \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):将函数分解为简单操作
概念的本质:
计算图将复杂的函数分解为一系列简单的操作(如加法、乘法、激活函数)。每个操作是一个节点,操作之间的依赖关系是边。通过计算图,可以高效地计算梯度。
图解说明:
💡 说明:
- 节点:变量或操作
- 边:数据流
- 前向传播:从输入到输出计算函数值
- 反向传播:从输出到输入计算梯度
类比理解:
想象你在做复杂的计算。计算图就像:
- 分解:将复杂计算分解为简单步骤
- 记录:记录每一步的计算结果
- 反向:从结果向前追溯,计算每一步的贡献
实际例子:
计算图的例子:
函数:$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。在反向传播中,上游梯度乘以局部梯度得到下游梯度。
图解说明:
💡 说明:
- 链式法则: 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):前向传播和反向传播
概念的本质:
反向传播的实现包括两个阶段:
- 前向传播:从输入到输出计算函数值,保存中间结果
- 反向传播:从输出到输入计算梯度,使用保存的中间结果
图解说明:
💡 说明:
- 前向传播:计算函数值,保存中间结果(用于反向传播)
- 反向传播:计算梯度,使用保存的中间结果
- 实现:每个操作实现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),雅可比矩阵是对角矩阵,可以直接计算。
图解说明:
💡 说明:
- 雅可比矩阵: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相同。使用矩阵乘法的规则计算梯度。
图解说明:
💡 说明:
- 矩阵乘法: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是最常用的默认选择
- 激活函数是神经网络强大的关键
-
反向传播:
- 通过计算图高效计算梯度
- 使用链式法则组合局部梯度
- 前向传播保存中间结果,反向传播使用
-
向量和矩阵反向传播:
- 使用雅可比矩阵(但隐式计算)
- 梯度形状与输入形状相同
- 不需要显式构造大矩阵
知识地图:
关键决策点:
- 选择网络大小:从简单开始,逐步增加容量
- 选择激活函数:ReLU是默认选择
- 实现反向传播:使用计算图和链式法则
- 处理高维数据:使用隐式矩阵乘法,避免显式构造大矩阵
- 调试梯度:使用数值梯度检查解析梯度
📚 延伸阅读
推荐资源
-
CS231n课程:Stanford CS231n: Convolutional Neural Networks for Visual Recognition
- 详细的神经网络和反向传播课程
-
经典论文:
- “Backpropagation Through Time” - RNN的反向传播
- “Deep Learning” (Goodfellow et al.) - 深度学习的理论基础
-
下一步学习:
- 卷积神经网络:处理图像数据的强大模型
- 循环神经网络:处理序列数据
- 优化技巧:批量归一化、Dropout等
1510

被折叠的 条评论
为什么被折叠?



