🎨
Bible-DeepLearning
  • Introduction
  • 第6章 深度前馈网络
    • 6.1 例子:学习XOR
    • 6.2 基于梯度的学习
      • 6.2.1 代价函数
        • 6.2.1.1 使用最大似然学习条件分布
        • 6.2.1.2 学习条件统计量
      • 6.2.2 输出单元
        • 6.2.2.1 用于高斯输出分布的线性神单元
        • 6.2.2.2 用于Bernoulli输出分布的sigmoid单元
        • 6.2.2.3 用于Multinoulli输出分布的softmax单元
    • 6.3 隐藏单元
      • 6.3.1 ReLU及其扩展
      • 6.3.2 logistic sigmoid与双曲正切函数
      • 6.3.3 其他隐藏单元
      • 李宏毅补充 SELU
    • 6.4 架构设计
    • 6.5 反向传播和其他的微分算法
      • 6.5.1 计算图
      • 6.5.2 微积分中的链式法则
      • 6.5.3 递归地使用链式法则来实现反向传播
      • 6.5.4 全连接MLP中的反向传播计算
      • 6.5.5 符号到符号的导数
      • 6.5.6 一般化的反向传播
      • 6.5.7 实例:用于MLP 训练的反向传播
      • 6.5.8 复杂化
  • 第7章 深度学习中的正则化
    • 7.1 参数范数惩罚
      • 7.1.1 L2参数正则化
      • 7.1.2 L1参数正则化
    • 7.2 作为约束的范数惩罚
    • 7.3 正则化和欠约束问题
    • 7.4 数据集增强
    • 7.5 噪声鲁棒性
    • 7.6 半监督学习
    • 7.7 多任务学习
    • 7.8 提前终止
    • 7.9 参数绑定和参数共享
    • 7.10 稀疏表示
    • 7.11 Bagging 和其他集成方法
    • 7.12 Dropout
    • 7.13 对抗训练
    • 7.14 切面距离、正切传播和流形正切分类器
    • Ag补充 一些能用于提升比赛成绩的方法
  • 第8章 深度模型中的优化
    • 8.1 学习和纯优化有什么不同
      • 8.1.1 经验风险最小化
      • 8.1.2 代理损失函数和提前终止
      • 8.1.3 批量算法和小批量算法
    • 8.2 神经网络优化中的挑战
      • 8.2.1 病态
      • 8.2.2 局部极小值
      • 8.2.3 8.2.3 高原、鞍点和其他平坦区域
      • 8.2.4 悬崖和梯度爆炸
      • 8.2.5 长期依赖
      • 8.2.6 非精确梯度
    • 8.3 基本算法
      • 8.3.1 随机梯度下降
      • 8.3.2 动量
      • 8.3.3 Nesterov 动量
    • 8.4 参数初始化策略
    • 8.5 自适应学习率算法
      • 8.5.1 AdaGrad
      • 8.5.2 RMSProp
      • 8.5.3 Adam
      • 8.5.4 选择正确的优化算法
    • 8.6 二阶近似方法
      • 8.6.1 牛顿法
      • 8.6.2 共轭梯度
      • 8.6.3 BFGS
    • 8.7 优化策略和元算法
      • 8.7.1 批标准化
      • 8.7.2 坐标下降
      • 8.7.3 Polyak 平均
      • 8.7.4 监督预训练
      • 8.7.5 设计有助于优化的模型
  • 第9章 卷积网络
    • 9.1 卷积运算
    • 9.2 动机
    • 9.3 池化
    • 9.4 卷积与池化作为一种无限强的先验
    • 9.5 基本卷积函数的变体
    • 9.6 结构化输出
    • 9.7 数据类型
  • 第10章 序列建模:循环和递归网络
    • 10.1 展开计算图
    • 10.2 循环神经网络
      • 10.2.1 导师驱动过程和输出循环网络
      • 10.2.2 计算循环神经网络的梯度
      • 10.2.3 作为有向图模型的循环网络
      • 10.2.4 基于上下文的RNN序列建模
    • 10.3 双向RNN
    • 10.4 基于编码 - 解码的序列到序列架构
    • 10.5 深度循环网络
    • 10.6 递归神经网络
    • 10.7 长期依赖的挑战
    • 10.9 渗漏单元和其他多时间尺度的策略
    • 10.10 长短期记忆和其他门控RNN
      • 10.10.1 LSTM
      • 10.10.2 其他门控RNN
    • 10.11 优化长期依赖
      • 10.11.1 梯度截断
      • 10.11.2 引导信息流的正则化
    • 10.12 外显记忆
  • 第11章 实践方法论
    • 11.1 性能度量
    • 11.2 默认的基准模型
    • 11.3 决定是否收集更多数据
    • 11.4 选择超参数
      • 11.4.1 手动选择超参数
      • 11.4.3 网络搜索
      • 11.4.4 随机搜索
    • 11.5 调试策略
