fine_tuning原理问题

请问fine_tuning的原理是什么,现在只是会用它训练以及分类,还不知道fine_tuning具体是怎么进行微调的,用已有模型继续训练自己的数据,这对我自己的网络有什么要求吗,fine_tuning是怎么微调网络参数的,这些参数经过微调会发生什么变化才会适应我的数据实现正确分类?
已邀请:

辛淼 - CaffeCN社区创始人

赞同来自: yty98 betas 李扬 孙琳钧 王斌_ICT shakevincent huangzhaolu sunxingxingtf coolwyj OutLaws OpenAI更多 »

这是个很好的问题~
一般我们在训练from scratch的时候往往要在一些超大型的数据集上训练,一个目的是为了让训练得到的特征(尤其是底层特征)更加多样。而从genertive pre-training到discriminative fine-tuning的过程是一个对泛化特征进行面向task的特化的过程。
如果把fine-tuning之后的特征可视化出来,我们会发现高层特征可能会发生一些有趣的变化,直接反映出你的task:
reveals_cnn.jpg

而底层的特征,可能并没有非常明显的变化(这里是有争议的,请保持审慎)。
那么是不是底层特征就没用呢?切实恰恰相反,底层特征非常重要,如果底层特征不够好,特征类型不够充分,很可能训练不出来好的高层抽象。这就是为什么需要在大规模数据集上进行genertive training的原因之一。

还有很多内容,先mark一下,有空再继续说~
 
================================================================

嗯嗯,我回来啦~
分享一篇NIPS2014上Bengio大神的文章供参考:
How transferable are features in deep neural networks?
a.JPG

李扬 - 密码六个一

赞同来自: yty98 lady_he xjtuljy coolwyj OutLaws 起个名字好费事 OpenAI更多 »

上面几位大牛已经从理论角度解释的很好了。我就说一下直观的理解吧。
 
首先,如果你将底层特征可视化出来,会发现底层特征多是一些边、角之类的基础几何形状。 在大数据集上进行 pretrain 的目的之一是为了获得丰富、一般化的底层特征,换言之就是学到丰富的“基础几何形状”。有了这些丰富的基础几何形状,等过渡到小数据集上 finetune 的时候,就可以通过它们组合出上层具有强判别力的特征。此时,如果你再将组合出来的上层特征可视化,就会发现它们已经有模有样了,见上面辛博的配图。反之,如果你直接在小数据集上训练,那么就难以获得丰富的、一般化的基础几何形状,也就难以“描绘出”栩栩如生的上层特征。
 
这就好像是盖楼。你想盖出一座独特、壮丽的大楼,就必须具备丰富、大量的建材。例如,如果你只有木头,那你只能盖木屋;你只有砖头,那只够盖厕所;你有了钢筋混凝土、强化玻璃、大理石、木方、形状各异的砖头...你才能盖出大楼来。
 
所以,finetune 好像就是去搜集丰富的建材的过程。
fine_tuning的过程其实就是用训练好的参数(可以从已训练好的模型中获得)初始化自己的网络,然后用自己的数据接着训练,参数的调整方法与from scratch训练过程一样(梯度下降)。对于初始化过程,我们可以称自己的网络为目标网络,训练好的模型对应网络为源网络,要求目标网络待初始化的层要与源网络的层相同(层的名字、类型以及层的设置参数等等均相同)。

王斌_ICT - 研究领域:深度学习,目标检测

赞同来自: caffe yty98 OutLaws 华灯初上照小川 起个名字好费事 lxwahu更多 »

Fine-tuning已经成为了使用DL网络的一个常用技巧(trick)。个人认为在使用深度网络做图像处理任务时,使用一个在大的数据集上预训练好的模型(ex:caffe在imagenet上训练的caffeNet, VGG16...)在自己数据上微调往往可以得到比直接用自己数据训练更好的效果,这是因为在imagenet上预训练的模型参数从微调一开始就处于一个较好的位置,这样微调能够更快的使网络收敛。对于相同类别的任务我们可以默认这样去做比较好,比如我们可以直接利用caffe在imageNet classification task 预训练的模型做一些其他的分类任务。然而当我们要做一个不同的任务,比如在imageNet上做Detection,那么可能直接拿在imagenet分类任务上预训练的模型进行微调就不是最好的了。分类考虑的是图像的一个语义信息,无论目标出现在哪里判定出类别就算正确,而检测不一样,还需要知道目标的确切位置,所以对于检测任务,我们也可以使用微调这个trick,但使用的预训练网络是在目标级别数据库上训练的(图像就是一个完整目标或者图像中所有目标都有标记—Bounding Boxes Infomation)。
参考文献:
Ouyang, Wanli, et al. "Deepid-net: Deformable deep convolutional neural networks for object detection." CVPR.2015

zeakey - please visit my homepage: zhaok.xyz

赞同来自: yty98 shakevincent xjtuljy 华灯初上照小川 起个名字好费事 lxwahu更多 »

从我们的实验经验上来看,网络越深,底层的参数越难得到有效训练,这也是为什么经常有人用 vggNet  finetune 的原因之一.
 
使用 backpropagation 进行训练的时候残差逐层传递,有可能到底层的时候残差就很小了(gradient vanishing),导致底层的参数train 不动.   这也是楼上辛同学的图里底层 feature map 没有什么改变的原因之一,因为底层参数本身就很难得到训练.
 
finetune 就是直接从别人已经训练好的网络上拷贝参数,然后针对自己的数据训练新的模型.
这时候需要比较小的 learning_rate, 因为要在不破坏原有模型的情况下 fit 自己的数据,finetune 的好处就是可以直接获得我们难以或者无法训练的底层参数.
请问假如pre trained的网络有4层,自己的网络有3层,caffe上能用预训练的网络权值去fine tune自己的网络吗?

yty98

赞同来自:

谢谢回复,期待更多的见解!

Zellar209

赞同来自:

请问具体怎么实现呢?在caffe上需要做那些改动呢?

要回复问题请先登录注册