返回列表

4th place solution - Llama3 🦙 70B is all you need

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

开始: 2024-01-17 结束: 2024-04-23 数据安全与隐私 数据算法赛
第四名解决方案 - Llama3 70B 所需的一切

第四名解决方案 - Llama3 🦙 70B 是所需的一切

第4名 作者:RB · 发布时间:2024-04-24 · 比赛:PII检测与移除

感谢 Learning Agency Lab 和 Kaggle 举办本次竞赛。

恭喜我的队友 @kpriyanshu256 成为 Kaggle 竞赛大师,以及 @lucamassaron 获得 Kaggle 竞赛特级大师头衔。🎊🎊🎊

比赛背景: https://www.kaggle.com/competitions/pii-detection-removal-from-educational-data/overview

数据: https://www.kaggle.com/competitions/pii-detection-removal-from-educational-data/data

方法概述

模型

Deberta V3 Large - 2倍 × 5折 = 共10个 Deberta V3 Large 模型 - 推理时间少于7小时。(最大长度 = 4000,步长 = 1024)

训练数据集 - meta-llama/Meta-Llama-3-70B-Instruct,感谢 @nbroad 提供的数据集

所有模型均使用 Focal Loss 和 BiLSTM + GRU 头部进行训练。

  • 训练轮数 = 3
  • 批大小 = 1 或 2
  • 学习率 = 1e-5 或 2e-5
  • 最大长度 = 1280
  • AdamW / 带预热余弦调度器

其他尝试:

  • Deberta Small、Deberta V3 Base - 效果良好,作为其他两个选定的集成方案的一部分。
  • Longformer Base、Gemma 2b - 表现不佳,因此未成为集成方案/选定提交的一部分。
  • 2% 到 5% 的 masking 数据增强,但这不是集成方案/选定提交的一部分。
  • 使用此模型进行预训练,但对我们没有效果。
  • 我们所有的代码都是纯 PyTorch - 没有使用 HF Trainer 或其他库。

交叉验证

  • 分层5折 - 基于PII是/否进行分层。我们还仅在比赛数据集上计算了OOF分数。

其他尝试:

  • 我们还尝试了更精细的多标签分层kfold,但这没有效果。
  • 文档%4(如论坛所述)在折数间有较大方差。
  • 此外,尝试更多折数导致了轻微的性能提升,但代价是训练时间更长,且后续集成可能性降低。

我们选择基于文档中是否存在PII进行5折分层交叉验证,这帮助我们在基于折数训练时避免过度拟合,并在选择最具表现力和可推广性的最终提交时提供了可靠的衡量标准,而不是仅仅依赖公开排行榜。

步长和推理最大长度

在1280序列长度上训练的模型在以最大长度4000进行推理时表现良好。使用步长训练的模型在公开排行榜上被限制在0.967。我们发现最佳设置是使用最大长度4000和步长1024。训练最大长度大于1280也没有效果。

文本预处理

  • 对训练数据集进行轻微清理,有一些非常混乱的文本[文档21657],重新标记了此处指出的不正确标签。
  • 高影响预处理 - 数据集中有多种返回True for .isspace()的字符串。因此,我们将所有此类字符串替换为[SPACE]令牌,我们将其添加到模型的tokenizer中。此外,我们观察到许多字符串包含Unicode字符,这导致了推理结果的不匹配(如果我们将预测从Deberta令牌映射到Spacy令牌,或者从Deberta令牌获取Spacy令牌的预测,结果应该相同)。因此,我们使用unidecode库将所有此类字符转换为规范化字符。
def replace_space(lst):
    return ["[SPACE]" if x.isspace() else x for x in lst]

train_df["tokens"] = train_df["tokens"].apply(replace_space)

数据生成

我们主要遵循此处描述的策略来生成更多数据。

  • 首先使用LLM创建人物角色 - mistralai/Mistral-7B-Instruct-v0.2 或 Gemini Pro 1.0 API 或 GPT3.5 turbo。
  • 我们为每种工具类型添加了一个样本,即学习启动工具或可视化工具或思维导图工具或故事讲述工具到提示中。
  • 对于实际的PII标记,我们使用了faker库。
  • 我们从 meta-llama/Meta-Llama-3-70B-Instruct、mistralai/Mixtral-8x7B-Instruct-v0.1 生成了约4600个样本。
  • meta-llama/Meta-Llama-3-70B-Instruct 取得了最佳效果 - 使用LLama3 70B Instruct模型生成的数据集训练的单模型比我们的最佳集成更好。
  • 对于模型推理,我们使用了vLLM

一些非PII样本中存在教师/讲师的名字,模型将其识别为PII - 因此我们对这些假阳性样本进行了释义并将其添加到训练数据集中。我们使用https://huggingface.co/kalpeshk2011/dipper-paraphraser-xxl模型进行释义。

这个是唯一对我们有效的数据集,我们尝试了论坛上分享的许多其他数据集。

后处理

  • BERT分类器 -

    对于STUDENT_NAME标签,我们观察到模型生成的许多假阳性与教师名字和为解释故事讲述而引入的虚构角色有关。

    我们从训练数据中提取了FICTIONAL_CHARACTER、TEACHER_NAME和OTHER类的句子,并使用它们构建了一个BERT分类器。

    我们尝试使用此分类器过滤主模型预测的STUDENT_NAME令牌。不幸的是,由于数据集的显著噪声和指标对假阴性的严重惩罚,这种方法表现不佳。

  • 我们还进行了其他后处理尝试以减少假阳性,例如使用正则表达式过滤姓名和ID(例如,移除包含未混淆讲师名字的令牌:"Angela Meyer"、"Jeanne Liedtka"、"Ed Hess"、"Tim Olgivie"),或者使用XGBoost模型作为最终验证器,使用与输出logits和阳性令牌特征以及邻近前一个和后一个令牌的特征或整个文档中检测到的令牌的统计数据相关的特征。由于这些方法在OOF或公开排行榜上没有带来任何结果,大多数方法最终被搁置。

  • 我们观察到以下规则在公开排行榜上有轻微提升,这是我们最佳提交的一部分

    • 如果令牌字符串包含数字,则移除STUDENT_NAME标签
    • 移除讲师名字

其他

使用Spacy可视化工具进行错误分析、Neptune.ai用于日志记录(使用Neptune.ai进行日志记录帮助我们查看各个PII类型)、Optuna用于获取不同模型的权重和阈值。

推理代码/模型/数据集:

感谢 @aman1391@kpriyanshu256@lucamassaron@steubk 的合作,与你们合作非常愉快 🙏