Powered by GitBook
On this page

Was this helpful?

  1. 第11章 实践方法论
  2. 11.4 选择超参数

11.4.1 手动选择超参数

Previous11.4 选择超参数Next11.4.3 网络搜索

Last updated 4 years ago

Was this helpful?

手动设置超参数,我们必须了解超参数、训练误差、泛化误差和计算资源(内存和运行时间)之间的关系。 这需要切实了解一个学习算法有效容量的基础概念,如\chap?所描述的。

手动搜索超参数的目标通常是最小化受限于运行时间和内存预算的泛化误差。 我们不去探讨如何确定各种超参数对运行时间和内存的影响,因为这高度依赖于平台。

手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性。 有效容量受限于三个因素:模型的表示容量、学习算法成功最小化训练模型代价函数的能力以及代价函数和训练过程正则化模型的程度。 具有更多网络层,每层有更多隐藏单元的模型具有较高的表示能力——能够表示更复杂的函数。 然而,如果训练算法不能找到某个合适的函数来最小化训练代价,或是正则化项(如权重衰减)排除了这些合适的函数,那么即使模型的表达能力较高,也不能学习出合适的函数。%?? 还是太乱

当泛化误差以某个超参数为变量,作为函数绘制出来时,通常会表现为U形曲线,如\fig?所示。 在某个极端情况下,超参数对应着低容量,并且泛化误差由于训练误差较大而很高。 这便是欠拟合的情况。 另一种极端情况,超参数对应着高容量,并且泛化误差由于训练误差和测试误差之间的差距较大而很高。 最优的模型容量位于曲线中间的某个位置,能够达到最低可能的泛化误差,由某个中等的泛化差距(generalization gap)和某个中等的训练误差相加构成。

对于某些超参数,当超参数数值太大时,会发生过拟合。 例如中间层隐藏单元的数量,增加数量能提高模型的容量,容易发生过拟合。%?? 原文不符 对于某些超参数,当超参数数值太小时,也会发生过拟合。 例如,最小的权重衰减系数允许为零,此时学习算法具有最大的有效容量,反而容易过拟合。%?? 原文不符 这一段好像偏差较大

并非每个超参数都能对应着完整的U形曲线。 很多超参数是离散的,如中间层单元数目或是~maxout单元中线性元件的数目,这种情况只能沿曲线探索一些点。 有些超参数是二值的。 通常这些超参数用来指定是否使用学习算法中的一些可选部分,如预处理步骤减去均值并除以标准差来标准化输入特征。 这些超参数只能探索曲线上的两点。 其他一些超参数可能会有最小值或最大值,限制其探索曲线的某些部分。%?? 例如,权重衰减系数最小是零。 这意味着,如果权重衰减系数为零时模型欠拟合,那么我们将无法通过修改权重衰减系数探索过拟合区域。 换言之,有些超参数只能减少模型容量。

学习率可能是最重要的超参数。

[success] Ng补充:超参数重要性排序 (1)学习率$\alpha$ (2)Momentum中的$\rho$(0.9)、一个隐藏层的unit数、mini-batch size(2^6,2^7,2^8,2^9) (3)层数、学习率衰减率 (4)Adam算法中的$\rho_1(0.9), \rho_2(0.999), \delta(1e-8)$ Ng补充:学习率衰减的一些方法 1 epoch = 1 pass through data

α=11+DecayRate∗epoch∗α0α=0.95epoch∗α0α=Kepoch∗α0分段函数\begin{aligned} \alpha = \frac{1}{1 + \text{DecayRate} * \text{epoch}} * \alpha_0 \\ \alpha = 0.95^{\text{epoch}} * \alpha_0 \\ \alpha = \frac{K}{\sqrt{\text{epoch}}} * \alpha_0 \\ \text{分段函数} \end{aligned}α=1+DecayRate∗epoch1​∗α0​α=0.95epoch∗α0​α=epoch​K​∗α0​分段函数​

