[第48名] 有效与无效的方法总结
作者: bluetrain | 排名: 第48名
该解决方案是基于 Abhishek 的精彩内核构建的:
https://www.kaggle.com/abhishek/roberta-on-steroids-pytorch-tpu-training
有效的尝试:
- 对于中性情感:直接令 selected_text = text。
- 增加了批次大小 (batch size) (64)。
- 标签平滑。
- 修改交叉熵损失函数,以惩罚与真实跨度 的距离(参见此内核:https://www.kaggle.com/laevatein/tweat-the-loss-function-a-bit)。
- 后处理:用于修正由空格引起的偏移,也就是所谓的“魔法”,见下文 => LB 分数 +0.004。
- 伪标签 => LB 分数 +0.002。我通过仅使用每次折叠迭代中的训练集样本预测情感和选定文本,从原始数据集中生成了伪标签样本,以避免验证集的数据泄露。我选取了置信度最高的 4000 个正面/负面样本和 2000 个中性样本,置信度基于起始/结束 logits 的和。对于中性伪样本,selected_text = text。
- 集成:平均 3 个随机种子 5 折模型的 logits + 3 个随机种子在完整训练数据集上运行的模型(增加 1 个 epoch) => LB 分数 +0.001。
无效的尝试:
嗯,除了上述方法外其他都没用,特别是:
- 数据增强(同义词替换、词语交换、字符替换等)。
- 正面/负面样本的上采样。
- 在 Transformer 顶层添加复杂的头部 结构。
- ...
后处理代码(修正偏移):
def fix_offset(x):
txt = x['text']
if txt == '':
return ''
pred = x['selected_text']
new_txt = ' '.join(txt.strip().split())
start = new_txt.find(pred)
end = start + len(pred)
to_end = len(new_txt) - end
return txt[start: len(txt) - to_end]