深层神经网络
深层神经网络(Deep L-layer neural network)
- 神经网络的层数定义:
- 输入层称为第 0 层,不计入隐藏层和输出层的总数。
- 一个隐藏层的神经网络实际上是一个两层神经网络(隐藏层 + 输出层)。
- 深度学习模型通常由多个隐藏层组成。
- 深度神经网络的重要性:
- 逻辑回归可以看作是最简单的神经网络(没有隐藏层)。
- 过去的研究表明,某些复杂的函数只有深层神经网络才能有效学习,而浅层模型无法胜任。
- 在实践中,需要通过实验选择合适的隐藏层数量,作为超参数进行调整。
- 深度学习的实验策略:
- 先尝试逻辑回归模型。
- 再尝试一个隐藏层(两层网络)。
- 逐步增加隐藏层数量,进行交叉验证,选择最优结构。
前向传播和反向传播(Forward and backward propagation)
1. 前向传播(Forward Propagation)
在深度神经网络中,每一层的输入为 A[l-1],输出为 A[l],并缓存中间计算值 Z[l]。
为了后续使用,我们通常也会缓存 W[l] 和 b[l]。
计算步骤
对于单个神经元:
Z[l] = W[l] * A[l-1] + b[l]A[l] = g[l](Z[l])
向量化实现:
Z[l] = W[l] @ A[l-1] + b[l]A[l] = g[l](Z[l])
其中:
@表示矩阵乘法g[l]()是激活函数,例如ReLU或SigmoidA[0] = X代表输入数据
流程
- 传入输入
X - 逐层计算
Z[l]和A[l] - 最终得到输出
A[L]
2. 反向传播(Backward Propagation)
反向传播用于计算梯度,更新 W[l] 和 b[l],使网络的预测更精准。
计算步骤
反向传播的输入是 dA[l],输出是 dA[l-1]、dW[l] 和 db[l]。
dZ[l] = dA[l] * g'[l](Z[l])(计算激活函数梯度)dW[l] = (1/m) * dZ[l] @ A[l-1].T(计算权重梯度)db[l] = (1/m) * np.sum(dZ[l], axis=1, keepdims=True)(计算偏置梯度)dA[l-1] = W[l].T @ dZ[l](传递误差到前一层)
说明:
g'[l](Z[l])是激活函数的导数m是样本数量np.sum(..., axis=1, keepdims=True)用于保持正确的矩阵维度
3. 总结
- 前向传播:
Z = W * A + bA = g(Z)
- 反向传播:
dZ = dA * g'(Z)dW = (1/m) * dZ * A.Tdb = (1/m) * np.sum(dZ)dA_prev = W.T * dZ
- 实现过程:
- 初始化参数
- 前向传播
- 计算损失
- 反向传播
- 更新参数
- 循环迭代训练
深层网络中的前向和反向传播(Forward propagation in a Deep Network)
1. 理解前向传播
在深度神经网络中,前向传播是从输入层 X 开始,逐层计算 Z[l] 和 A[l],最终得到输出 A[L]。这个过程可以看作多个单层的前向传播叠加而成。
对于单个训练样本 x:
- 第一层:
Z[1] = W[1] * x + b[1]A[1] = g[1](Z[1])
- 第二层:
Z[2] = W[2] * A[1] + b[2]A[2] = g[2](Z[2])
- 第
L层:
Z[L] = W[L] * A[L-1] + b[L]A[L] = g[L](Z[L])(最终输出)
可以归纳为递推公式:
Z[l] = W[l] * A[l-1] + b[l]A[l] = g[l](Z[l])- 其中
A[0] = X(输入数据)
2. 向量化实现
在深度神经网络的实现过程中,我们希望避免 for 循环,但前向传播不可避免地需要逐层计算,因此 仍需使用 for 循环。
对于 m 个样本 的向量化版本:
Z[l] = W[l] @ A[l-1] + b[l]A[l] = g[l](Z[l])
这里:
A[0] = X是输入数据W[l]是权重矩阵b[l]是偏置项@表示矩阵乘法g[l]()是激活函数(如 ReLU、Sigmoid)
核对矩阵的维数(Getting your matrix dimensions right)
在实现深度神经网络时,一个常见的问题是矩阵维数错误。为了确保代码正确,我们需要在实现每个公式之前,仔细检查其输入和输出矩阵的形状。
1. 基本的矩阵维数
在第 l 层的神经网络中:
- 输入数据
X维度:(n[0], m),n[0]是输入特征数,m是样本数 - 权重矩阵
W[l]维度:(n[l], n[l-1]),n[l]是该层神经元数,n[l-1]是前一层神经元数 - 偏置
b[l]维度:(n[l], 1) - 线性变换
Z[l]维度:(n[l], m) - 激活值
A[l]维度:(n[l], m)
具体来看:
变量 | 维度 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. 向量化的矩阵维数
在前向传播中:
Z[l] = W[l] @ A[l-1] + b[l]A[l] = g[l](Z[l])
这里:
Z[l]的维度是(n[l], m)A[l]的维度是(n[l], m)
因为 b[l] 维度是 (n[l], 1),而 m 是样本数,所以 b[l] 会在计算时自动广播成 (n[l], m)。
3. 反向传播时的维度
在反向传播中:
- 计算
dZ[l]:
dZ[l] = dA[l] * g'[l](Z[l])- 由于
dA[l]维度是(n[l], m),所以dZ[l]也是(n[l], m)
- 计算
dW[l]:
dW[l] = (1/m) * dZ[l] @ A[l-1].TdZ[l]维度是(n[l], m)A[l-1].T维度是(m, n[l-1])- 矩阵乘法后,
dW[l]维度为(n[l], n[l-1]),与W[l]维度一致
- 计算
db[l]:
db[l] = (1/m) * np.sum(dZ[l], axis=1, keepdims=True)np.sum(dZ[l], axis=1, keepdims=True)维度是(n[l], 1)- 因此
db[l]维度是(n[l], 1),与b[l]维度一致
- 计算
dA[l-1]:
dA[l-1] = W[l].T @ dZ[l]W[l].T维度是(n[l-1], n[l])dZ[l]维度是(n[l], m)- 矩阵乘法后,
dA[l-1]维度为(n[l-1], m),与A[l-1]维度一致
为什么使用深层表示?(Why deep representations?)
深度神经网络的关键优势在于多层隐藏层可以学习更复杂的特征表示。相比之下,浅层网络在某些情况下可能需要指数级增长的神经元才能实现相同的功能。接下来,我们从几个角度来看为什么深度神经网络比浅层网络更有效。
1. 深度网络的计算方式
深度神经网络的核心思想是逐层学习更高级的特征,就像人类在处理视觉或语音任务时的方式一样。以人脸识别为例:
- 第一层:检测简单的边缘(例如水平线、垂直线)。
- 第二层:组合边缘,形成更复杂的形状,如眼睛、鼻子、嘴巴。
- 第三层:将这些特征组合成完整的面部。
- 最后层:识别特定的人脸。
这个过程类似于金字塔结构,从基础的特征(例如边缘、角落)到更高级的概念(如物体、面部)。如果使用浅层神经网络,要直接从原始像素点学习到面部结构,将需要大量的神经元才能表示复杂模式。
2. 语音识别中的深层表示
深度学习不仅适用于图像处理,在语音识别中也是如此:
- 第一层:检测音频波形的基本特征,如音调、噪声。
- 第二层:组合基本声音特征,形成更复杂的单元,如音素(phoneme)。
- 第三层:识别单词。
- 第四层:组合单词,形成完整的句子。
这个过程展示了深层网络如何从低级信息(音调、音素),逐步提取出更高级的信息(单词、句子)。
3. 深度 vs. 浅层网络
3.1 计算 XOR(异或)函数
假设我们想用神经网络计算 XOR(异或)函数:
- 深度网络(多层):
- 可以通过多个层次的逻辑门高效计算 XOR 关系,计算复杂度为
O(log(n))。
- 浅层网络(单隐藏层):
- 需要列举所有
2^n种输入情况,需要O(2^n)个神经元,计算复杂度极高。
在某些数学函数的计算中,使用深层网络比浅层网络更高效,因为深层网络能够更好地组合特征,而浅层网络必须穷举所有可能性。
4. 电路理论的解释
从计算机科学角度看,深度神经网络类似于逻辑电路:
- 深层网络 = 高效的逻辑电路,可以用较少的计算单元实现复杂功能。
- 浅层网络 = 低效的逻辑电路,需要指数级增长的单元才能计算相同的函数。
因此,某些数学函数更适合由深层网络计算,而浅层网络需要大量神经元才能达到相同效果。
5. 实际应用中的启发
虽然理论上深层网络有优势,但在实际问题中:
- 不一定越深越好:最佳的层数需要实验和调参。
- 可以先尝试简单的模型:
- Logistic 回归(如果是简单分类问题)
- 1-2 层隐藏层(如果 Logistic 回归不够)
- 增加层数,调整超参数(如果更复杂的问题需要)
近几年,深度神经网络被广泛应用于计算机视觉、语音识别、自然语言处理等领域,有些任务需要非常深的网络(如 ResNet、Transformer),但不是所有问题都需要极深的网络。
6. 关键总结
- 深度网络逐层学习复杂特征
- 低层:检测简单特征(边缘、音调)
- 高层:组合成复杂特征(面部、单词)
- 顶层:识别具体目标(人脸、语句)
- 深层网络比浅层网络更高效
- 对于某些计算任务(如 XOR),深层网络需要较少的神经元,浅层网络需要指数级增长的神经元。
- 深度学习 vs. 传统神经网络
- 以前只是“多层神经网络”(MLP),但“深度学习”这个名字更吸引人,推动了研究发展。
- 目前在多个领域(CV、NLP、ASR)中,深度神经网络是最佳选择。
搭建神经网络块(Building blocks of deep neural networks)
在前面的内容中,我们已经学习了前向传播和反向传播的基础知识,现在我们把这些模块组合起来,构建一个完整的深度神经网络。我们主要拆解出以下几个核心组件:
- 前向传播(Forward Propagation)
- 反向传播(Backward Propagation)
- 缓存机制(Caching)
- 参数更新(Gradient Descent)
参数VS超参数(Parameters vs Hyperparameters)
在深度学习中,参数(Parameters)和超参数(Hyperparameters)的区分非常重要。理解并合理调整这些数值可以显著影响模型的训练效果和最终性能。
1. 参数(Parameters)
参数是模型在训练过程中学习到的数值,通常包括:
W[l](权重矩阵):用于映射输入到输出,每一层l都有一个W[l]b[l](偏置向量):用于调整神经元的激活值,每一层l都有一个b[l]
参数的特点
- 通过梯度下降等优化方法学习得到
- 初始化后,在训练过程中不断更新
- 训练结束后,固定下来用于预测
2. 超参数(Hyperparameters)
超参数是需要手动设置的参数,它们会影响模型训练的方式,常见的超参数包括:
超参数 | 说明 |
| 控制梯度下降时参数更新的步长 |
| 训练过程中梯度下降的循环次数 |
| 深度神经网络中的层数 |
| 每个隐藏层的神经元个数 |
| 选择 |
| mini-batch 梯度下降中每次训练的数据量 |
| 梯度下降时的动量参数 |
| 正则化参数(如 |
| 随机失活(dropout)层的失活比例 |
超参数的特点
- 不会被神经网络自动学习,需要人为设定
- 训练前需要手动设置,影响模型的学习方式
- 需要多次实验寻找最佳值
3. 如何寻找最优超参数?
超参数的优化通常采用实验驱动的方法,即通过尝试不同的设置来找到最优值。这种方法遵循Idea → Code → Experiment → Idea 的循环:
- Idea:提出假设(如
learning rate = 0.01可能较好) - Code:实现并运行训练过程
- Experiment:观察损失函数
J的变化 - Idea:调整超参数,继续实验
示例:调节学习率
假设我们调整 learning rate (α),观察损失函数 J 的变化:
- α 太小:损失下降太慢,训练速度过慢
- α 适中:损失快速下降,并稳定收敛
- α 太大:损失震荡甚至发散
所以,我们通常先试一个学习率值,再调整更大或更小的值,看损失 J 是否下降得更快或更稳定。
4. 为什么超参数优化很重要?
- 选择不当的超参数可能导致模型表现不佳
- 需要在计算资源允许的范围内,找到合适的超参数
- 深度学习的超参数优化仍是经验性较强的领域
通常,超参数的选择不能完全通用,不同任务可能需要不同的超参数设置。
5. 经验法则
α(学习率):通常0.001 ~ 0.01之间效果较好batch size:通常32, 64, 128是较常用的值L(层数):一般3~5层对大多数问题足够,但计算机视觉任务可能需要50+层(如 ResNet)n[l](神经元数):一般64~512之间,根据任务调整regularization(正则化参数):较小值(如0.0001)有助于防止过拟合
6. 未来发展
目前,超参数优化仍然是一个研究热点,一些方法可以帮助自动寻找最佳超参数:
- 网格搜索(Grid Search):在固定范围内尝试不同的超参数组合
- 随机搜索(Random Search):随机选择超参数进行实验(往往比网格搜索更高效)
- 贝叶斯优化(Bayesian Optimization):利用概率模型来寻找最优超参数
- 自动机器学习(AutoML):使用自动化方法调整超参数,如 Google 的 AutoML、Hyperopt 等
7. 关键总结
- 参数(
W、b)由模型训练自动学习,超参数(learning rate、layers)需要手动调整 - 超参数的选择 影响模型的训练效果,通常通过实验来优化
- 学习率 (
α) 是最重要的超参数之一,选择合适的α可以加快收敛,避免发散 - 深度学习的超参数优化仍是一个经验驱动的过程,但有许多自动化方法正在发展
超参数优化
超参数优化本身就是一个热门的研究方向,并且确实有人设计了神经网络来预测和优化超参数,这也是自动机器学习(AutoML)的一个重要部分。以下是几种主要的方法:
现有的超参数优化方法
(1) 网格搜索(Grid Search)
- 遍历所有可能的超参数组合,寻找最优解
- 计算成本很高,适用于低维超参数
(2) 随机搜索(Random Search)
- 在超参数空间中随机选择值
- 在高维空间比网格搜索更高效
- 但仍然是基于运气的策略
(3) 贝叶斯优化(Bayesian Optimization)
- 通过构建一个概率模型(如高斯过程回归)来预测最优超参数
- 原理:
- 先随机选几个超参数值,计算损失
- 用这些点拟合一个概率模型
- 选择新的超参数时,基于概率模型来预测最优值
- 优点:
- 比随机搜索更智能
- 能快速找到好的超参数
神经网络预测
有研究者尝试使用神经网络来预测和优化超参数,主要有两种方法:
(1) 使用强化学习优化超参数
- Google 的 AutoML (Neural Architecture Search, NAS)
- 原理:
- 设定一个神经网络(controller network),输入不同的超参数组合
- 训练主网络,计算损失
- 用强化学习(如 REINFORCE)来调整超参数
- 优点:
- 可以发现比人工调整更优的超参数
- 可扩展到神经网络架构搜索(NAS)
- 缺点:
- 计算成本高(需要大量计算资源)
(2) 超参数预测神经网络(HyperNet)
- 这个思路是用一个神经网络预测超参数
- 训练方式:
- 先收集大量实验数据(不同超参数对应的模型性能)
- 训练一个小型神经网络,输入是任务特征(如数据集大小、任务类型)
- 输出最优的超参数值(如
learning rate、batch size) - 这个神经网络可以被用来预测新任务的最优超参数
- 优点:
- 适用于重复性任务(如类似的数据集)
- 训练一次后可以反复使用
- 缺点:
- 需要大量实验数据
- 可能泛化能力有限
未来的可能性
使用神经网络优化超参数是可行的,而且已经有一些研究和产品在应用这一方法,比如:
- Google AutoML:自动寻找最优超参数和神经网络结构
- Hyperband:结合贝叶斯优化和强化学习的方法
- Neural Architecture Search (NAS):自动优化神经网络结构
- HyperNet:利用神经网络预测超参数
但目前的问题是:
- 计算成本太高(需要大量 GPU 训练)
- 难以泛化(不同任务可能需要不同的超参数预测模型)
- 解释性较差(神经网络预测出的超参数可能没有明确的理论依据)
但未来:
- 更好的 AutoML 方法会出现
- 更高效的强化学习算法会用于超参数搜索
- 超参数预测神经网络(HyperNet)会更智能,甚至可以自适应不同任务
深度学习和大脑的关联性(What does this have to do with the brain?)
1. 深度学习 ≠ 大脑
深度学习和大脑的联系并没有我们想象的那么紧密。虽然**“神经网络”**这个名字来源于对大脑神经元的类比,但实际上:
- 现代深度学习的数学原理与大脑的工作方式相去甚远。
- 深度学习主要依赖于梯度下降、反向传播、矩阵运算,这些都没有直接的生物学对应物。
- 大脑的学习方式仍然是未解之谜,并不一定使用类似反向传播的机制。
2. 为什么人们会把深度学习和大脑联系在一起?
- 历史原因:
- 早期的人工神经网络(ANN)灵感来源于生物神经元。
- 1950-1980 年代,人们尝试用数学模型模拟神经元,但精确度有限。
- 现代深度学习的发展主要受数学优化而非神经科学驱动。
- 营销和大众传播:
- “人工神经网络”这个名字让它听起来更像大脑的工作方式。
- 科技公司和新闻媒体喜欢用“像人脑一样工作”来推广 AI 技术,尽管这个类比并不准确。
- 部分相似性:
- 人工神经元 和 生物神经元 在某种程度上有类似的概念:
- 生物神经元:接受信号(电信号),达到阈值后激活,向下游神经元传递信息。
- 人工神经元:输入数据经过加权求和并通过激活函数,产生输出传递到下一层。
- 分层处理信息:
- 大脑的视觉皮层逐层处理信息(类似 CNN )
- 深度神经网络也会分层提取特征(从边缘检测到复杂形状)
但这些相似性只是表面上的,实际的工作机制非常不同。