吴恩达深度学习课程二: 改善深层神经网络 第三周:超参数调整,批量标准化和编程框架(一)超参数调整

此分类用于记录吴恩达深度学习课程的学习笔记。

课程相关信息链接如下:

  1. 原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai
  2. github课程资料,含课件与笔记:吴恩达深度学习教学资料
  3. 课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案

本篇为第二课的第三周内容,3.13.3的内容。


本周为第二课的第三周内容,你会发现这周的题目很长,实际上,作为第二课的最后一周内容,这一周是对基础部分的最后补充。

在整个第一课和第二课部分,我们会了解到最基本的全连接神经网络的基本结构和一个完整的模型训练,验证的各个部分。

之后几课就会进行更多的实践和进阶内容介绍,从"通用"走向"特化"。

总的来说这周的难度不高,但也有需要理解的内容,我仍会在相对较难理解的部分增加更多基础和例子,以及最后的"人话版"总结。

本篇的内容关于超参数调整

1.超参数调整

在这两课的学习里,我们几乎每新了解一部分内容,就会引入一些新的超参数,先来看看我们至今都有哪些超参数:

类别 超参数名称 作用说明 典型默认值 / 常用范围
优化器相关 学习率(Learning Rate, lr) 控制每次更新步子的大小,是最关键的超参数 1e-3(Adam),1e-2(SGD)
动量(Momentum β) 平滑梯度方向,减少震荡 0.9
Adam 一阶矩 β₁ EMA 平滑梯度方向 0.9
Adam 二阶矩 β₂ EMA 平滑梯度平方,适应不同参数尺度 0.999
RMSprop α 平滑梯度平方幅度 0.99 or 0.9
训练过程 批次大小(Batch Size) 每次梯度更新使用的数据量 32、64、128、256
训练轮数(Epochs) 数据被完整遍历的次数 10--200
学习率衰减策略 动态调整学习率以加速收敛 视具体策略而定
模型结构 网络层数(Depth) 模型的深度影响表达能力 2--50(FC)/几十~上百(CNN/Transformer)
隐藏层维度(Width) 每层神经元数,影响模型容量 128、256、512、1024
激活函数 提供非线性表达能力 ReLU、LeakyReLU、GELU
正则化 Dropout 比例 防止过拟合 0.1--0.5
L2 正则(Weight Decay) 限制权重大小 1e-4, 1e-5
归一化(Normalization) Batch Normalization(BN) 使中间层输出分布稳定,提升训练速度 默认
Z-score 标准化 将特征转为均值为 0,方差为 1 默认
权重初始化 Xavier 初始化(Glorot) 针对 Sigmoid/Tanh,使前后层方差一致 默认
He 初始化(Kaiming) 针对 ReLU 家族,避免前向/反向信号爆炸 默认

先说明一下,Batch Normalization 是本周的内容,我们之后就会了解到。

你会发现,仅仅是基础部分,我们就已经有了这么多的超参数,而我们要应用一个个组合来测试模型的不同参数下的性能并找到更好的那个。

这就是模型训练里最普遍的比喻:炼丹

每个超参数就像一种材料,我们要努力研究每一种材料要不要加,要加多少,才能炼出效果更好的丹药,也就是我们的模型。

虽然训练过程中避免不了随机性,但我们在这方面仍总结出了一些经验,来帮助更好的调参 ,就像"丹方"。

下面就来展开一下这部分,但要提前说明的是:
它们并不绝对
它们并不绝对
它们并不绝对

我们都想找到一些被证明绝对正确,绝对更省时间,效率更高的方法,但很遗憾的是在炼丹学里目前还没有可以这么说的,调参的本质就是不断的尝试

1.1 普遍来说影响更大的超参数

在学习过程中相信你也能直观感受到,有些超参数的调整对结果影响更大。

我们依据课程内容和经验简单总结如下:

1.2 方格调参

在大致了解了哪些超参数影响更大后,我们对如何调试参数自然也有一些经验方法。

其中,早期最经典的就是方格调参,我们用课程里的图来看一看它的具体实施:

(1)典型的方格调参

