返回列表

5th place solution

604. The Learning Agency Lab - PII Data Detection | pii-detection-removal-from-educational-data

开始: 2024-01-17 结束: 2024-04-23 数据安全与隐私 数据算法赛
```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部分】

  • 我为最终集成总共创建了6个模型。

所有模型的共同点

  • 骨干模型:deberta-v3-large
  • 任务:Token分类
  • 全数据训练
  • 外部数据集:
  • max_length:128
    • train_overlap=96, eval_overlap=64
  • 位置特征:
    • 包含两种位置信息:绝对位置和相对位置。
  • EMA
  • 层冻结:
    • 在第一个epoch冻结骨干模型可以加快收敛。
    • 从第二个epoch开始,不冻结任何层。
  • 损失权重:
    • "O":1,其他:10
  • 优化器: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)

模型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

外部数据(感谢所有外部数据作者)

  • 我使用各种数据集来生成多样性:

规则处理

推理

集成

  • 集成(使用上述模型:模型1、模型2和模型3。)
    • ensemble_pred = (Model1 + Model2 + Model3) / 3 ← softmax之前
    • 上述推理分数为 公开:0.972 私有:0.967
    • (添加takai规则处理后,分数为 公开:0.971 私有:0.968)

比赛排名:第5名

作者:Ryota, takai380, min fuka

发布日期:2024-04-24

```
同比赛其他方案