Transfer Learning迁移学习

如果你想实现一个计算机视觉应用,而不想从零开始训练权重,比方从随机初始化开始训练,实现更快的方式通常是下载别人已经训练好权重的网络结构,把这个作为预训练迁移到你感兴趣的新任务上。计算机视觉的研究社区已经很擅长把很多数据库发布在网络上(如ImageNet、MSCOCO、PASCAL等数据库,这些是已经公开在线的不同数据库的名字),许多计算机视觉的研究者已经在上面训练了自己的算法。有时候算法训练要耗费好几周时间,占据很多GPU,事实上有人已经做过这种训练以及痛苦的高性能调试过程。这意味着我们可以下载这些开源的权重(有人曾花费数周或数月来训练和调试这些权重)可以用来为我们自己的神经网络做好的初始化开端,且可以用迁移学习来迁移知识,从这些大型公共数据库迁移知识到自己的问题上。

如上,这里假设有一个三分类的问题,猫的名字分别为Tigger、Misty或者其他名字。对于一幅图,就会存在以下四种情况,分别为图里包含Tigger还是Misty或者两者都不是、两者都包含在一副图里的四种情况。现在你可能没有足够多的Tigger、Misty的照片,这样就导致了我们训练集很小。

这个时候我们可以上网下载一些开源的神经网络应用,不但下载源码,还要下载相应权重,你可以下载许多已经训练好的网络(例如在有1000类物体的ImageNet数据库上训练,因此该了网络有一个可以输出千分之一类别概率的softmax神经元,你能做的是去掉其softmax层,然后创造自己的softmax层来输出 Tigger/Misty/其他。从网络方面来看,建议考虑冻结前面这些层,即冻结该网络前面所有层的参数,因此可以只训练与自己softmax层有关的参数,即与三个类别输出有关的softmax层( Tigger/Misty/其他 )。通过用别人训练好的权重,即使在很小的数据库上也可以得到很好的性能。

幸运的是 许多深度学习框架 也支持这样的用法。事实上,根据框架结构,它有点像所包含的trainableParameter可训练参数为0,你可以把前面某些层设置 trainableParameter=0;另一种说法是不要训练这些权重,或有时你就可以用一个参数 freeze=1 来设置网络。这些不同的方法和不同的深度学习框架可以让你来确定是否训练与某些具体层相关的权重。所以在现在的例子中,你可以只训练softmax层的权重,同时冻结前面所有层。

另一种应用中比较巧妙的方法是由于前面所有层被冻结了,之前有些固定函数不会变,因为你现在也不改动它,也不用训练它,因此网络接受输入图像X,并把X映射到该层的激活函数上,因此这个方法可以加速训练,因为我们刚预计算过该层,而该层重激活产生的特征就直接保存在硬盘上,你所做的就是用这个固定函数(指的是前面整个冻结的层)在该神经网络的前半部分接受任意输入图像X,然后计算其特征向量,再依据这个特征向量训练一个浅层softmax模型去预测。因此预计算之前层的激活结果是有利于你计算的操作,预计算训练集所有样本(激活结果)并存到硬盘上,然后训练右边的softmax类别。这样预计算的好处是你不需要在训练集上每次迭代都重新计算这些激活结果,所以如果你的训练集比较小,以上就是你可以做的工作。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果你有更大的带标签的数据集,比如许多Tigger、Misty或者其他猫的图片,你可以冻结更少的层数,然后训练后面所有层,束层通过softmax输出 Tigger、Misty或其他。有几种可以这样做的方法,你可以用最后几层的权重作为初始化开始做梯度下降训练,或者你也可以去掉最后几层,然后用自己的新神经元和最终softmax输出训练。但有个模式,即你数据越多,所需要冻结的层数可以越少,自己训练的层数可以越多。其中的想法就是如果你选了个数据集,有足够的数据,不仅可以训练单层softmax还可以训练由所采用网络的最后几层组成的中型网络。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

最后如果你有许多数据,你可以使用该开源网络和权重,用它们初始化整个网络然后训练,尽管这是个1000类的softmax,而你只需要3类,你需要自己的softmax输出自己想要的标签。但是你有越多的带标签的数据,你可以训练的层数就越多,极端的例子就是你可以用下载的权重作为初始化,因此这些权重可以代替随机初始化,然后做梯度下降训练来更新所有权重和网络层,如上就是卷积神经网络训练中的迁移学习。

实际中因为网上公开数据库非常大,你下载的权重也是别人从大量数据上花费数周训练而来的,你会发现对许多计算机视觉应用来说如果你下载别人开源的权重来初始化自己的问题,你可以取得更好的训练结果。因此在所有不同领域中,在所有深度学习应用的领域中,计算机视觉是其中一个迁移学习可以一直应用的领域,除非你有海量的数据集资源和计算资源支持你从零训练自己的网络。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章