很明显,就是以参数范围建立坐标系,图中用横纵坐标代表两个超参数的范围,各选取五个点形成二十五种组合来进行测试。

根据控制变量的逻辑来看,这确实是比较科学的一种做法。

但这种方法在现在也确实有其缺陷:

  1. 超参数的影响程度 :我们在上一部分大致说明了哪些超参数的调整可能对结果影响比较大,而如果调整一些影响较小的超参数可能对结果不会产生什么影响。
    举个例子,上图里,假设纵轴是学习率 ,而横纵是Adam防止除0的超参数 \(\epsilon\) ,那我们使用25种组合的成本是不是更可能只是测试了5种不同学习率带来的影响差别?
  2. 超参数的数量: 这是无法避免的点,现在我们只调整两种参数,图是一个面,假设我们再增加一个超参数,那是不是图就成了"体",原来的25种组合一下子就成了125种组合,极大增加了时间成本,更别说我们现在有这么多超参数了。

因此,在现在的大数据大模型时代,超多的参数量和不同超参数的影响量级和控制变量带来的大成本产生了冲突。

自然而然的,会有新的方法来解决这种问题。

(2)随机取值的方格调参

再看一下这种取值方式:

依旧是25种组合,但是这次我们是在方格里随机取值,这样就解决了刚刚的25次组合只是测试了5种不同学习率的问题。

可是又有问题产生了,如果不控制变量的话,我们怎么知道哪个参数更重要?影响是哪个参数产生的?

第一种解决思路就是我们上面所说的,认为影响是更靠前的参数产生的。

但是我们也说了,这种情况并不绝对,它只能给我们一个大致方向上的指引。
因此,在实际调参中,我们会使用一种由粗糙到精细的思路。

即在随机取点中,我们会发现当参数组合落在某一区域时出现了更好的性能。

这时,虽然我们不知道具体是哪个超参数产生了这种影响,但是我们可以把区域缩小,在更小的搜索区域里进行更精细的搜索来得到更好的参数组合。

总结来说,就是先进行效率更高的大范围随机搜索,再在搜索得到的小范围里精细搜索,实现成本和性能兼顾。

在这个基础上,我们继续展开。

1.3 随机取值中的取值逻辑

(1)均匀取值

现在假设我们要调试隐藏层单元的数量,假定要在1到100范围内取值25次。

从直觉来讲,我们是不是更偏向以4为间隔均匀取值

因为对于隐藏层单元的数量,我们能理解到它每个单位量的增加带来的影响大致 是相同的。

举个例子,从99个单元增加到100个单元和从50个单元增加到51个单元带来的影响是差不多的。
就像一个变化率,即导数为定值的正比例函数:

在其他超参数中,隐藏层数,训练轮次也有这类性质。
因此,对于这种单位量的增减产生影响差距不大的超参数,我们更倾向于均匀取值来调试,因为它们单位变化产生的影响不会受数值本身太大的影响。

(2)均匀取值的非适用现象

实际上,并不是所有超参数都适用均值取值。

我们用 Momentum 的动量项 β 来说明这个问题:

Momentum 的 β 一般在 0.8 到 0.999 之间取值。

如果我们像刚才那样均匀取 25 个点,那么点之间的间隔大约是 0.008。

问题在于:

虽然数值上都是"加 0.008",但对模型的影响差异非常明显。

我们可以用"等效记忆天数"来理解 β 的作用。

动量的更新中,β 越大,代表它"记住过去梯度"的时间越长。

先回忆一下等效天数的公式:

\[\text{等效记忆天数} \approx \frac{1}{1-\beta} \]

这时,数值本身的量级就会导致非常明显的差别,我们看两个例子:

  1. β = 0.80 → 0.808

\[\frac{1}{1-0.80} = 5\text{ 天} \]

\[\frac{1}{1-0.808} \approx 5.2\text{ 天} \]

也就是说,从 5 天增加到 5.2 天,几乎没有变化

模型对历史梯度的记忆长度基本相同,训练曲线几乎不变。

  1. β = 0.990 → 0.998(加 0.008)

