该存储库微调最先进的PII检测系统的状态,并通过合成PII数据生成增强性能。
简介•突出显示•合成PII数据•PII实体检测系统•问题•
个人可识别信息(PII)是用于识别,定位或联系个人的敏感数据。 PII实体检测系统可以在非结构化文本中识别,分类和编辑敏感信息。改善PII检测系统有助于维持个人的隐私和安全性,符合法律和监管要求,并防止身份盗用,欺诈或其他类型的伤害。图1提供了使用内部,外部,启动(IOB)格式的示例PII实体。

图1:IOB格式的PII数据示例[源]。
该存储库中的工作是在Kaggle竞争期间得出的。学习机构实验室-PII数据检测。使用此存储库中的技术将在竞争中提供最高1%的解决方案。
PII PlaceHolders的最佳技术,而不是直接将PII数据放入提示中。class_weights参数以及焦点损失或跨熵损失来解决。IOB格式(通常也称为生物格式)是一种常见的标记格式,用于标记令牌中的标记任务,例如命名实体识别(NER)应用程序。创建标记的BIO数据集可能是针对特定域数据集的时间和劳动密集型。另一种方法是合成生成密切代表您真实应用程序的PII数据集。请参阅gen-data目录以创建特定域PII数据的代码。以下文件将被顺序执行,因为它们每个都代表合成PII数据创建中的另一个任务。
合成PII数据是使用Faker和自定义功能创建PII信息的。将这些数据放入下一步创建的LLM生成的非结构化文本中。
生成LLM(例如Llama3)用于生成类似于域特定文本的非结构化文本。在此存储库中,数据模仿了在线课程中学生的论文。请参阅各种提示,以提示此工作中使用的示例。
注意:在这项工作中学习的有用的见解是促使LLM为PII数据创建placeholders 。步骤1的数据将注入占位符。 PII占位符的方法提供了以下轶事优势:
给出了两个提示策略的示例,这些示例证明了直接使用PII提示(示例1)然后与占位符(示例2)之间的差异。
示例1:使用直接PII数据注入的LLM提示
Model Prompt:
Write an sentence introducing yourself and include only your personal information provided below:
- FULL_NAME: John Doe
- PHONE_NUM: 555-123-4567
Model Response:
My name is John Doe and you can reach me at 555-125-4567 or by email at [email protected].这种提示的技术通常从LLM中引入了一些错误,这些错误很难在编程上识别并导致PII以生物格式错误地标记。示例1要求该模型将PII数据直接插入文本中,并注意几个错误:
[email protected]电子邮件。示例2:LLM提示与PII占位符
Model Prompt:
Write an sentence introducing yourself and include only your personal information using the placeholders provided below:
- {FULL_NAME}: First and Last Name
- {PHONE_NUM}: Personal phone number
Model Response:
My name is {FULL_NAME} and you can reach me at {PHONE_NUM}.示例2 LLM没有机会在phone_num或full_name中转置任何错误。同样,LLM似乎不太频繁地纳入额外的PII实体。
以上两个步骤将PII数据和域特定文本生成解耦。在步骤#3中,步骤#1 PII数据插入步骤#2的LLM域特定生成的文本。这很有用,因为您可以轻松地使用PII数据和域特定文本生成数据的不同组合进行实验。
PII实体检测的最佳性能LLM模型是Microsoft的解码增强的BERT,并具有分离的注意V3模型。对于编码器模型任务,例如命名实体识别(NER),问答以及分类,该模型始终如一地表现良好。
训练Deberta-V3模型的一个好的起点是基线Deberta-V3微调模块。在此模块中,创建了一个定制的拥抱面部培训师,以训练焦点损失或CE损失,以解决阶级失衡。
class CustomTrainer ( Trainer ):
def __init__ (
self ,
focal_loss_info : SimpleNamespace ,
* args ,
class_weights = None ,
** kwargs ):
super (). __init__ ( * args , ** kwargs )
# Assuming class_weights is a Tensor of weights for each class
self . class_weights = class_weights
self . focal_loss_info = focal_loss_info
def compute_loss ( self , model , inputs , return_outputs = False ):
# Extract labels
labels = inputs . pop ( "labels" )
# Forward pass
outputs = model ( ** inputs )
logits = outputs . logits
# Loss calculation
if self . focal_loss_info . apply :
loss_fct = FocalLoss ( alpha = 5 , gamma = 2 , reduction = 'mean' )
loss = loss_fct ( logits . view ( - 1 , self . model . config . num_labels ),
labels . view ( - 1 ))
else :
loss_fct = CrossEntropyLoss ( weight = self . class_weights )
if self . label_smoother is not None and "labels" in inputs :
loss = self . label_smoother ( outputs , inputs )
else :
loss = loss_fct ( logits . view ( - 1 , self . model . config . num_labels ),
labels . view ( - 1 ))
return ( loss , outputs ) if return_outputs else loss培训目录中包含的微调PII检测系统的其他技巧和技巧是:
unlabeled datasets集将模型暴露于特定领域的语言模式和术语。微调一个模型,该模型从特定的任务或域进行了额外的预训练,从针对手头的任务和数据分配量身定制的初始检查点开始,通常与从通用初始检查点开始的微调模型相比,性能更高[源:1,2]。注意:此处介绍的此工作流程可以适用于许多拥抱的脸部深度学习应用程序,而不仅仅是LLM。
该存储库将竭尽所能维护。如果您面临任何问题或想进行改进,请提出问题或提交拉动请求。 ?