KaihuaTang/Long-Tailed-Recognition.pytorch

关于训练和测试集同是长尾分布时 TDE 有效性的问题?

urbaneman opened this issue · 2 comments

尊敬的作者,您好,感谢您的工作并开源代码
我尝试使用您的方案训练自己的数据集(5类,训练集和测试集都是长尾分布,且同分布)

训练和模型参数

# default num_head = 2
criterions:
  PerformanceLoss:
    def_file: ./loss/SoftmaxLoss.py
    loss_params: {}
    optim_params: null
    weight: 1.0
last: false
# apply incremental pca to remove main components
apply_ipca: false
num_components: 512
model_dir: null
tuning_memory: false
networks:
  classifier:
    def_file: ./models/CausalNormClassifier.py
    optim_params: {lr: 0.001, momentum: 0.9, weight_decay: 0}
    scheduler_params: {coslr: false, endlr: 0.0, gamma: 0.1, step_size: 30, warmup: true, lr_step: [60, 80], lr_factor: 0.1, warm_epoch: 5}
    params: {dataset: GCAssCls, feat_dim: 128, num_classes: 5, stage1_weights: false, use_effect: true, num_head: 2, tau: 16.0, alpha: 1.0, gamma: 0.03125}
  feat_model:
    def_file: ./models/ResNet18Feature.py
    fix: false
    optim_params: {lr: 0.001, momentum: 0.9, weight_decay: 0}
    scheduler_params: {coslr: false, endlr: 0.0, gamma: 0.1, step_size: 30, warmup: true, lr_step: [60, 80], lr_factor: 0.1, warm_epoch: 5}
    params: {dataset: GCAssCls, dropout: 0.5, stage1_weights: false, use_fc: True, fc_channel: 128, pretrained: True}
shuffle: false
training_opt:
  backbone: resnet18
  batch_size: 128
  dataset: GCAssCls
  display_step: 10
  display_grad: False
  display_grad_step: 10
  feature_dim: 128
  log_dir: ./logs/GCAssCls/models/resnet18_e100_C5_warmup_causal_norm_lr1e-3_adam
  log_root: /logs/GCAssCls
  num_classes: 5
  num_epochs: 100
  num_freeze_epochs: 6
  num_workers: 12
  open_threshold: 0.1
  sampler: null
  sub_dir: models
  optimizer: adam

我使用了ResNet18作为backbone,并使用了ImageNet上的pretrain model,训练出来的结果,并在backbone连接了fc和dropout,迭代100个epoch,在训练集上的准确率基本到99.9%,此时获得模型在测试集上表现很差
classifice 中 use_effect 置为 false 是测试 不含 TDE 的结果。

测试在长尾测试集上的结果

image

几点疑问

  • 添加了TDE后,many-shot类准确率大幅下降,few-shot类的召回率有所提升,请问这正常吗?
  • 论文分类任务中test数据集都是类别均衡分布的数据集,如 ImageNet-LT 每个类有50个样本,cifar-10/100只在训练时进行非均衡采样,而实际生产场景中的分类任务很多本身也是长尾分布的,在收集的训练集基本同应用场景同分布,在与实际场景不同分布的情况下去评估模型的性能有违初衷?

你好:
关于问题1,现有的long-tail算法基本都会对many-shot有下降(除了一些ensemble的方法和data augmentation方法直接从模型和数据层面改进的外),我们TDE内部有个alpha参数就是调节在头尾间的trade-off,你可以试着该小一点alpha看看。
关于问题2,测试和训练同分布的情况下,必然不做任何处理的训练就能取得很好的效,这种传统的训练也可以叫Empirical Risk Minimization。理论证明train,test同分布下ERM可以取得最优。但ERM的问题是什么呢:举个无人驾驶的例子,就是如果雨天雾天相比晴天是罕见情况的话(eg, 仅占1%),完全放弃这些罕见天气的情况,把模型性能用来专攻晴天就可以取得很好的overall效果,但这样的模型真的有价值吗?而long-tail做的是Invariant Risk Minimization,所以必须要设置的balanced的测试集来保证最坏情况下的效果。

希望能解答你的问题

你好: 关于问题1,现有的long-tail算法基本都会对many-shot有下降(除了一些ensemble的方法和data augmentation方法直接从模型和数据层面改进的外),我们TDE内部有个alpha参数就是调节在头尾间的trade-off,你可以试着该小一点alpha看看。 关于问题2,测试和训练同分布的情况下,必然不做任何处理的训练就能取得很好的效,这种传统的训练也可以叫Empirical Risk Minimization。理论证明train,test同分布下ERM可以取得最优。但ERM的问题是什么呢:举个无人驾驶的例子,就是如果雨天雾天相比晴天是罕见情况的话(eg, 仅占1%),完全放弃这些罕见天气的情况,把模型性能用来专攻晴天就可以取得很好的overall效果,但这样的模型真的有价值吗?而long-tail做的是Invariant Risk Minimization,所以必须要设置的balanced的测试集来保证最坏情况下的效果。

希望能解答你的问题

感谢耐心的解答:

  1. 经过调整alpha值,测试结果表明many-shot的recall与alpha值大小负相关,设置为0.5,overall为96.8%,在可接受范围
  2. 回答的很棒,解答了我的疑问,点赞

这是一篇很棒的工作,再次感谢