关于训练和测试集同是长尾分布时 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 的结果。
测试在长尾测试集上的结果
几点疑问
- 添加了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的测试集来保证最坏情况下的效果。
希望能解答你的问题
感谢耐心的解答:
- 经过调整alpha值,测试结果表明many-shot的recall与alpha值大小负相关,设置为0.5,overall为96.8%,在可接受范围
- 回答的很棒,解答了我的疑问,点赞
这是一篇很棒的工作,再次感谢