动机:在一个任务上训练好的模型,能在别的地方能用
方法:
1.训练好的模型,做成一个特征抽取的模块;
2.在一个相关的任务上训练一个模型,到另一个任务上直接使用
3.在新的任务上进行一点点微调,更好的在另一个任务上使用
目的:利用别人标号的数据,将一些学到的东西迁移过来
转移知识的方法
1.用的最多的是用预训练好的模型
对于一个大的神经网络,可以分成两块,一块为编码器,一块为解码器。编码器就是特征提取的,编码器把原始图片的信息转化为特征,解码器做一个简单的线性分类器,就是做一些简单的标号或者是其他决策。具体流程:
下面这些卷积层可以当成编码器,上面输出的作为解码器,解码器把卷积层的特征分类了一下,输出这是一只猫
在一个比较大的数据集上训练好的模型,这个模型由于训练的数据集较大,在解决其他问题上也有一定能力。在编码器部分是有一定用处的。
微调:
在新的任务上构建新的模型,但是构建的模型架构要和与训练模型的架构一样。新模型的卷积层(编码器)在初始化权重的时候不是用的随机,而是直接把预训练好的那些权重复制过来,最后一层解码器还是用的随机初始。
假如在一个数据集上做好预训练模型了,在新的任务中,模型的卷积层复制过去就好,调整的是最上面的决策层,只要告诉模型怎么做决策就好了,下面特征提取的任务预训练任务已经做好了,最后根据误差调整一下卷积层。
要限制搜索空间:蓝色的点是泛化误差最小的点,而红色的点是数据集上训练误差最小的点,蓝色的才是我们最终想要的,所以在这个数据集上训练过多并不是一件好事,所以叫做微调
把最底层固定住frozen layers:因为在模型中,卷积层越往上学到的东西越全局化,比如说从一点的手指纹路最终学习到整只手。一般来说,下面这些层学到的是底层的特征,跟上面的层没有太多的关系,也许换一个数据集来说,这些边边角角的泛化性也是非常好的。卷积层越往上就越向语义空间靠近。对于一个神经网络来说,它是慢慢学习,从底层逐渐向给定的标号靠近,是一个平滑的过程。我们可以在上面的那些靠近语义的层次上做调整,而下面比较底层的就不动了,固定住,学习率变成0。
找到预训练模型:
1. http://tfhub.dev/ Tensorflow Hub
2.http://github.com/rwightman/pytorch-image-models Timm个人做的模型
微调 只是改变了初始的值,不会像随机值那样子要训练很多次。会让你训练过程缩短,但是不一定会提升精度。
总结:一般我们会在大数据集上训练模型,在新的任务上我们把新的模型设置为预训练模型的初始权权重。