\[\frac{1}{1-0.990} = 100\text{ 天} \]

\[\frac{1}{1-0.998} = 500\text{ 天} \]

这次变化虽然在 β 上仍然只是 +0.008

但等效记忆从 100 天增加到 500 天 ,差距巨大。

这意味着模型会突然"记住"很长时间之前的梯度,

训练的方向、收敛速度、稳定性都会出现明显变化。

通过这样的比较就能看出:

  • 在 β 的低值区间(0.8 左右),加 0.008 → 记忆时间几乎不变
  • 在 β 的高值区间 (0.99 以上),加 0.008 → 记忆时间变化呈数倍增加
    因此:
    β 的不同区间敏感度完全不同,就像一个导数随变量本身递增的函数:

这时,如果在 0.8 到 0.999 之间做均匀取值,大部分采样点会落在 0.8 ~ 0.9 这个影响较小的区域:

  • 这一段的 β 改变,训练行为变化不明显
  • 真正对模型影响显著的 β > 0.95 区域,却分配到非常少的采样点
    结果就是:均匀取值并不能有效探索重要的区域。
    那要怎么做呢?

(3)对数轴上的均匀取值

既然 β 在不同区间的敏感度完全不同 ,那我们自然就会问:能不能把"敏感的区域多取点,不敏感的区域少取点"?

答案当然是可以。

而且已经有成熟的方法 ------ 在"对数意义下"均匀取值

我们以此来展开。

首先,什么是对数轴?

我们平常画的那个数轴(1、2、3、4、5...),叫做 线性轴:每两个刻度之间的距离都是一样的。

但是就像刚刚说的,有些超参数变化 不是按"加法"影响,而是按"倍数"影响

比如学习率 0.001 → 0.0001,差值虽然都很小,但对训练影响是"十倍"的差距。

这时候,线性轴就完全不适用了。

于是我们需要一个新的坐标方式:
对数轴(Log-scale)就是"按倍数划分刻度"的数轴。

下一个问题:那我们要怎么把线性轴变成对数轴实现均值取值?

第一步:对参数做一次 log(取对数)

假设我们要在范围: \(\beta \in [0.80,0.999]\) 里取值。

但根据等效天数的概念,我们真正关心的是其实是 1−β 的量级变化,所以我们先看它的范围:

  • 当 β = 0.80 → 1−β = 0.20
  • 当 β = 0.999 → 1−β = 0.001
    你会发现:
    0.20 到 0.001 这个范围 跨了 200 倍的变化,完全是"数量级级别"的变化。

因此我们先做一件事:
把 (1−β) 做 log,使得"倍数变化"变成"线性变化"。

看看实例:

1−β log(1−β)
0.20 −0.70
0.02 −1.70
0.002 −2.70
0.001 −3.00

你会发现,原本 "差 200 倍" 的范围

在 log 之后变成 "差 2.3" 的线性范围。

你可能有些忘了这部分的原理,我们补充一下基础:
\(y=ln(x)\) 中 \(y\) 是指"底数 \(e\) 的多少次方,才能得到 \(x\) ?"
因此,相比数值,指数对量级更敏感。

当 \(x<1\) 时,\(\ln(x)\) 会把那些"本来都挤在 0 附近、分不清谁大谁小"的小数,拉开到整个负半轴,因为虽然它们的数值变化小,但是量级变化大

这正是我们想要的效果: 把原本"倍数变化"的空间,展开成"线性变化"的空间。

于是我们对 \((1-\beta)\) 做一次对数后,原本差 200 倍的数值,

在 log 轴上会变成一个 宽度只有约 2.3 的区间

这样我们就可以在这个区间里------
真正做到"按影响均匀取值"。

第二步:在 log 轴上进行线性均匀采样

经过 log 变换后,我们得到一条新的"对数轴"。

它的特点是:

  • 在原本敏感的地方(比如 1−β 很小的时候),会被拉得很长
  • 在原本不敏感的地方,会被压得很短
    这意味着,如果我们在这条 log 轴上均匀取点,比如取 10 个点,它们在原始空间里就会变成:
  • 小数值部分(例如 0.001~0.01)会分布得更密集
  • 大数值部分(例如 0.05~0.2)会分布得更稀疏
