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

news/2025/11/14 20:44:40/文章来源:https://www.cnblogs.com/Goblinscholar/p/19223348

此分类用于记录吴恩达深度学习课程的学习笔记。
课程相关信息链接如下:

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

本篇为第二课的第三周内容,3.1到3.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 普遍来说影响更大的超参数

在学习过程中相信你也能直观感受到,有些超参数的调整对结果影响更大。
我们依据课程内容和经验简单总结如下:
Pasted image 20251114170441

1.2 方格调参

在大致了解了哪些超参数影响更大后,我们对如何调试参数自然也有一些经验方法。
其中,早期最经典的就是方格调参,我们用课程里的图来看一看它的具体实施:

(1)典型的方格调参

Pasted image 20251114174751

很明显,就是以参数范围建立坐标系,图中用横纵坐标代表两个超参数的范围,各选取五个点形成二十五种组合来进行测试。
根据控制变量的逻辑来看,这确实是比较科学的一种做法。
但这种方法在现在也确实有其缺陷:

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

因此,在现在的大数据大模型时代,超多的参数量和不同超参数的影响量级和控制变量带来的大成本产生了冲突。
自然而然的,会有新的方法来解决这种问题。

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

再看一下这种取值方式:
Pasted image 20251114181659

依旧是25种组合,但是这次我们是在方格里随机取值,这样就解决了刚刚的25次组合只是测试了5种不同学习率的问题。
可是又有问题产生了,如果不控制变量的话,我们怎么知道哪个参数更重要?影响是哪个参数产生的?
第一种解决思路就是我们上面所说的,认为影响是更靠前的参数产生的。
但是我们也说了,这种情况并不绝对,它只能给我们一个大致方向上的指引。
因此,在实际调参中,我们会使用一种由粗糙到精细的思路。
即在随机取点中,我们会发现当参数组合落在某一区域时出现了更好的性能。
这时,虽然我们不知道具体是哪个超参数产生了这种影响,但是我们可以把区域缩小,在更小的搜索区域里进行更精细的搜索来得到更好的参数组合。

总结来说,就是先进行效率更高的大范围随机搜索,再在搜索得到的小范围里精细搜索,实现成本和性能兼顾。
在这个基础上,我们继续展开。

1.3 随机取值中的取值逻辑

(1)均匀取值

现在假设我们要调试隐藏层单元的数量,假定要在1到100范围内取值25次。
从直觉来讲,我们是不是更偏向以4为间隔均匀取值
因为对于隐藏层单元的数量,我们能理解到它每个单位量的增加带来的影响大致是相同的。
举个例子,从99个单元增加到100个单元和从50个单元增加到51个单元带来的影响是差不多的。
就像一个变化率,即导数为定值的正比例函数:
Pasted image 20251114190637

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

(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 天,几乎没有变化
模型对历史梯度的记忆长度基本相同,训练曲线几乎不变。
2. β = 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 → 记忆时间变化呈数倍增加
    因此:
    β 的不同区间敏感度完全不同,就像一个导数随变量本身递增的函数:
    Pasted image 20251114192139

这时,如果在 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\) ?”
因此,相比数值,指数对量级更敏感。
Pasted image 20251114200043

