differential learning rate annealing

在学习fastai part 1过程中,注意到进行fine-tuning的时候,对pretrain model从前到后划分成了三个部分,并且设定了不同的learning rate,如下。

learn.unfreeze()
lr = np.array([1e-4,1e-3,1e-2])
learn.fit(lr, 3, cycle_len=1, cycle_mult=2)

这样设置的原因是我们训练的model实质上是在一个pretrain model的末端加了几层fully connected layers。也就是说前面的部分是别人训练过的,其权重已经是有意义的而不是随机初始化的。所以前面的部分已经是学习过的参数,我们在训练这一部分的时候不需要它的学习速度很快。并且对于一个pretrain model,越靠前的layer所学到的特征越具有广泛性,越靠后的layer则越task-specific。所以越靠前的部分我们越不需要对它做出修改,而越靠后的部分则越需要针对我们自己的数据集进行权重的更新。
假设我们使用的pretrain model来自imagenet,当我们将它用于同样来自imagenet上的数据集的时候,我们可以把learning rate设置为[1e-5, 1e-4, 1e-2],因为pretrain model的权重已经非常适合imagenet所以可以把learning rate设置的小一些,不需要有很大的更新。而如果我们在一个新的数据集上(比如卫星图)去使用这一pretrain model的时候,我们就应该把learning rate组设置的偏大,比如lr = 1e-2, lr_df = [lr/9, lr/3, lr]。因为pretrain model需要针对卫星图数据做出较大的更新。