吴恩达深度学习课程三: 结构化机器学习项目 第一周:机器学习策略(一)正交化调优和评估指标
<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第三课的第一周内容,1.1到1.4的内容。</p>
<hr>
<p>本周为第三课的第一周内容,本周的内容关于在实际项目进行中的一些基本策略,并不涉及技术性的知识。<br>
经过整个第一课和第二课后, 我们已经了解了足够支持我们构建一个完整的基础神经网络项目的知识和技术,本周便是在这些基础上的一个指导策略,可以帮助实现更好确定项目方向,优化和评估模型性能。<br>
只要对前面两课涉及的技术原理足够了解,<strong>可以说,本周的内容不存在理解上的难度。</strong><br>
本篇的内容关于<strong>正交化调优和评估指标</strong>。</p>
<h1 id="1-正交化调优">1. 正交化调优</h1>
<h2 id="11-我们已有的调参方向">1.1 我们已有的调参方向</h2>
<p>我们已经了解到了很多技术,来支持我们在模型训练中进行不同的尝试,就像课程里说的这样:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133936048-450279459.png" alt="image.png" loading="lazy"></p>
<p>在上周的超参数调整部分里,我们已了解到了方格调参,取对数轴等帮助超参数调优的方式,这周的内容又从一个更大的角度给出了这方面的策略。</p>
<h2 id="12-什么是正交化">1.2 什么是正交化?</h2>
<p>你可能在高数里看到过这个概念,我们在DL的背景下再来阐述一下这个概念:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133936884-1102662865.png" alt="image.png" loading="lazy"><br>
我们不提正交化在数学里的专业概念,只理解它在我们现在的机器学习策略中的作用即可。<br>
<strong>其实简单来说,就是把负责各个功能的内容分开,让它们不要互相影响,从而影响调优。</strong><br>
你可能会把它理解成控制变量,但还是我之前说的,这个范围要比我们之前提到的超参数调优要大一些。<br>
我们来具体看看。</p>
<h2 id="13-正交化调优的应用方式">1.3 正交化调优的应用方式</h2>
<p><img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133938480-219436599.png" alt="image.png" loading="lazy"><br>
这就是正交化的使用,不同于之前我们通过超参数调整针对某个超参数,<strong>正交化的基本思想是把调优方式分组来调优整个项目的单个环节,并尽可能地实现互不影响。</strong><br>
很明显,这对我们明确拟合步骤和调优方向是极有帮助的,而且逻辑通顺。<br>
接下来我们再拓展一个专业名词:<strong>耦合</strong></p>
<h2 id="14-耦合和解耦合">1.4 耦合和解耦合</h2>
<p>在进入下一部分前,先来拓展两个非常常见、但在深度学习里却往往被忽略的词:<strong>耦合(Coupling)</strong> 和 <strong>解耦合(Decoupling)</strong>。<br>
它们其实和我们刚刚讲的“正交化”是<strong>并行概念</strong>,但描述的角度不同。<br>
我们分点来了解一下:</p>
<h4 id="1什么是耦合">(1)什么是耦合?</h4>
<p>“耦合”指的是:<strong>两个本来应该独立的部分,却互相影响、互相牵制,让你没办法单独调其中一个。</strong></p>
<p><strong>在DL中,实际上就是我们刚刚提到的非正交化</strong>,比如:</p>
<ul>
<li>你想提高模型容量,却发现训练变慢、过拟合更明显</li>
<li>你想调学习率,却发现 batch size、正则化都跟着乱</li>
<li>你想改善测试准确率,却发现训练准确率也跟着变了</li>
<li>你想让损失下降,却发现它受到梯度消失干扰</li>
</ul>
<p>这些问题的共同点是:<br>
<strong>一个地方的问题被多个因素共同影响,你很难定位问题来源。</strong></p>
<p>就像 <strong>一团线缠成一坨毛球</strong> ——你想拉出一根,却发现其他线也跟着动。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133937979-140515868.png" alt="image.png" loading="lazy"></p>
<h4 id="2什么是解耦">(2)什么是解耦?</h4>
<p>很显然,解耦就是<strong>让每一块功能只影响它应该影响的部分,不要交叉干扰。</strong></p>
<p>同样,在 DL 中,就是我们刚刚的正交化,表现为:</p>
<ul>
<li>想调学习率,就只影响优化速度,不影响模型表达能力</li>
<li>想解决偏差,就去调网络结构,而不是学习率</li>
<li>想解决方差,就去调正则化,而不是训练轮数</li>
<li>想提升训练集性能,就别去乱动提升测试性能的那一套</li>
</ul>
<p>换句话说: <strong>训练的几个关键目标(拟合、泛化、优化稳定性、速度等)要尽量互相独立。</strong></p>
<p>耦合和解耦合的说法实际上更常见于软件开发中的模块化中,用来区分功能,明确责任。我们这里拓展一下,你如果在其他地方见到,它们和这里提到的正交,非正交是一个意思,只是在不同领域的常用说法不同。</p>
<h1 id="2评估指标">2.评估指标</h1>
<p>我在前面的实践部分都会使用准确率来评估模型的拟合效果,而准确率就是评估指标的一种。<br>
在这部分,我们就随课程内容展开一下在实际项目中,这方面的策略。</p>
<h2 id="21-单一数字评估指标">2.1 单一数字评估指标</h2>
<p>我们在买东西时常说:<strong>要看性价比。</strong><br>
这是因为:</p>
<ul>
<li>有的商品效果好,但太贵。</li>
<li>有的商品价格便宜,但效果不好。</li>
</ul>
<p>现在,如果只看价格和效果这<strong>两个评估指标</strong>,你会发现很难评价上面两种商品间的好坏,因为它们<strong>各有优劣</strong>。<br>
所以,我们用性价比这个<strong>单一数字评估指标</strong>结合这两种指标来评价商品,就避免了上面的纠结。</p>
<p>在DL领域也是一样的道理,我们来看一下分类模型里面常用的几个评估指标,如果你要写这方面的论文,就几乎逃不开它们。</p>
<h4 id="1准确率-accuracy">(1)准确率 Accuracy</h4>
<p>准确率是我们最熟悉的指标,它衡量的是:<strong>模型预测正确的样本占全部样本的比例。</strong><br>
公式为:</p>
<p></p><div class="math display">\[\text{Accuracy}=\frac{TP + TN}{TP + TN + FP + FN}
\]</div><p></p><p>其中:</p>
<ul>
<li><strong>TP</strong>(True Positive):真正例,预测“是”且实际上“是”</li>
<li><strong>TN</strong>(True Negative):真负例,预测“否”且实际上“否”</li>
<li><strong>FP</strong>(False Positive):假正例,预测“是”但实际上“否”</li>
<li><strong>FN</strong>(False Negative):假负例,预测“否”但实际上“是”</li>
</ul>
<p>第一次看这几个字母组合可能会有些分不过来,但在各个分类指标中,他们都会和你常见。</p>
<p>现在来看个例子:<br>
假设你有一个 10 个样本的猫狗分类模型:<br>
如果模型预测对了 8 张,那么:</p>
<p></p><div class="math display">\[\text{Accuracy}=\frac{8}{10}=0.8
\]</div><p></p><p>听上去不错,但这个指标有一个<strong>致命缺点</strong>: <strong>当正负样本极不均衡时,准确率可能毫无意义。</strong></p>
<p>这句话是什么意思?<br>
继续我们之前的数据集设定:</p>
<ul>
<li>99 张 <strong>猫</strong></li>
<li>1 张 <strong>狗</strong><br>
这是一个 <strong>极度不平衡</strong> 的数据集。<br>
现在假设模型非常“懒”,它学会了一个“最优生存策略”:<strong>无论输入什么,都预测:猫。</strong><br>
准确率:</li>
</ul>
<p></p><div class="math display">\[\text{Accuracy}=\frac{99}{100}=99%
\]</div><p></p><p>看上去非常漂亮,但模型完全没用!<br>
因为它根本<strong>没有学会识别“狗”是什么样子,它只是迎合了数据分布,而不是真正地在分类。</strong><br>
因此,就出现了其他指标,我们继续。</p>
<h4 id="2精确率-precision">(2)精确率 Precision</h4>
<p>精确率关注的是: <strong>模型预测为“正”的样本里,有多少是真正的正样本?</strong><br>
换句话说,它衡量的是:“你说这些是猫,结果你说对了吗?”<br>
公式为:</p>
<p></p><div class="math display">\[\text{Precision}=\frac{TP}{TP + FP}
\]</div><p></p><p>再重复一下,其中:</p>
<ul>
<li><strong>TP</strong>(True Positive):预测为正且实际为正</li>
<li><strong>FP</strong>(False Positive):预测为正但实际为负(误报)</li>
</ul>
<p>精确率解决的问题是:“我不想模型乱报。”<br>
例如肿瘤筛查,如果模型只要看到一点点异常就高喊“癌症!癌症!”,<br>
虽然可能很“敏感”,但全部都是误报,用户会被吓死。<br>
这时就需要精确率来约束模型的“靠谱程度”。</p>
<p>你有实际 10 张猫图,模型预测“是猫”的有 8 张,其中:</p>
<ul>
<li>5 张是真的猫(TP = 5)</li>
<li>3 张其实是狗但被误判成猫(FP = 3)</li>
</ul>
<p>那么:</p>
<p></p><div class="math display">\[\text{Precision}=\frac{5}{5+3}=0.625
\]</div><p></p><p>含义就是:<strong>模型说“这里有猫”时,只有 62.5% 的概率是对的。</strong></p>
<h4 id="3召回率-recall">(3)召回率 Recall</h4>
<p>召回率关注的是:<strong>在所有实际为“正”的样本中,模型能找对多少?</strong><br>
特别适合“找到所有风险”、“不能漏报”的任务:<br>
比如风控报警、欺诈检测等。<br>
公式为:</p>
<p></p><div class="math display">\[\text{Recall}=\frac{TP}{TP+FN}
\]</div><p></p><p>继续重复,其中:</p>
<ul>
<li><strong>TP</strong>:模型找对的正样本</li>
<li><strong>FN</strong>:漏掉的正样本</li>
</ul>
<p>假设真实有 10 个“猫”,模型找到了其中 7 个:</p>
<ul>
<li>TP = 7</li>
<li>FN = 3</li>
</ul>
<p></p><div class="math display">\[\text{Recall}=\frac{7}{7+3}=0.7
\]</div><p></p><p>这意味着:<strong>模型成功找出了 70% 的猫,还有 30% 被漏掉了。</strong><br>
如果任务是:<br>
“不能漏掉任何一只猫(例如找可疑人员)”,<br>
那么 0.7 的召回率就是完全不可接受的。</p>
<h4 id="4f1分数-f1-score">(4)F1分数 F1-score</h4>
<p>知道了召回率和精确率的概念后,你应该就会发现:</p>
<ul>
<li>只提高召回率,往往会降低精确率</li>
<li>只提高精确率,又可能会降低召回率</li>
</ul>
<p>就像这样:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133938952-969731966.png" alt="image.png" loading="lazy"></p>
<p>因此,我们需要一个指标:<br>
<strong>能综合衡量精确率(Precision)与召回率(Recall)</strong><br>
F1 正是:</p>
<p></p><div class="math display">\[\text{F1} = 2\cdot \frac{\text{Precision}\cdot \text{Recall}}{\text{Precision}+\text{Recall}}
\]</div><p></p><p>现在假设:</p>
<ul>
<li>模型找到的都是猫(预测为猫的 10 个里,有 8 个是真的)<br>
→ Precision = 0.8</li>
<li>实际上有 12 只猫,模型找到了 8 只<br>
→ Recall = 0.67<br>
那么F1就是:</li>
</ul>
<p></p><div class="math display">\[\text{F1}=2\cdot\frac{0.8\times 0.67}{0.8+0.67}
= 0.73
\]</div><p></p><p>可以看到:F1代表了两者的<strong>平衡程度</strong>。<br>
当任务要求是<strong>既不能漏太多,也不能乱报太多</strong>时,F1 就非常关键了。</p>
<p>我们总结一下:</p>
<table>
<thead>
<tr>
<th>指标</th>
<th>关注点</th>
<th>典型问题</th>
<th>适用场景</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Accuracy</strong></td>
<td>总体正确率</td>
<td>模型整体表现怎样?</td>
<td>类别均衡的分类任务</td>
</tr>
<tr>
<td><strong>Precision</strong></td>
<td>报准了没有</td>
<td>我说“是”的里有多少是真的?</td>
<td>误报代价高(垃圾邮件、安检)</td>
</tr>
<tr>
<td><strong>Recall</strong></td>
<td>找全了没有</td>
<td>所有真正的“是”我找到了多少?</td>
<td>漏报代价高(医疗、风控)</td>
</tr>
<tr>
<td><strong>F1-score</strong></td>
<td>平衡两者</td>
<td>报准与找全的折中</td>
<td>对误报和漏报都敏感</td>
</tr>
</tbody>
</table>
<p>根据我们的任务需求,我们需要选择合适的评估指标来衡量性能。<br>
<strong>很显然,在大多情况下,用F1-score作为单一评估指标,会比只用Precision或者Recall作为指标更为全面。</strong><br>
就像在这个课程里的例子里一样:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133936059-1555548404.png" alt="image.png" loading="lazy"><br>
在前两者各有优劣的情况下,你可以通过F1分数比较出两个分类器的综合性能高低。</p>
<h2 id="22-满足和优化指标">2.2 满足和优化指标</h2>
<p>我们现在以及有了很多指标,但实际,在不同任务中,对不同指标的重视程不同。<br>
因为我们又在此基础上,<strong>把指标分成满足指标和优化指标</strong>,他们因任务不同而不同。</p>
<p>在这个课程实例里来介绍一下:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202511/3708248-20251125133937392-1243104574.png" alt="image.png" loading="lazy"><br>
现在假如这个分类器是针对某种<strong>医学图像的识别</strong>,那么我们就会这么设置:</p>
<ul>
<li><strong>优化指标:准确率</strong>,很显然,这是最重要的。</li>
<li><strong>满足指标:运行时间</strong>,我们接受为了正确地识别病情多等一秒。<br>
在这种情景下,使用分类器 C 是最合适的,我们设置运行时间在2000ms以下即可<strong>满足</strong>,从而把更多资源投入准确率,实现<strong>优化</strong>。</li>
</ul>
<p>那现在再换一种情况,这个分类器是<strong>某种危险信号的识别</strong>,那我们就会这么设置:</p>
<ul>
<li><strong>优化指标:运行时间</strong>,我们必须以极快的速度侦察危险。</li>
<li><strong>满足指标:准确率</strong>,虚惊一场总比没命强。<br>
那么显示,使用分类器 B 更合适的。我们设置准确率在90%以上即可,从而把更多资源投入运行时间。</li>
</ul>
<p>现在,给出二者的概念:</p>
<blockquote>
<p>满足指标指的是:<strong>这些指标只要达到某条线即可,不强求做到最好。</strong><br>
优化指标指的是:<strong>这是我们真正要拉满、要尽可能提升的指标。</strong></p>
</blockquote>
<p><strong>因为一个模型不可能同时把所有指标都变成最优。</strong><br>
<strong>必须先明确“最低要求是什么”,然后把资源集中在真正关键的指标上。</strong></p>
<p>这便是指标部分的策略。</p>
<h1 id="3总结">3.总结</h1>
<table>
<thead>
<tr>
<th><strong>概念</strong></th>
<th><strong>原理</strong></th>
<th><strong>比喻</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>正交化调优</strong></td>
<td>将训练目标拆分成互不干扰的小块,各调各的。</td>
<td><strong>就像把厨房、客厅、卧室分开装修,不会你刷墙时把厨房的地板一起搞脏。</strong></td>
</tr>
<tr>
<td><strong>耦合 / 解耦合</strong></td>
<td>耦合:互相牵连。解耦:各做各的事。</td>
<td><strong>耦合像一团乱麻的耳机线;解耦像一根根排好序的键盘线。</strong></td>
</tr>
<tr>
<td><strong>单一数字评价指标</strong></td>
<td>用一个数字融合多个维度来评估。</td>
<td><strong>就像“性价比”:不用纠结贵不贵、好不好,一看这个就知道买不买。</strong></td>
</tr>
<tr>
<td><strong>精确率(Precision)</strong></td>
<td>预测出的正类里有多少是真的。</td>
<td><strong>它关注“你说有猫,那你说对了吗?”</strong></td>
</tr>
<tr>
<td><strong>召回率(Recall)</strong></td>
<td>所有真实正类里,你找出了多少。</td>
<td><strong>它关注“所有的猫,你有没有一个不漏地找出来?”</strong></td>
</tr>
<tr>
<td><strong>F1-score</strong></td>
<td>Precision 与 Recall 的调和平均。</td>
<td><strong>既不能乱喊“有猫!”,也不能漏掉猫,是一种“说得准 + 找得全”的折中。</strong></td>
</tr>
<tr>
<td><strong>满足指标 & 优化指标</strong></td>
<td>满足指标达线即可;优化指标才是你真正要卷的。</td>
<td><strong>满足指标像考驾照过线就行;优化指标像真实上路,还得开得又稳又快。</strong></td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19268132
頁:
[1]