人脸识别实际训练模型中,随着新数据的逐渐增加,对新的数据进行finetune是必不可少的一步,在实际的finetune过程中,有可能出现神经网络对新出现的数据不敏感的情况(称之为训不动)。

造成这种现象的一个原因在于weight-decay。在训练baseline的过程中,我们会选择一个合适的weight-decay来增强我们模型的泛化能力。问题在于,weight-decay会将一些对于baseline数据集无关的kernel置为0,也就是我们常将的dead kernel。这些dead kernel呢在finetune的时候是不会受到新数据的激活的(已经变成0了也就没有梯度了)。这样其实我们是在一个缩减版的网络上来进行我们数据的finetune,这样下来效果会大打折扣。

解决这个问题的方法其实也很简单,那就是我们在保持weight-decay的情况下不让这些kernel变成0就可以了。这里有一种很巧妙的解决方法:

原来我们的网络结构一般是conv(bias=false)+bn+scale+relu,那么weight-decay的问题作用在这个scale层里面的scale_factor上面(也就是variance),所以我们只需要将这个variance固定为1,就能够很好的解决这个问题了。

在mxnet 中的实现很简单,mxnet已经实现了fix_gamma=true功能。对于pytorch而言,官方并没有提供这个实现,这里我们可以将网络重新设计为:bn+conv(bias=true)+relu,然后将bn中的affine参数设为false即可。

我认为这是一个实际工程中对于任何finetune问题都通用的一个小trick,希望对于从业人员能够有所帮助。

当然不只是对于finetune,因为这个操作最大化的利用了kernel,所以训练出来的模型无法进行减枝等一系列操作,但是如果你不想在对设计好的小网络进行减枝,那么这个功能将能够使你网络的capability最大化。

然后放一个卫星:

最近做个了一个简单的feature augmentation(我自己的叫法),在glint trillion pairs的测试如下图:


pytorch 指定某一维度数值 pytorch weight_decay_人脸识别 pytorch


可以看到这个是在arcface-Resnet50IR(fully connect,no dropout)-emore的基础上面加了feature-argumentation之后到达了78.6%的identification TPR@FAR=1e-3 performance,相较于我自己测得arcface-Resnet50IR-emore的76%的performance大概高了2个百分点,当然测试一定会有偏差,所以也希望大家能够提供原版arcface-resnet50-emore 在glint上的performance,感激不尽。理论上这个feature augmentation可以适用于任何的角度空间下的loss,如果经过我多个训练数据集测试有效,那么你很可能会在《深度挖坑7》中见到;如果无效的话,emmmm.... 大家就当无事发生过。