第三步:把 log 空间的点"反变换"回原始 β

最后,在 log 空间里选完点之后,我们必须把它们重新映射回真实的超参数 β。

流程是:

  1. 在 log(1−β) 上均匀取点
  2. 对每个点做 exp(指数)恢复得到 (1−β)
  3. 再转回 β

这一来一回的变换,就像是在对原本"挤作一团"的参数空间进行 重新拉伸与分配

最后在取值上:

  • β 接近 0.999 的地方会分布得特别密
  • 接近 0.80 的地方则分布得特别稀

也就实现了我们想要的效果:根据"影响"均匀取值。

就像这样:

1.4 调参流派

在课程中,吴恩达老师把调参分为两派:

  1. 熊猫派:资源少,对一个模型一点点反复调优,就像一次只有一两个孩子的熊猫。
  2. 鱼派:资源充足,可以同时对多个模型测试调优,就像一次一窝的鱼。
    我们肯定都希望自己的资源能支持自己当"鱼派",不涉及理解,就不多说了。

2. "人话版"总结

概念 原理 比喻
超参数影响力不同 有些超参数(如学习率)调一点点都会大变动;有些(如隐藏层宽度)调一格几乎没影响。 有的材料一撒就是辣死人的辣椒粉;有的材料像白开水,加多少都一样。
方格调参(Grid Search) 在每个超参数范围里选固定数量(如 5 个)点,组合测试。方法科学但成本爆炸。 在地图上每隔 10 公里挖一口井,保证覆盖但挖到破产。
随机调参(Random Search) 随机取点,不强行覆盖每个刻度,效率更高。粗略扫一遍,再缩小区域精细搜索。 先随机撒网找鱼群,再把网往鱼多的地方缩小围捕。
均匀取值(线性轴) 对隐藏层数、训练轮数这种"单位变化影响差不多"的参数,用等间隔取点更合理。 车子每提高 5 km/h,感觉差不多,不会突然飞起来。
为何不能对所有参数用均匀取值 某些超参数(如 Momentum 的 β)在不同区间敏感度差异巨大,线性均匀取值会浪费采样。 有些区域像沼泽,一脚下去变化巨大;有些区域像柏油路,十步都一样。
对数取值(log-scale) 若参数变化影响是"倍数级"的(如学习率、1−β),应把其取 log,使"倍数变化"变线性,再均匀取点。 把原本挤在一起的小数拉长,就像把揉成团的面皮擀开再切。
调参流派:熊猫派与鱼派 熊猫派:资源少,一次只能调一个模型。鱼派:资源多,一次几十个模型同时调。 熊猫每胎只有一个;鱼一次生几十个,把失败的交给自然选择。
相关推荐
qy-ll2 小时前
遥感论文学习
人工智能·深度学习·计算机视觉·gan·遥感·栅格化
G31135422732 小时前
深度学习中适合长期租用的高性价比便宜的GPU云服务器有哪些?
服务器·人工智能·深度学习
PcVue China3 小时前
PcVue播客系列 - E2 | 智慧制造、人工智能与工业模拟的未来 —— 对话 Andrew Siprelle
物联网·ai·自动化·制造·数字孪生·scada·工业模拟
8Qi83 小时前
Stable Diffusion详解
人工智能·深度学习·stable diffusion·图像生成
carver w3 小时前
transformer 手写数字识别
人工智能·深度学习·transformer
大囚长4 小时前
神经网络AI在人类发明史上的独特性
人工智能·深度学习·神经网络
嵌入式-老费4 小时前
自己动手写深度学习框架(数值法实现神经网络的训练)
人工智能·深度学习·神经网络
Learn Beyond Limits4 小时前
Regression vs. Classification|回归vs分类
人工智能·python·算法·ai·分类·数据挖掘·回归
大卫小东(Sheldon)4 小时前
革命你的 Git 提交消息 - GIM 1.8.0 发布了!
ai·rust·管理