本篇文章为比赛第一名方案解析,该比赛涉及到NLP-Token分类-医疗
介绍:在本次竞赛中,参赛者将在患者笔记中确定特定的临床概念。具体来说,参赛者将开发一种自动化方法,将临床概念从考试量规(例如,“食欲减退”)映射到这些概念在医学生撰写的临床患者笔记中表达的各种方式
网址:www.kaggle.com/competition…
解决方案摘要
以下六个模型被混合以最大化交叉验证(cv)。每个模型使用 MLM、伪标签、AWP、增强,并在 10 组 GroupStratifiedKFolds 中训练了 5 组以及所有数据,从结果 50%的 OOF 训练数据中构建我们的 CV。由于时间限制,最终提交使用了这六个模型(折 0、1、2、3、4、全部)的一些权重。笔记本
| exp-num | Hugging Face 模型 | cv | PubLB (5/10 折+全部) | PriLB (5/10 折+全部) | 最终提交 使用权重 |
|---|---|---|---|---|---|
| 107 | deberta-v3-large | 0.8925 | 0.8931 | 0.8929 | 4/10 折+全部 |
| 092 | deberta-v2-xlarge | 0.8914 | 0.8930 | 0.8911 | 3/10 折+全部 |
| 106 | deberta-large | 0.8913 | 0.8922 | 0.8925 | 2/10 折+全部 |
| 102 | deberta-v2-xlarge | 0.8925 | 0.8928 | 0.8940 | 3/10 折+全部 |
| 101 | deberta-large | 0.8907 | 0.8918 | 0.8934 | 4/10 折 |
| 104 | deberta-v2-large | 0.8921 | 0.8925 | 0.8920 | 2/10 折+全部 |
有效事项。
-
AWP
-
反馈一等奖优秀笔记本非常有帮助。
-
尝试了多个参数,以下改进了交叉验证
- adv_lr: 1.0, adv_eps: 0.01
-
CV 增加约 0.002
-
-
- 预训练在'patient_notes.csv'上执行,除了'train.csv'中的数据。
- CV 增加约 0.002
-
伪标签
-
比例,伪标签数据:90%,训练数据:10%
-
软标签
- 在我的实验中,软标签比硬标签更好地提高了 cv 分数。
- 我们尝试限制用于伪标签的数据,例如那些对任何单个字母具有超过 0.95 预测价值的数据,但从整个数据集中随机采样提高了交叉验证的效果。
-
-
增强
- 删除文本中的一句话。
- 概率增加,p=0.2
- cvscore 几乎未变。然而,它似乎适用于这项任务和数据,所以我们采用了它。
- 伪标签数据未尝试增强。
-
辅助目标学习
-
添加目标文本的开始和结束部分,并使用 3chanel 学习。
- channel_0: 正常目标
- channel_1: 开始:1,否则:0
- channel_2: 结束:1,否则:0
-
CV 改进不大,但可用于与伪标签(blend)结合。 (我认为取两个伪标签的平均值可以提高伪标签的准确性。)
-
检查 PrivateLB 分数,似乎这次尝试是有效的。
-
未工作
-
洗牌增强
- 增强随机打乱句子,使 CV 更差。
-
标签平滑损失
-
剪辑梯度范数
-
我尝试了以下两件事,但交叉验证效果变得更差。也许我们需要调整更多参数。
- torch.nn.utils.clip_grad_norm_(self.model.parameters(), 1000) -> torch.nn.utils.clip_grad_norm_(self.model.parameters(), 1000)
- torch.nn.utils.clip_grad_norm_(self.model.parameters(), 10) # 翻译为:torch.nn.utils.clip_grad_norm_(self.model.parameters(), 10)
-
后处理
- 删除前后空格。
- 这个出色的笔记本注意空白[DeBERTa+RoBERTa]非常有帮助。
cv 分割
比赛中途之前,我们一直在使用 5 折分组交叉验证。从 10 折到分组分层交叉验证的改变对我们团队来说是一个巨大的提升。