【领域适应】训练梯度反向层(gradient reversl layer, GRL)

写在前面:本文纯属个人项目需用到GRL,特此记录调试过程的一些经验,如有问题欢迎指正。
本文不对GRL做介绍,了解学习概念可往:GRL (其中第二高赞的问题令人深思,个人觉得很有道理)
下面进如正文:

  1. 验证分类器有效:在调试GRL前,先单独对分类器进行训练,确保网络能够进行分类;
  2. 验证GRL是否工作:在输出结果层(最后一层)后面加上GRL,令整个梯度都是反向的,并且将GRL参数设置为常数1,观察训练loss是否越来越大;
  3. 以上功能确保正常后,即可将GRL加到网络进行训练。理想的网络分类器损失先下降后增加的趋势,最后网络无法对其分类。
    然而,实验中出现了分类器损失一直保持不变,既开始分类器一直学不到东西,通过修改学习率、优化器等皆无果,后面想起GRL还有一个参数,对其进行调整,网络终于开始能学着分类。所以很重要的是GRL的参数 α \alpha α(既反向梯度所乘系数),我采用的是原论文的系数设置,随着迭代次数的增加, α \alpha α由0增加到1。但是在调试时,发现 α \alpha α设置为0.001是能满足前面第3点提到的趋势,大一点则损失不降,因此最后设置是 α \alpha α由0增加到0.002。所以不止分类器和GRL是否有效工作很重要,GRL的参数 α \alpha α也很重要,但发现分类器损失一动不动时,试着把 α \alpha α减小一个数量级在跑跑看。

题外话:在调试时,可以选择val set或者少量数据进行训练,这样更快能看出方法是否有效,而不是一整个数据集丢进去跑,太浪费时间了!毕竟迭代的次数多了,才能看得出网络损失的趋势。同时,在进行实验时,一定要对数据集和标签进行可视化(我做的是图像的目标检测),粗略的过一遍,确保数据集的处理没有问题。
做了好几个项目,还总是没有吸取教训,希望说的点能帮到大家。

你可能感兴趣的:(领域适应,迁移学习)