深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务习得知识,并将这些知识应用到另一个独立任务中。
所以例如,也许你已经训练好了一个神经网络,能够识别像猫的对象,然后使用那些知识(或者一部分知识)去帮助你更好地阅读x射线的扫描图。
而这,就是迁移学习。
下面用例子说明(图像识别 --> 放射诊断):
步骤如下:
- 训练好原始网络(图像识别 image recognition)
- 把原网络最后的输出层、进入到最后一层的权重(the weights feeding into that last output layer)
- 为最后一层重新赋予随机权重。
- 将网络在新的目标数据上训练(放射诊断数据)
具体来说,在第一阶段训练过程中,当你进行图像识别任务训练时,你可以训练神经网络的所有常用参数、所有的权重、所有的层,从而得到一个能够做图像识别预测的网络。
在训练这个网络以后,要实现迁移学习,要做的就是把数据集换成新的(目标)x和y,然后初始化最后一层的权重(称为W[L]和b[L]的随机初始化)。
在再训练(retrain)神经网络的的时候有几个option:
当目标数据集很小的时候:我们可能只需要重新训练最后一层的权重W[L]和b[L],并保持其他参数不变。
如果目标数据集足够多:你也可以重新训练神经网络中剩下的所有层。
经验规则是:如果你有一个小数据集,就只训练输出层前的最后一层,或者是最后一两层。如果有足够多的数据,那么也许你可以重新训练网络中的所有参数。
这个在图像识别数据的初期训练阶段的过程,有时被称为预训练,在目标数据上训练的过程称为微调。
在这个例子中我们做的是,把图像识别中学到的知识,应用或迁移到放射科诊断上来。
这样做有效果的原因是:
有很多低层次的特征(比如说边缘检测,曲线检测,阳性对象检测),从非常大的图像识别数据库中习得这些能力,可能有助于你的学习算法在放射科诊断中做的更好。
因为算法学到了很多结构信息和图像形状的信息(the structure and the nature of how images look like),而其中一些知识可能会有帮助。
所以学会了图像识别,它就可能学到了足够多的信息来了解不同图像的组成部分是怎样的(knowledge about lines, dots, curves and so on, maybe small parts of objects)。
(我的理解是,预训练可以使得网络的较前层,学习到大类问题的通用知识!)
预训练的好处:
可以使目标网络学习的快一点,或者需要更少的学习数据。
另一个例子,语音识别:
迁移学习何时有意义:
然后分别解释下这三条
- same input指的是,都是图像或音频,其实是数据的类型的问题。
- 迁移来源数据多于迁移目标数据(因为单个迁移来源数据的价值,要小于迁移目标数据)
- 迁移来源的低水平特征对迁移目标有用。
我们有很多迁移前的数据(迁移来源数据),但是迁移目标的数据没有那么多。也就是数据比例的问题。如果迁移来源数据比迁移目标数据还少,虽然不会有什么坏处,但基本也没什么收益。