485. NBME - Score Clinical Patient Notes | nbme-score-clinical-patient-notes
首先,感谢 Kaggle 团队和组织者举办这次比赛!
我在这次比赛中学到了很多,特别是关于伪标签的知识,因为这是我第一次使用伪标签。
我们的模型基本上和其他人的一样。我们的最终提交结果是由基于 DeBERTa 的 QA 风格模型经过伪标签实例训练后的集成组成的。
网络结构是 bert (最后一层隐藏状态) -> dropout -> fc (输出维度=1) -> BCE 损失。
我们简单地以均匀权重对输出概率进行了集成。
我们在开始尝试伪标签(PL)时,是通过在预测概率上设置阈值来选择可信的伪实例,以减少噪声。
不幸的是,我们发现设置任何阈值都比不设置阈值(准确地说是“无阈值”实际上等同于阈值=50%)的 LB 分数更差。
我们还尝试了基于置信度的选择方法 (https://openreview.net/forum?id=-ODN6SbiUU),但它也没有优于无阈值的方法(我个人对这个结果感到难过)。
我的想法是,我们需要困难的实例来提高模型的决策能力,但选择方法移除了这些实例,所以存在权衡。由于许多先前的工作通过选择可靠的实例取得了成功,应该有一些因素导致选择方法在这个数据集上效果不佳,但由于知识匮乏,我不确定具体是什么(也许如果教师模型的性能足够好,选择相对来说就不那么必要了?)
虽然基于阈值的选择效果不佳,但伪实例中确实存在噪声。
我们没有设置阈值,而是尝试为每个 CV 折叠构建伪实例,并取它们的交集(即,如果所有 CV 模型对某个实例输出相同的预测,则保留该实例)。这减少了大约 1/3 的伪实例,并使 LB 提升了 +0.001~0.002。
缺点是,这泄露了更多 OOF 的信息,导致我们的 CV 分数飙升🚀 (0.91~0.92)。
我们还尝试从 CV 的集成输出构建伪实例,它给出的 CV/LB 分数与交集版本相似。我觉得交集版本比集成版本离 OOF 的直接泄露稍微远一点,所以我决定使用交集版本。
我们使用 Radam 作为优化器。我们在训练期间保持学习率固定,没有使用任何学习率调度器(如余弦退火)。
我们按范数裁剪梯度,最大范数为 1.0。
我们通过 transformers.PreTrainedModel._init_weights 方法初始化输出全连接层的权重,这对稳定训练真的很有帮助。
没有 MLM(掩码语言模型)训练。
当我使用 deberta-v3-large 时,我尝试调整所有超参数,但大多数参数对 CV 分数影响很小。例外是学习率,因此对于其他 deberta 变体,我使用了与 deberta-v3-large 相同的超参数值(学习率除外),并且只针对每个模型调整了学习率。
单模 (含 PL):
| 模型 | LB | Private |
|---|---|---|
| v3-large | 0.889 | 0.889 |
| v3-large (其他 CV 种子) | 0.890 | 0.891 |
| v3-large (又一个其他 CV 种子) | 0.888 | 0.889 |
| v1-xlarge | 0.888 | 0.891 |
| v1-large | 0.886 | 0.888 |
| v2-xlarge | 0.888 | 0.889 |