返回列表

6th place solution for The Learning Agency Lab - PII Data Detection

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

开始: 2024-01-17 结束: 2024-04-23 数据安全与隐私 数据算法赛
```html 第六名方案 - PII数据检测

第六名方案 - PII数据检测

作者:Yusuke Nakayama
比赛排名:第6名
发布时间:2024-04-27

感谢主办方组织这次比赛,也感谢所有参与者慷慨分享宝贵信息。能够获得个人金牌,我感到非常高兴!

背景

方案概述

  • 三个Deberta模型的加权平均
  • 将Deberta分词器的token映射到提交格式的Spacy分词器token
  • 使用Mistral-v02创建额外数据集,与公开共享数据集结合使用
  • 错误分析后的后处理

数据

结合比赛数据,创建并使用了以下两个数据集:

  • 公开共享数据集的组合(非常感谢创建数据集的各位!@mpware, @pjmathematician, @nbroad, @valentinwerner, @tonyarobertson)
  • 使用Mistral-7B-Instruct-v0.2生成的数据集(此方法灵感来自此方案
    • LLM微调:
      • 从比赛训练数据中提取设计思维工具名称,并将其作为该论文的代表工具。
      • 使用上述工具+论文中的PII+任务指令作为输入指令,将论文作为输出用于微调LLM。
    • 使用微调后的LLM生成数据集:
      • 从设计思维工具中随机选择多个(可视化、叙事思维导图、学习启动、头脑风暴、人物画像、价值链分析、旅程映射、民族志研究)
      • 使用Faker创建每个PII并随机选择多个。
      • 将随机选择的工具和PII+任务指令输入LLM以输出论文。
      • 尝试了多种提示词,共生成1722条数据。

交叉验证策略

  • 为论文是否包含每个标签的任何PII创建单热标签,并使用多分层K折。
  • 使用4折交叉验证进行评估。
  • CV和LB之间没有太多相关性...

模型

训练了Deberta-v3-large x2(模型1、模型2)和deberta-v3-base(模型3),每个模型都使用了以下自定义头,共12个模型进行加权平均。

自定义头

  • 由于Deberta分词器和Spacy分词器的token划分不同,需要将Deberta的输出进行映射。
  • 具体来说,将模型的输出token的预测概率通过偏移映射转换为每个字符的预测概率,再进一步转换为Spacy分词器每个token的预测概率。
  • 为在训练过程中实现上述处理,创建了如图所示的自定义头。
  • 从字符转换为Spacy token时,使用torch.Tensor.scatter_reduce_(reduce="mean")将属于一个Spacy token的字符的预测概率取平均值。(参考此方案

损失函数

  • 不使用每个标签的"B-"和"I-",而是将Deberta的输出分类为8个类别("O" + 每个PII类型)。
  • 使用Focal Loss作为损失函数。
  • "O"标签的权重设为0.1。
  • 使用Deberta输出token计算损失(deberta token loss),并将上述自定义头的字符概率和Spacy token概率计算出的损失作为辅助损失添加(char loss, spacy token loss)。
  • 对于Deberta token概率、字符概率和Spacy token概率,同时输出每个标签的首尾位置,计算BCE损失并添加到上述Focal Loss中。(deberta token sp_ep loss, char sp_ep loss, spacy token sp_ep loss)

训练参数

模型1

  • 骨干网络:Deberta-v3-large
  • 数据集:使用比赛数据 + mpware数据集训练
  • 损失函数:
    • 此模型不使用自定义头。
    • Deberta token loss + deberta token sp_ep loss
  • 冻结层数:5层
  • 批次大小:1

模型2

  • 骨干网络:Deberta-v3-large
  • 数据集:
    • 仅使用共享数据集训练1个epoch(预训练1)
    • 使用预训练1作为初始权重,用生成的数据集训练1个epoch(预训练2)
    • 使用预训练2作为初始权重,仅用比赛数据训练
  • 损失函数:
    • Deberta token loss + char loss + spacy token loss + deberta token sp_ep loss + char sp_ep loss + spacy token sp_ep loss
  • 冻结层数:5层
  • 批次大小:1

模型3

  • 骨干网络:Deberta-v3-base
  • 数据集:仅使用比赛数据训练
  • 损失函数:
    • Deberta token loss + char loss + spacy token loss
  • 冻结层数:无
  • 批次大小:2

模型1~3的通用设置

  • Epoch:3
  • Token最大长度:
    • 训练:4600
    • 推理:6300
  • 学习率:
    • Deberta层:2e-5
    • 自定义头:1e-4

后处理

当我参加之前的NER比赛时,惊讶地发现大多数金牌方案都是通过后处理模型输出来提高准确率。因此,这次我仔细查看了模型输出,并通过后处理处理了推理不好的部分。

  • 将Deberta分词器无法识别但出现在Spacy token中的空白字符的标签设为"O"。
  • 将STREET_ADDRESS token之间的"\n"转换为I-STREET_ADDRESS(因为Deberta分词器会删除"\n",需要在后处理中恢复)
  • 在同一论文中,如果一个token被检测为NAME_STUDENT,也将所有其他具有相同字符串的token设置为NAME_STUDENT。

模型集成

模型 CV 私有LB 公开LB
模型1 0.9702 0.9625 0.9757
模型2 0.9706 0.9675 0.9694
模型3 0.9533 0.9517 0.9416
模型1-3加权平均 0.9765 0.9681 0.9770

参考来源

```
同比赛其他方案