吴恩达深度学习课程三: 结构化机器学习项目 第二周:误差分析与学习方法(三)迁移学习
<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第三课的第二周内容,2.7的内容。</p>
<hr>
<p>本周为第三课的第二周内容,本周的内容关于在上周的基础上继续展开,并拓展介绍了几种“学习方法”,可以简单分为误差分析和学习方法两大部分。<br>
其中,对于后者的的理解可能存在一些难度。同样,我会更多地补充基础知识和实例来帮助理解。<br>
本篇的内容关于迁移学习,这是一个在现在仍广泛使用的技术方法。</p>
<h1 id="1-迁移学习出现的背景">1. 迁移学习出现的背景</h1>
<p>迁移学习出现的<strong>根本原因</strong>还是我们在DL领域里老生常谈的问题:<strong>数据不足</strong>。<br>
在真实场景中,<strong>大规模、高质量的数据往往非常难获取</strong>。<br>
例如:</p>
<ul>
<li>ImageNet(这是一个非常著名的超大规模数据集) 里有<strong>上千万张标注清晰的猫狗、汽车、物体照片。</strong></li>
<li>但某些新的任务,例如 “识别工业零件缺陷”,往往<strong>只有几百张甚至几十张数据</strong>。</li>
</ul>
<p>我们之前已经提到过,在数据不足的情况下,我们有一种比较“取巧”的处理方式:数据增强<br>
它通过扩展现有数据集来增加数据,但是我们也在前面的数据不匹配部分提到过,<strong>在数据量本就不多的情况下再进行数据扩展有很大的过拟合风险。</strong></p>
<p>在这种情况下,便有人提出了另一种思路:<strong>很多任务的低层次特征都是差不多的,你的数据少,但是它的数据多,我们能不能把它的模型的前几层直接拿来用?</strong><br>
我们用两个例子来<strong>详细展开</strong>这句话从而帮助理解:</p>
<h4 id="1猫狗识别和工业缺陷检测">(1)猫狗识别和工业缺陷检测</h4>
<p>这两个任务好像八竿子搭不到边,但在图像学习的逻辑里,它们虽然一个识别动物,一个识别零件瑕疵,但其实都依赖<strong>基础特征</strong>:</p>
<ul>
<li>轮廓线</li>
<li>边缘变化</li>
<li>明暗对比</li>
<li>表面纹理<br>
<strong>这些低层特征我们人很难系统地总结, 但机器却擅长通过像素捕捉这些特征,网络的前几层学到的正是这些通用特征。</strong><br>
所以,在ImageNet上学过猫和狗的模型,也能对“金属表面凹坑”这种完全不同的任务产生帮助。</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251202105959294-1799041258.png" alt="image.png" loading="lazy"><br>
(尝试了一下使用grok来生成配图,相比GPT确实在这种逻辑上更擅长一些,但是中文显示很拉跨。)</p>
<h4 id="2人脸识别和手写数字识别">(2)人脸识别和手写数字识别</h4>
<p>继续来看这个任务,经过上面例子的解释,你可能已经感觉二者的联系了。<br>
任务完全不同,但两者都需要:</p>
<ul>
<li>边缘检测(数字的笔画、眉毛轮廓)</li>
<li>局部形状(眼睛形状、数字弧度)</li>
<li>小范围的纹理变化</li>
</ul>
<p>所以它们实际上也有可以公用的地方。</p>
<p>因此,<strong>不同任务的高层语义不一样,但低层视觉特征却高度通用,因此可以直接迁移。</strong> 这正是迁移学习的根基。<br>
现在,我们就来具体看看迁移学习本身。</p>
<h1 id="2-什么是迁移学习">2. 什么是迁移学习?</h1>
<p>理解迁移学习的关键,是把它视为一种“借力”的思维方式。<br>
如果你从零开始训练一个模型,那么模型需要依靠你的数据,<strong>从最底层的边缘、线条开始学习,一直到最后的任务语义</strong>。<br>
但就像上面的背景里说的,在数据量不足的任务中,这种“从零开始”几乎是不可能成功的。<br>
所以,迁移学习的核心思想非常朴素:</p>
<blockquote>
<p><strong>既然别人已经在大型数据集上训练出一个很强的模型,那我能不能直接借用它已经学好的部分,让我的小任务站在它的肩膀上?</strong></p>
</blockquote>
<p>在这种思想下,<strong>使用迁移学习在实际应用中有一个更常见的说法叫做:使用预训练模型。</strong><br>
典型的迁移学习可以分为两种,你可以理解为“借多少”——借得少一点?还是借得多一点?<br>
下面分别来看。</p>
<h2 id="21-固定前几层只训练最后几层也叫-freeze-迁移">2.1 固定前几层,只训练最后几层(也叫 freeze 迁移)</h2>
<p>这种方式的思路就像“<strong>借一本已经做满笔记的教材,只在你需要的章节上补充内容</strong>”。<br>
具体做法是:</p>
<ol>
<li>取一个在大规模数据集(例如 ImageNet)上已经训练好的模型</li>
<li>保留它的前几层(这些层已经学会了边缘、纹理、局部形状等通用特征)</li>
<li><strong>将最后几层替换成你自己任务的分类器或输出模块</strong></li>
<li>只训练最后几层即可</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251202105958374-1922886984.png" alt="image.png" loading="lazy"><br>
在数据量很少的情境里,这往往是最稳妥、最有效的方式。原因在于,你并不需要模型重新学习那些基础视觉技能。<br>
例如:</p>
<ul>
<li>图像中“这是一条边”</li>
<li>“这是简单纹理变化”</li>
<li>“这是一个局部形状的突变”<br>
<strong>这些基础知识早已被预训练模型学得非常扎实。你需要让模型重新学习的,只是最终的“任务语义”。</strong><br>
因此,这种方式特别适合:</li>
<li>你的数据非常少</li>
<li><strong>新任务和原任务比较接近</strong>(例如都属于图像分类)</li>
</ul>
<h2 id="22-在预训练基础上整体微调fine-tuning">2.2 在预训练基础上整体微调(fine-tuning)</h2>
<p>第二种方式比喻起来更像是:“拿到别人写好的教材,但你对其中很多部分都有自己的想法,于是你决定在原有基础上<strong>全书都修改</strong>一点,只不过改得很轻。”<br>
具体做法是:</p>
<ol>
<li>仍然从一个预训练模型开始</li>
<li>不是只训练最后几层,而是<strong>允许整个网络都参与更新</strong></li>
<li>使用<strong>较小的学习率</strong>,避免把原来已经学得很好的特征破坏掉</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251202105959705-758146654.png" alt="image.png" loading="lazy"></p>
<p>再举一个例子,你可以把它想象成:<br>
模型已经是一个受过良好训练的学生,但你希望他再进一步按照你的任务风格来调整思路,于是让他重新复习你修改过的知识,但修改幅度非常小。</p>
<p>这种方式适用于:</p>
<ul>
<li>新任务的数据量比刚才那种情况更多</li>
<li><strong>新任务和原任务差别较大</strong>(例如原任务是动物分类,你的任务是医学影像)</li>
<li>你希望模型能真正为你的任务“深入适配”</li>
</ul>
<p>微调整个网络的好处是:灵活、适应性强,能更充分地利用你提供的新数据。<br>
但它<strong>需要更多数据,同时也更容易过拟合</strong>。</p>
<h2 id="23-两种方式的选择逻辑">2.3 两种方式的选择逻辑</h2>
<p>一句话总结:</p>
<ul>
<li>如果你的数据很少,<strong>只训练最后几层</strong>更保险</li>
<li>如果数据量适中,或者新旧任务差异明显,<strong>微调整个网络</strong>会有更好的表现。</li>
</ul>
<p><strong>我会在本周的代码实践部分着重演示如何使用迁移学习和它的实际效果,在如今的的实际任务中,它是很常见的一种调试方向。</strong></p>
<h1 id="3-在应用迁移学习的几点注意事项">3. 在应用迁移学习的几点注意事项</h1>
<ol>
<li>确保迁移来源任务和迁移目标任务<strong>拥有相同类型的输入</strong>,比如同样大小的图片或相同数量的特征,这样才能进行训练。</li>
<li>只有在迁移来源任务的<strong>数据量更多</strong>的情况下,把它的模型迁移到目标任务才是更有意义的。</li>
<li>当迁移来源任务和迁移目标任务的<strong>低层次特征更相似</strong>时,迁移学习往往能起到更大的帮助。</li>
</ol>
<h1 id="4-总结">4. 总结</h1>
<table>
<thead>
<tr>
<th>概念</th>
<th>原理</th>
<th>比喻</th>
</tr>
</thead>
<tbody>
<tr>
<td>迁移学习</td>
<td>利用在大数据集上训练好的模型,把已学到的低层特征(如边缘、纹理、局部形状)迁移到数据量少的新任务上,只训练新任务相关的部分或微调整个网络</td>
<td>“借力”——站在别人肩膀上学习</td>
</tr>
<tr>
<td>迁移学习的出现背景</td>
<td>数据量不足,高质量标注数据难获取</td>
<td>比如工业零件缺陷识别,数据只有几十张,无法从零训练深度网络</td>
</tr>
<tr>
<td>迁移学习的 核心思想</td>
<td>低层视觉特征通用,高层语义任务差异大</td>
<td>猫狗识别模型也能帮助工业零件瑕疵检测,因为轮廓、边缘、纹理等特征通用</td>
</tr>
<tr>
<td>固定前几层(freeze)</td>
<td>保留预训练模型前几层,只替换最后几层分类器,新任务只训练最后几层</td>
<td>“借一本已经做满笔记的教材,只在你需要的章节上补充内容”</td>
</tr>
<tr>
<td>微调整个网络(fine-tuning)</td>
<td>在预训练模型基础上,允许整个网络都参与更新,使用小学习率调整已有特征以适应新任务</td>
<td>“拿到别人写好的教材,但你对其中很多部分都有自己的想法,轻微修改全书内容”</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19296477
頁:
[1]