预训练模型&迁移学习
预训练模型概念
预训练模型是一个已经训练好的保存下来的网络
该网络之前在一个大型的数据集上进行了训练(如图像相关的网络在ImageNet数据上进行了训练)
作用
可以用来开箱即用的解决方案
- 直接用于推理
可以将预训练模型当做特征提取装置来使用,用于迁移学习
当预训练模型学习到的特征容易泛化的时候,迁移学习才能得到比较有效的使用
迁移学习
先在一个基础的数据集上进行任务的训练,生成一个基础网络
然后将学习到的特征重新进行调整或迁移到另一个目标网络上,用来训练目标任务的数据集。
- 学习到的特征保存为一个网络文件就是一个预训练模型
迁移学习是一种优化方法,节省时间,或者能获得更好的性能的捷径
迁移学习在什么情况下有效
- 当预训练模型(预训练获取到的特征)是容易泛化的,那么迁移学习就能有效的进行
需要微调来完成迁移学习
案例
采用预训练模型,这样我不需要重新训练我的整个结构,只需要针对其中的几层进行训练即可。
我采用了在ImageNet数据集上预先训练好的VGG16模型,这个模型可以在Keras库中找到。
只将softmax层的1000个输出改为16个,从而适应我们这个问题的情景
随后重新训练了dense layer
结构的准确率能够达到70%
只需要针对dense layer进行训练,所需时间基本可以忽略
如何使用预训练模型
场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言)
- 不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好
- 比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗,我们只需要把dense layer和最终softmax layer的输出从1000个类别改为2个类别(猫,狗)
场景二:数据集小,数据相似度不高
- 可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层
- 因为数据的相似度不高,重新训练的过程就变得非常关键
- 新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补
场景三:数据集大,数据相似度不高
- 因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式
- 最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练
场景四:数据集大,数据相似度高
- 保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练
从上面的四个场景可以看出,如何使用预训练模型由新旧数据集的大小和相似度来决定
缺点
一些预训练模型可能会比较大
优点
更高的起点:源模型中的初始性能比其他方法要高
更大的坡度:在训练源模型期间性能的提高速度比其他情况下更陡峭
更好的渐近线:训练好的模型的融合性能要好于其他情况
可以自定义预训练模型并将其专门用于某些问题
模型微调的方法
特征提取
- 将预训练模型当做特征提取来使用
- 将输出层去掉,将剩下的整个网络当做一个特征提取器,从而应用到新的数据集中
采用预训练模型的结构
- 预训练模型的模型结构保持不变
- 将所有的权重重新随机初始化
- 根据自己的数据集进行训练
训练特定的层,冻结其他层
- 对预训练模型进行部分的训练
- 将模型起始的一些层的权重锁定,保持不变
- 重新训练未锁定的层,得到新的权重