微调神经网络技巧

除了从头训练自己的网络,一种更有效,更好的方式就是微调已预训练好的网络模型,微调预训练模型简单点来说就是用目标任务数据在原先预训练的模型上继续训练的过程。

这是非常实用的一个技巧:

1.由于网络在原始数据上收敛,因此应该设置较小的学习率在目标数据集上微调,应该在10的负四次方以下。

2.卷积神经网络浅层拥有更泛化的特征(如边缘、纹理等),深度特征则更抽象对应高层语义。因此,在新数据上微调时泛化特征更新可能或程度较小,高层语义特征更新可能和程度比较大,故可根据层深对不同层设置不用学习率:网络深度的学习率可以稍大于浅层学习率。这样模型整体的训练速度可能更快。

3.根据目标任务数据与原始数据相似程度采用不用的微调策略:当目标数据较少且目标数据与原始数据非常相似时,可仅微调网络靠近目标函数的后几层;当目标数据充足且相似时,可微调更多网络层,也可全部微调;当目标数据充足但是与原始数据差异较大时,此时须多调节一些网络层,直至微调全部;当目标数据较少,同时还要原始数据有较大差异时,这种情况比较麻烦,微调成功与否要具体问题具体看待,不过仍可尝试首先微调网络后几层在微调整个网络。

4.此外,针对第三点中提到的目标数据极少,同时还与原始数据有较大差异的情况,目前一种有效方式是借助部分原始数据与目标数据协同训练。因预训练模型的浅层网络特征更具有泛化性,故可在浅层特征空间选择目标数据的近邻作为原始数据自己,之后将微调阶段改造为多目标学习任务,一者是将目标任务基于原始数据子集,二者是将目标任务基于全部目标数据。

微调神经网络是目前在kaggle上进行场景分类比赛上一个很重要的技巧。现在大型数据比赛给的数据集都是偏小的数据集,自己设计神经网络进行训练,不仅时间长,效果也不是特别好,主流的还是用预训练的技巧,但是常规预训练模型的话,基本名次也就在50%左右晃动,所以一般还是用花点心思在微调和集成上。


你可能感兴趣的:(深度学习)