1、为什么能够使用预训练?
一种观察现象:假设一网络的输入是一只狗,在网络的最初几层,网络只能检测一些边边角角的低级特征;到了中间的层,网络可能
会检测到一些线条和圆形,比边边角角特征更明显;到了较深层,网络能够提炼
代表狗的高级特征,比如腿、脸等。
对于这种观察到的现象,一种广泛接受的解释是:对于CNN,其渐层负责学习通用的特征(比如边、角等),深层负责学习与任务相关的特殊特征(腿、脸等)。随着层次的加深,网络渐渐从通用特征过渡到特殊特征的学习表征。
由上可知,既然浅层是与任务无关的,而高层是与任务相关的,那么我在训练一个分类猫的网络时,是否可以使用训练好的分类狗的网络的浅层?帮助我们提取诸如边、角等浅层特征。那么关键的问题在于:如何确定一个网络中哪些层负责学习通用特征、哪些层负责学习特征特征?
前人做了一系列的工作,总结来看,对深度网络可迁移性现在有以下结论:
- 神经网络前几层基本都是通用特征,迁移效果会比较好
- 深度迁移网络中加入微调(结合起来再稍微训练下),提升效果比较大,可能比原网络效果还好
- 微调可以比较好地克服数据间的差异
- 深度迁移网络要比随机初始化权重效果好
- 网络层数的迁移可以加速网络的学习和优化
2、微调
当我们使用预训练模型时,需要做出一些改变,比如我们使用CIFAR10预训练模型来帮助我们训练一个猫狗分类的2分类网络时发现,CIFAR10有100个分类。所以如下图所示,我们可以假设左边为100个分类的CIFAR10预训练模型,右边是我们猫狗2分类的网络,我们先将层的参数(不包括输出层)复制到我们的网络中,再和自定义的输出层连接,然后再以合适的学习率开始训练。五种卷积神经网络解决猫狗分类问题(五):V5 预训练-微调模型