当前位置 博文首页 > xpj8888的博客:第二周 机器学习(ML)策略(2):2.7 迁移学习

    xpj8888的博客:第二周 机器学习(ML)策略(2):2.7 迁移学习

    作者:[db:作者] 时间:2021-08-23 19:12

    第一章、简介

    ?

    • 本文基于吴恩达人工智能课程做学习笔记、并融入自己的见解(若打不开请复制到浏览器中打开)https://study.163.com/courses-search?keyword=吴恩达。
    • 本文第二章将介绍 迁移学习场景、迁移学习的意义、迁移学习存在意义的本质原因等等。
    • 对本文的总结:

    ?

    此图像的alt属性为空;文件名为1-5-1024x306.png

    ?

    第二章、迁移学习

    ?

    2.1、迁移学习的定义

    ?

    • 深度学习中最强大的理念之一,就是有的时候神经网络可以从一个任务中习得知识, 并将这些知识应用到另一个独立的任务中。
    • 例如也许你已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那些知识或者部分习得的知识,去帮助您更好地阅读 x 射线扫描图,这就是所谓的迁移学习

    ?

    2.2、把对猫图片识别的神经网络迁移到对放射图片的识别,加快学习速率(迁移学习举例1)

    ?

    • 我们来看看,假设你已经训练好一个图像识别神经网络,所以你首先用一个神经网络并在 (x,y)对上训练,其中?x?是图像,y 是某些对象,图像是猫或狗 鸟或其他东西。
    • 如果你把这个神经网络拿来用在识别不同的图像,比如放射科诊断,就是说阅读 X 射线扫描图。
    • 你可以把神经网络最后的输出层拿走,即把它删掉(图2-1所示);还有把最后一层的权重删掉,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。
    • 具体来说,在第一阶段训练过程中,当你进行图像识别任务训练时,你可以训练神经网络的所有常用参数、所有的权重、所有的层,然后你就得到了一个能够做图像识别预测的网络。
    • 在训练了这个神经网络后,要实现迁移学习——你现在要做的是把数据集换成新的(x,y)对,现在这些x变成放射科图像,而?y?是你想要预测的诊断,你要做的是初始化最后一层的权重,让我们称之为$$w^{[l]}$$和 $$b^[l]$$?随机初始化。
    • 现在,我们在这个新数据集上重新训练网络,在新的放射科数据集上训练网络,用放射科数据集从新训练神经网络有几种做法。
    • 如果你的放射科数据集很小,你可能只需要重新训练最后一层的权重,就是$$w^{[l]}$$和 $$b^[l]$$?, 并保持其他参数不变(做法1)
    • 如果你有足够多的数据,你可以重新训练神经网络中剩下的所有层(做法2)
    • 经验规则是如果你有一个小数据集,就只训练输出层前的最后一层,或者也许是最后一两层,但是如果你有很多数据,那么也许你可以重新训练网络中的所有参数。
    • 如果你重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练,因为你再用图像识别数据时,需要去预先初始化 或者预训练神经网络的权重。
    • 然后,如果你以后更新所有权重在放射科数据上训练,这个过程叫微调,如果你在深度学习文献中看到预训练和微调,你就知道它们说的是这个预训练和微调迁移学习来源的权重。
    • 在这个例子中你做的是把猫图像识别中学到的知识,应用或迁移到放射科诊断上来,为什么这样做有效果呢??有很多低层次特征比如说边缘检测、曲线检测、阳性对象检测,从非常大的图像识别数据库中习得这些能力,可能有助于你的学习算法在放射科诊断中做得更好。
    • 算法学到了很多结构信息、图像形状的信息,其中一些知识可能会很有用,所以学会了图像识别,它就可能学到足够多的信息去了解不同图像的组成部分是怎样的,学到线条、点、曲线等等这些知识的一小部分,这些知识有可能帮助你的放射科诊断网络,学习更快一些或者需要更少的学习数据。

    ?

    此图像的alt属性为空;文件名为1-3.png

    图2-1

    ?

    2.3、 把语音识别的神经网络迁移到对唤醒器的识别(迁移学习举例2)

    ?

    • 这里是另一个例子,假设你已经训练出一个语音识别系统,现在?x?是音频或音频片段输入,而 y 是听写文本,所以你已经训练了语音识别系统让它输出听写文本。
    • 现在,我们说你想搭建一个“唤醒词”或“触发词”检测系统,所谓唤醒词或触发词就是我们说的一句话,可以唤醒家里的语音控制设备。比如你说“Alexa”可以唤醒一个亚马逊Echo设备,用“OK Google”来唤醒Google设备,用” Hey Siri” 来唤醒苹果设备,用”你好百度”唤醒一个百度设备。
    • 要做到这点,你可能需要去掉神经网络的最后一层,然后加入新的输出节点,但有时你可以不只加入一个新节点,或者甚至往你的神经网络加入几个新层,然后把唤醒词检测问题的标签 Y 喂进去训练。
    • 训练一个新层或几个新层,这取决于你有多少数据,数据量少时你可能只需要重新训练网络的新层;数据量多时也许你需要重新训练神经网络中更多的层,如图2-2所示。
    • 那么迁移学习什么时候是有意义的呢? 迁移学习起作用的场合是,迁移来源问题你有很多数据,但迁移目标问题你没有那么多数据。

    ?

    此图像的alt属性为空;文件名为1-4.png

    图 2-2

    ?

    2.4、 从数据量很多的问题迁移到数据量相对小的问题,迁移学习才有意义,这也是迁移学习的有意义的本质

    ?

    • 假设图像识别任务中你有 1 百万个样本,所以这里数据相当多,可以学习低层次特征,可以在神经网络的前面几层学到如何识别很多有用的特征。
    • 但是对于放射科任务,也许你只有一百个样本,所以你的放射学诊断问题数据很少,也许只有 100 次 X 射线扫描的样本。
    • 所以你从图像识别训练中学到的很多知识可以迁移,并且真正帮你加强放射科识别任务的性能,即使你的放射科数据很少。
    • 对于语音识别,也许你已经用 10000 小时数据训练过你的语言识别系统,所以你从这 10000 小时数据学到了很多人类声音的特征,这数据量其实很多了。但对于触发字检测,也许你只有 1 小时数据,所以这数据太小,不能用来拟合很多参数。
    • 所以对于语音识别这种情况下,预先学到很多人类声音的特征,人类语言的组成部分等等知识,可以帮你建立一个很好的唤醒字检测器,即使你的数据集相对较小,对于唤醒词任务来说数据集要小得多。
    • 针对上述的图像识别迁移和语音识别迁移情况下,你从数据量很多的问题迁移到数据量相对小的问题,显得非常有意义
    • 但是反过来的话——即从数据小的问题迁移到数据量很多的学习问题,迁移学习可能就没有意义了。
    • 所以总结一下,什么时候迁移学习是有意义的?如果你想从任务 A 学习,并迁移一些知识到任务 B,那么当任务 A 和任务 B 都有同样的输入 x 时,迁移学习是有意义的。
    • 在第一个例子中,A 和 B 的输入都是图像。
    • 在第二个例子中,两者输入都是音频,当任务 A 的数据比任务 B 多得多时,迁移学习意义更大,所有这些假设的前提都是你希望提高任务 B 的性能,因为任务 B 每个数据更有价值。
    • 对任务 B 来说,通常任务 A 的数据量必须大得多才有帮助,因为任务 A 里单个样本的价值比任务 B 单个样本价值更大,然后如果你觉得任务 A 的低层次特征,可以帮助任务 B 的学习那迁移学习更有意义一些。
    • 而在这两个前面的例子中,也许学习图像识别教给系统足够多图像相关的知识,让它可以进行放射科诊断;也许学习语音识别教给系统足够多人类语言信息,能帮助你开发触发字或唤醒字检测器。

    ?

    2.5、 小结

    ?

    • 所以总结一下,迁移学习最有用的场合是,如果你尝试优化任务 B 的性能,通常这个任务数据相对较少,例如在放射科中,你知道很难收集很多 x 射线扫描图,来搭建一个性能良好的放射科诊断系统。
    • 所以在这种情况下,你可能会找一个相关但不同的任务,如图像识别,其中你可能用1百万张图片训练过了,并从中学到很多低层次特征,这也许能帮助网络在任务 B 在放射科任务上做得更好,尽管任务 B 没有这么多数据,迁移学习什么时候是有意义的?
    • 它确实可以显著提高你的学习任务的性能,但我有时候也见过,有些场合使用迁移学习时,任务 A 实际上数据量比任务 B 要少——这种情况下,增益可能不多(即效果不好,因此迁移学习不建议用在任务 A 实际上数据量比任务 B 要少的场景)。
    • 这就是迁移学习,你从一个任务中学习,然后尝试迁移到另一个不同任务中,从多个任务中学习。
    • 多任务学习——从多个任务中学习还有另外一个版本(即另一个值得我们学习的知识点),就是所谓的多任务学习,多任务学习的意思就是当你尝试从多个任务中并行学习,而不是串行学习在训练了一个任务之后,试图迁移到另一个任务,所以在下一个视频中,让我们来讨论多任务学习。

    ?

    cs