deep learning笔记:迁移学习

迁移学习(Transfer Learning),又称预训练。即利用社区内开源的权重参数更快更好地训练自己的网络。然而,我一直纳闷的是,别人训练好的参数是怎么直接用到自己的网络上来的,倘若网络结构内部有一点不同那岂不是完全不一样了吗?Andrew Ng的课程给了我很大的启发,结合上自己的一些想法,写下来。

References

电子文献:
http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/#Network_Architecture


原理

这里摘录上面参考资料中的一段话,我觉得说得很明白了。
Using a network trained on one dataset on a different problem is possible because neural networks exhibit “transfer learning”. The first few layers of the network learn to detect general features such as edges and color blobs that are good discriminating features across many different problems. The features learnt by the later layers are higher level, more problem specific features. These layers can either be removed or the weights for these layers can be fine-tuned during back-propagation.


如何使用迁移学习

迁移学习主要有如下三种策略。

下面我们具体情况具体分析。

  1. 训练数据较少

    首先,我们把开源的代码(即网络结构)和对应的权重都下载下来。当手头的训练集较小时,我们可以冻结所有层的参数,去掉网络中的softmax层或者其它与最后输出相联系的层,并且创建自己的softmax单元。这主要是考虑到下载的模型所对应的输出类别或者其他的需求与我们的不一致。在训练过程中,我们保持之前所有层冻结(用于特征提取等),只训练和我们自己设计的softmax层有关的参数。
    其实这就相当于用预训练的网络构成一个映射关系,对每一个输入都能产生一个特征向量。然后用自己设计的一个很浅的softmax网络对这些特征向量做预测。

    注:这些特征向量可以存到硬盘中,以节约每次都要遍历训练集重新计算这个激活值的时间。这在用Siamese网络进行人脸识别时是一个较为常用的操作。

  2. 训练数据中等

    如果数据较多,我们可以冻结较少的层。根据上文所述的原理,我们一般冻结较为基础的前面的几层。对于后面的层,我们有两种方法。
    (1)可以加载权重作为初始化,然后用同样的结构和自己的数据集继续训练。
    (2)也可以直接去掉这几层,换成我们自己的隐藏单元和自己的输出层。
    其实我觉得这里的基本思想还是相当于把冻结的那几层看成一个关于特征的映射。
  3. 训练数据较多

    若有足够多的数据用来作训练集,我们这时就可以把所有的参数都仅用来初始化,然后训练整个网络。因为此时不用担心过拟合的问题。
    其实规律就是:拥有越多的数据,我们需要冻结的层数(参数)越少,我们能够训练的层数(参数)就越多。

除了训练数据量之外,新数据集与原数据集的相似度也是一个需要考虑的点。倘若我们拥有较多的数据,而新数据集与原数据集的相似度却很低时,我们最好不要使用迁移学习进行预训练,而是从头开始训练整个网络。


为什么要迁移学习

关于使用迁移学习的原因,Andrew Ng没有提及,不多简单想来主要的原因主要有如下几点:

  1. 迁移学习可以弥补训练数据的不足。
  2. 迁移学习可以大大减少训练时间。
  3. 迁移学习(特别是同一领域相关的参数)可以有效地防止梯度下降卡在局部最优解处,一定程度上保证了算法的收敛性。

碰到底线咯 后面没有啦

本文标题:deep learning笔记:迁移学习

文章作者:高深远

发布时间:2020年01月28日 - 14:36

最后更新:2020年02月15日 - 22:09

原始链接:https://gsy00517.github.io/deep-learning20200128143652/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%