迁移学习(Transfer learning)
什么是迁移学习
深度学习中,最强大的理念之一就是,有的时候,神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。
例如你已经训练好一个神经网络能够识别像猫这样的对象,然后使用那些知识,或者部分习得的知识去帮助你更好地阅读x射线扫描图。
- 用神经网络的语言来描述迁移学习其实就是,借用你训练到某层的结点数据,加入新的训练集数据,然后随机初始化新的权重和偏置,投入到新的训练过程中,从而达到借用你训练好的能够识别猫狗的神经网络,来帮助训练阅读x射线扫描图的神经网络的目的。
- 为什么可以这么做呢?究其原因,是因为你的最终训练目标和你已经训练好的神经网络是有相通之处的,例如能识别猫狗的神经网络的神经节点已经学习到了基本的图像知识,而这对于识别x射线扫描图是有裨益的,那我为何不借用已经具有一定知识的这些神经节点呢?
怎样进行迁移学习
- 参考网上的资料,通常来说,迁移学习有以下三种体现形式:
Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层。
Extract Feature Vector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。
Fine-tuning:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层,因为这些层保留了大量底层信息)甚至不冻结任何网络层,训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。 - 吴恩达老师的课程中提到了第一种和第三种。其实差别就是训练的内容是只是最后的全连接层还是包含一部分紧靠最后全连接层的一些层。
如图所示,我们舍弃了原来模型的全连接层,仅仅借用了上一层已经训练好的参数,然后随机初始化最后一层的w和b,投入新的训练集(x射线的训练集),然后不断训练更新这最后一层的w和b,最终得到合适的参数,然后预测y。这是迁移学习的第一种情况。通常如果你的训练数据很少的话,应当采用这种方法。
也可以使用训练到上面阶段的模型参数,然后训练剩下的层和输出层,这是迁移学习的第三种情况。如果训练数据量足够多,允许的话,可以使用这种方法。
这种情况其实和第三种情况也是一样的。
迁移学习何时有意义
- 显然,任务A和B应当具有相同的输入,比如上面的猫狗和x射线的例子,输入都是图片,再比如语音识别和关键词唤醒,输入都是音频。
- 同时A的数量应当比B的数据量大,因为任务B才是我们最终的目标,只有任务A有足够的数据量才能尽可能的帮助到任务B,尽可能的让B从A中借用一些现成的知识。
- 另外,如果你认为任务A的低层次特征对于任务B有较大的提升,那么迁移学习是很有必要的。其是迁移学习只是为你省去了一部分学习低级知识的麻烦,如果你认为A的低层次特征对于B有很大的用处,那么就使用迁移学习把这些知识迁移过去吧。
其他
- 图片及分条内容引用自:https://blog.csdn.net/baidu_38634017/article/details/93971061
- 右下角,待训练的数据集较小,已训练的模型和当前任务相似。此时可以只是重新训练已有模型的靠近输出的几层,例如将ImageNet中输出层原来可以判别一万种输出的网络改的只能判别猫的品种,从而利用已有网络来做低层次的特征提取。
- 左下角,待训练的数据集较小,已训练的模型和当前任务场景差距较大。例如你有的已训练网络能识别出白天高速路上的违章车辆,你需要训练一个能识别出夜间违章车辆的模型,由于不管白天夜晚,交通规则是没有变化的,所以你需要将网络靠近输入的那几层重新训练,等到新的网络能够提取出夜间车辆的基本信息后,就可以借用已有的,在大数据集下训练好的神经网络来识别违章车辆,而不用等夜间违章的车辆的照片积累的足够多之后再重新训练。
- 左上角,待训练的数据集较大,已有的模型和新模型的数据差异度很高。此时应该做的是从头开始,重新训练。
- 右上角,待训练的数据集较大,已有模型的训练数据和现有的训练数据类似。此时应该使用原网络的结构,并保留每一层的节点权重,再逐层微调。
- 接下来看一个实际的例子,大家都熟悉的MINST手写数字识别,也可以用迁移学习来做,已有的训练数据是六万张图片,已有的模型是通用的图像识别模型VGG16,看起来,我们即可以将网络的最高层重新训练,也可以训练网络的最初几层,毕竟手写数字的图片,和我们日常见到的图片即相似也有明显不同。
多任务学习
什么是多任务学习
- 迁移学习是串行的,先进行任务A然后进行任务B,而多任务学习则是并行的,任务ABC是同时进行的。它试图让神经网络同时做几件事情,然后希望每个任务都能帮到其他所有任务。
- 举个栗子
比如你正在研究自动驾驶技术,你需要从图像中识别出是否含有汽车、行人、停止标志、交通信号灯等等的东西,每种东西的有无对应标签y的1或0值,这样的话你每个图片对应的标签是一个4*1的数组。
怎样进行多任务学习
- 如下图所示
与之前用softmax分类不同了,这里每张图片其实是有4个标签,而不是softmax意义上的多分类问题了,而且当你使用图中的损失函数将4个作和的时候就意味着,你此时是在进行多任务学习。 - 相反,如果你训练四个神经网络对应每个标签的分类的话,你会发现效果相比前者差很多。
- 另外,多任务学习还有一个好处,当你的标签集合中有些标签未知的时候你依然可以进行多任务学习
你只要把标签清楚的那些进行作和求误差就好了。
多任务学习何时有意义
- 任务之间可以共用低级特征,这个和迁移学习有点相似。以无人驾驶为例,识别交通灯、行人、汽车等任务之间是有联系的,都是在驾驶中会遇到的情形,它们有一些共同的低级特征。
- 通常,任务之间的数据量要比较相近会更适合多任务学习。
- 当你可以训练一个足够大的神经网络时多任务学习会更加有效果。实验发现,唯一的多任务学习比每种任务训练一个模型效果差的情况就是你神经网络不够大的情况。
其他
- 通常迁移学习的使用频率高于多任务学习。