```html
第五名解决方案 - PII检测与移除
【介绍】
首先,我要对主办方和Kaggle工作人员表示衷心的感谢,感谢他们举办本次竞赛。同时,我要感谢Kaggle社区分享的各种数据集和见解。特别感谢 @nbroad、@pjmathematician、@valentinwerner 和 @mpware,他们的数据集和笔记本对我们的解决方案提供了很大帮助。非常感谢!
此外,我还要感谢我的队友 @takai380 和 @minfuka。(祝贺 @takai380 获得竞赛大师称号!)
【集成方案】
|
最大长度(训练/推理) |
权重 |
CV |
公开榜单 |
私有榜单 |
| ryotak12 |
128/128 |
10 |
0.979 |
0.973 |
0.960 |
| takai380 |
512/512 |
13 |
0.977 |
0.975 |
0.965 |
| minfuka |
1536/4096 |
8 |
None |
0.972 |
0.967 |
- 我们的解决方案由12个deberta-v3-large模型组成。
- 在每个成员的模型内部进行投票或平均后,我们在成员之间进行投票以得出最终预测。
- 简单投票在我们的CV和公开榜单上表现最佳。
- 为了增加集成中使用的模型数量,我在预测时使用了AMP,这减少了推理时间。
- 作为我们的策略之一,每个成员使用不同的max_length训练模型,以实现集成的多样性。
- 虽然这种方法在CV和公开榜上效果很好,但我们发现,更长的max_length在私有榜上表现更好。(@minfuka的训练最长max_length的集成本身就获得了金牌。)
【Ryota部分】
所有模型的共同点
- 骨干模型:deberta-v3-large
- 任务:Token分类
- 全数据训练
- 外部数据集:
- max_length:128
- train_overlap=96, eval_overlap=64
- 位置特征:
- EMA
- 层冻结:
- 在第一个epoch冻结骨干模型可以加快收敛。
- 从第二个epoch开始,不冻结任何层。
- 损失权重:
- 优化器:AdamW
- 调度器:余弦退火
模型具体细节
- 带/不带前缀:
- 四个模型使用带前缀的标签训练,两个模型使用不带前缀的标签训练。
- 额外训练:
- 我基本上使用nbroad的数据集作为额外数据来训练模型。
- 然而,对于某些模型,我首先使用竞赛数据结合nbroad、mpware和pjmathematician的数据集训练几个epoch。然后,使用竞赛数据和nbroad的数据集对这些模型进行再训练。
- max_length:
- 我基本上使用128的max_length训练模型,但为了多样性,其中一个模型使用512的max_length训练。
后处理
在集成之前,我对每个单一模型应用了以下后处理步骤:
- 移除空格
- 确保前缀一致性
- 使用针对每种PII类型定制的正则表达式移除误报
未生效的方法
- 第二阶段模型(用于移除NAME_STUDENT的误报):
- 将预测为NAME_STUDENT的token进行mask,然后使用二分类根据周围上下文预测被mask的token是否是真正的NAME_STUDENT。
- 然而,这只在CV中带来了0.0005的提升,所以为了避免管道的复杂性,我没有使用它。
- AWP
- 标签平滑、在线标签平滑
- GRU(跟随DeBERTa)
- 层重初始化
- 等等……
【takai380部分】
模型1:deberta-v3-large(CV/公开/私有 → 0.974/0.970/0.961)
- max_len=512, stride=128
- 数据集:
- 非'O'损失的权重增加5倍
模型2:deberta-v3-large+lstm(CV/公开/私有 → 0.965/0.972/0.955)
- max_len=512, stride=128
- 数据集:nbroad
模型3:deberta-v3-large(CV/公开/私有 → 0.973/0.967/0.969)
- max_len=512, stride=128
- 数据集:nbroad
- 非'O'损失的权重增加5倍
模型4:deberta-v3-large(CV/公开/私有 → 0.970/?/?)
- max_len=1024, stride=256
- 数据集:nbroad
- 在deberta-v3-large后添加lstm层
- 非'O'损失的权重增加5倍
- (此模型未用于选定的最佳私有模型。)
所有模型的共同点:
- 不使用B-和I-标签(这些标签是基于规则的,而不是数据驱动的;因此,不应该以数据驱动的方式学习。)
- 基本规则处理:
- NAME_STUDENT:如果不是以大写字母开头后跟小写字母,则拒绝。如果只有一个字符,移除。
- URL和EMAIL:必须符合格式,否则拒绝。
- 严格规则处理:
- 如果冠词在NAME_STUDENT的预测之前,则移除,除非后面跟着"'s"。
- 示例:
- 冠词('The', 'the', 'a', 'and')通常出现在非名字术语之前。如果'at'在前面,可能是地点,应排除。
- 'The', 'Marias', 'Gamesa', 'took'
- 但当后面跟着"'s"时也有例外,因为可能不符合预期的规则:
- ~ the Takai's house ~。在这种情况下,规则不适用。
这是个人观察,但我惊讶地看到单个模型获得的分数(0.969)与通过结合CV和公开榜分数的集成方法获得的分数相似或更高。这是否表明单个模型已经可以检测到的标签是可以实现的,而其他标签对于机器学习模型来说更难检测?
【min fuka部分】
所有模型的共同点
- 基础模型:
- deberta-v3-large(冻结embedding,冻结前6层)
- max_len=1536
- 数据集:
- 训练数据:竞赛训练数据(4/5)+外部数据
- 验证数据:竞赛训练数据(1/5)
- 训练参数:
- fp16=True
- learning_rate=2e-5
- num_train_epochs=3
- per_device_train_batch_size=8
- gradient_accumulation_steps=2
- gradient_checkpointing=True
- logging_steps=50
- evaluation_strategy='steps'
- eval_steps=50
- save_strategy="steps"
- save_steps=50
- load_best_model_at_end=True
- lr_scheduler_type='cosine'
- metric_for_best_model='f5'
- greater_is_better=True
- warmup_ratio=0.1
- 损失函数:
- CrossEntropyLoss(weight=class_weight)
- class_weight=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.1] ←只有'O'标签为0.1
外部数据(感谢所有外部数据作者)
规则处理
推理
- 参考的笔记本:
- 与训练的区别:
- INFERENCE_MAX_LENGTH=4096
- STRIDE=384
集成
- 集成(使用上述模型:模型1、模型2和模型3。)
- ensemble_pred = (Model1 + Model2 + Model3) / 3 ← softmax之前
- 上述推理分数为 公开:0.972 私有:0.967
- (添加takai规则处理后,分数为 公开:0.971 私有:0.968)
```