如果你只有时间调整一个超参数,那就调整学习率。 相比其他超参数,它以一种更复杂的方式控制模型的有效容量——当学习率适合优化问题时,模型的有效容量最高,此时学习率是\emph{正确}的,既不是特别大也不是特别小。 学习率关于\emph{训练误差}具有U形曲线,如\fig?所示。 当学习率过大时,梯度下降可能会不经意地增加而非减少训练误差。 在理想化的二次情况下,如果学习率是最佳值的两倍大时,会发生这种情况{cite?}。 当学习率太小,训练不仅慢,还有可能永久停留在一个很高的训练误差。 关于这种效应,我们知之甚少(不会发生于一个凸损失函数中)。

调整学习率外的其他参数时,需要同时监测训练误差和测试误差,以判断模型是否过拟合或欠拟合,然后适当调整其容量。

如果训练集错误率大于目标错误率,那么只能增加模型容量以改进模型。

[success] 训练集错误率大于目标错误率 = 欠拟合 = 高偏差 解决方法:(1)增加网络容量(2)训练更长时间(3)探索新的网络结构

如果没有使用正则化,并且确信优化算法正确运行,那么有必要添加更多的网络层或隐藏单元。 然而,令人遗憾的是,这增加了模型的计算代价。

如果测试集错误率大于目标错误率,那么可以采取两个方法。

[success] 测试集错误率大于目标错误率 = 过拟合 = 高方差 解决方法:(1)更多的数据(2)正则化(3)探索新的网络结构

测试误差是训练误差和测试误差之间差距与训练误差的总和。

[danger] 测试误差与训练误差的定义不同。

寻找最佳的测试误差需要权衡这些数值。

[success]方差、偏差权衡 在早期的ML理论中,很难只调其中一种而不影响另一种。 在DL学习中,只要网络足够大又正则化适当就能只减少偏差。只要数据足够多就能只减小方差。

当训练误差较小(因此容量较大),测试误差主要取决于训练误差和测试误差之间的差距时,通常神经网络效果最好。 此时目标是缩小这一差距,使训练误差的增长速率不快于差距减小的速率。 要减少这个差距,我们可以改变正则化超参数,以减少有效的模型容量,如添加~Dropout~或权重衰减策略。 通常,最佳性能来自正则化得很好的大规模模型,比如使用~Dropout~的神经网络。

大部分超参数可以通过推理其是否增加或减少模型容量来设置。 部分示例如表\?所示。

手动调整超参数时,不要忘记最终目标:提升测试集性能。 加入正则化只是实现这个目标的一种方法。 只要训练误差低,随时都可以通过收集更多的训练数据来减少泛化误差。 实践中能够确保学习有效的暴力方法就是不断提高模型容量和训练集的大小,直到解决问题。 这种做法增加了训练和推断的计算代价,所以只有在拥有足够资源时才是可行的。 原则上,这种做法可能会因为优化难度提高而失败,但对于许多问题而言,优化似乎并没有成为一个显著的障碍,当然,前提是选择了合适的模型。

超参数

容量何时增加

原因

注意事项

隐藏单元数量

增加

增加隐藏单元数量会增加模型的表示能力。

几乎模型每个操作所需的时间和内存代价都会随隐藏单元数量的增加而增加。

学习率

调至最优

不正确的学习速率,不管是太高还是太低都会由于优化失败而导致低有效容量的模型。

卷积核宽度

增加

增加卷积核宽度会增加模型的参数数量。

较宽的卷积核导致较窄的输出尺寸,除非使用隐式零填充减少此影响,否则会降低模型容量。 较宽的卷积核需要更多的内存存储参数,并会增加运行时间,但较窄的输出会降低内存代价。

隐式零填充

增加

在卷积之前隐式添加零能保持较大尺寸的表示。

大多数操作的时间和内存代价会增加。

权重衰减系数

降低

降低权重衰减系数使得模型参数可以自由地变大。

Dropout 比率

降低

较少地丢弃单元可以更多地让单元彼此"协力"来适应训练集。