\(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 的地方则分布得特别稀

也就实现了我们想要的效果:根据”影响”均匀取值。
就像这样:
Pasted image 20251114202534

1.4 调参流派

Pasted image 20251114202737

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

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

2. “人话版”总结

概念 原理 比喻
超参数影响力不同 有些超参数(如学习率)调一点点都会大变动;有些(如隐藏层宽度)调一格几乎没影响。 有的材料一撒就是辣死人的辣椒粉;有的材料像白开水,加多少都一样。
方格调参(Grid Search) 在每个超参数范围里选固定数量(如 5 个)点,组合测试。方法科学但成本爆炸。 在地图上每隔 10 公里挖一口井,保证覆盖但挖到破产。
随机调参(Random Search) 随机取点,不强行覆盖每个刻度,效率更高。粗略扫一遍,再缩小区域精细搜索。 先随机撒网找鱼群,再把网往鱼多的地方缩小围捕。
均匀取值(线性轴) 对隐藏层数、训练轮数这种“单位变化影响差不多”的参数,用等间隔取点更合理。 车子每提高 5 km/h,感觉差不多,不会突然飞起来。
为何不能对所有参数用均匀取值 某些超参数(如 Momentum 的 β)在不同区间敏感度差异巨大,线性均匀取值会浪费采样。 有些区域像沼泽,一脚下去变化巨大;有些区域像柏油路,十步都一样。
对数取值(log-scale) 若参数变化影响是“倍数级”的(如学习率、1−β),应把其取 log,使“倍数变化”变线性,再均匀取点。 把原本挤在一起的小数拉长,就像把揉成团的面皮擀开再切。
调参流派:熊猫派与鱼派 熊猫派:资源少,一次只能调一个模型。鱼派:资源多,一次几十个模型同时调。 熊猫每胎只有一个;鱼一次生几十个,把失败的交给自然选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go-秘籍-全-

Go 秘籍(全)原文:zh.annas-archive.org/md5/d17f8ead62b31a6ec2bbef4005dc3b6d 译者:飞龙 协议:CC BY-NC-SA 4.0第一章:错误处理技巧 1.0 引言 亚历山大蒲柏在他的论批评的散文中写道:“出错是人性的”。由于软…

Kotlin中的flow、stateflow、shareflow之间的区别和各自的功能 - 教程

Kotlin中的flow、stateflow、shareflow之间的区别和各自的功能 - 教程2025-11-14 20:36 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto…

非离散网络流——P3347 [ZJOI2015] 醉熏熏的幻想乡

非离散网络流——P3347 [ZJOI2015] 醉熏熏的幻想乡 观察费用为 \(a_ix^2+b_ix\),如果是离散的,则可以套路的建边 \(a_i+b_i,3a_i+b_i,5a_i+b_i,\dots\),可本题 \(x\in R\)。 于是连续意义下我们应该求导得到 \(2a_i…

[note] 素数判定与分解质因数

在某些毒瘤的数论题中,可能出现对 \(10^{18}\) 的范围内的数质因数分解的情况。这时,可以使用 Fermat 和 Miller-Rabin 算法进行素性判定,Pollard-Rho 算法寻找非平凡因子,两者结合以快速质因数分解。 Fermat 素性…

不能识别adb/usb口记录 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

恭喜自己,挑战成功! - Ghost

恭喜自己,挑战成功! 我终于,拿省一啦! 正文: 在2025年8月18日,本人开始了一项挑战 挑战三个月达省一 在三个月后,2025年11月14日,NOI官网发布了分数and分数线 本人以高出一等分数线10分的分数(250pts),成功…

如何在测试覆盖不足后补充验证

测试覆盖不足是项目质量的重大隐患,一旦发现(尤其是当它已导致线上问题时),团队必须立即采取系统性的补充验证措施。核心策略是停止盲目开发,转而执行一套以风险为导向的补救流程。 首先,必须立即对未覆盖的区域…

react动态表单

来个例子 比如有两种登录方式 // 导入表单验证库 import * as z from zod; // 导入消息提示组件 import { toast } from sonner; import { useState } from react; // 导入 UI 组件 import { Input } from @repo/shadc…

完整教程:PDFBox - PDDocument 与 byte 数组、PDF 加密

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Dark Side of the Moon

“Speak to Me” "Ive been mad for fucking years, absolutely years, been over the edge for years, been working me buns off for bands..." "Ive always been mad, I know Ive been mad, like mo…

flask:自定义异常

一,代码: 自定义异常:class ApiError(Exception):""""API接口异常错误"""messsage = ""# 默认错误码status_code = 400# 自定义一个return_code, 作为更细粒的错误代码…

图片合集

\(sin(2\theta)=2sin(\theta)cos(\theta)=\frac{2tan(\theta)}{1+tan^2(\theta)}\) \(cos(2\theta)=cos^2(\theta)-sin^2(\theta)=\frac{1-tan^2(\theta)}{1+tan^2(\theta)}\) \(tan(2\theta)=\frac{2tan(\theta)}{1-t…

升幂引理(LTE)

记 \(\nu_p(n)\) 表示 \(n\) 的标准分解中素数 \(p\) 的幂次,即 \(p^{\nu_p(n)} \parallel n\)。 该引理分为两部分:设 \(a, \, b\) 为不等正整数且 \(p \mid a - b\),\((p, \, ab) = 1\),若 \(p\) 为奇素数,则 \(…

OpenWrt路由的端口映射问题

之前做过AI大模型搭建,想将搭建的访问能开放到外部局域网,方便其他人访问,需要一些网络设置,就在这个网络配置上踩了些坑。 想在最外局域网中访问,但是自己这边用了两级的路由,第一级是小米的无线路由,以及上一…

解码IPC-管道与信号

进程间通信(IPC) 进程间通信(Inter Process Communication,简称 IPC)是进程间的信息交换,核心目的包括数据传输、共享资源、控制进程,方便对进程的管理与调度。常见 IPC 方式有管道通信、信号通信、共享内存、消…

算法沉淀第七天(AtCoder Beginner Contest 428 和 小训练赛) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

How-to-extract-text-from-PDF-Image-files-OCR-CarlZeng

本文阐述如何自建并使用OCR识别图片或PDF中文字(转化成文本等进一步处理), 以及NetSuite调用OCR API的场景雏形. How to extract text from PDF(Image) files. 20251113 引入自建ocr服务docker部署OCR项目 支持离线+…

Web应用模糊测试完全指南

本文详细介绍了使用ffuf工具进行Web应用模糊测试的完整流程,包括目录发现、子域名枚举、暴力破解攻击、参数挖掘等多种技术,提供了实用的命令示例和配置参数说明。Fuzzing Web Apps Full Guide 前言 在这篇博客中,我…

升鲜宝供应链管理系统、各端的访问地址及nginx 真实的配置方法

server {listen 443 ssl;server_name sxbscm.sxbscm.com;# 1. SSL 证书配置(关键:补充中间证书,避免链不完整导致兼容问题)ssl_certificate /mnt/sxbscm/ssl/sxbscm.sxbscm.com/sxbscm.sxbscm.com.pem; # 主证书(…

2025.11.14模拟赛

IOI赛制,fjj的模拟赛,题目质量非常高(准确来说是非常适合我们),fjj强大的%%% 赛时看T1,然后打了60暴力,已经知道用组合数来求了,然后也知道固定左上角的来求答案,但是就是没想明白怎么去除重复的贡献 然后一看…