```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的通用设置
后处理
当我参加之前的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 |
参考来源
```