このリポジトリは、最先端のPII検出システムを微調整し、合成PIIデータ生成によるパフォーマンスを向上させます。
はじめに•ハイライト•合成PIIデータ•PIIエンティティ検出システム•問題•
個人識別可能な情報(PII)は、個人を識別、特定、または連絡するために使用される機密データです。 PIIエンティティ検出システムは、非構造化されたテキストで機密情報を識別、分類、および編集できます。 PII検出システムの改善は、個人のプライバシーとセキュリティを維持し、法的および規制当局の要件を遵守し、個人情報の盗難、詐欺、またはその他の種類の害を防ぐのに役立ちます。図1に、内部、外側、開始(IOB)形式を使用したPIIエンティティの例を示します。

図1:IOB形式のPIIデータの例[ソース]。
このリポジトリの作業は、KaggleコンペティションThe Learning Agency Lab -PIIデータ検出中に導き出されました。このリポジトリの手法を使用すると、競争の上位1%のソリューションが提供されます。
PII PlaceHoldersの使用から最良のテクニックを促します。class_weightsパラメーターを調整し、焦点損失またはクロスエントロピー損失のいずれかで対処します。一般的にバイオ形式とも呼ばれるIOB形式は、名前付きエンティティ認識(NER)アプリケーションなどのチャンキングタスクでトークンをタグ付けするための一般的なタグ付け形式です。ラベル付きのバイオデータセットの作成は、ドメイン固有のデータセットの時間と労働集約的です。別のアプローチは、実際のアプリケーションを密接に表すPIIデータセットを合成することです。コードのgen-dataディレクトリを参照して、ドメイン固有のPIIデータを作成します。以下のファイルは、それぞれが合成PIIデータ作成の異なるタスクを表しているため、順番に実行されます。
合成PIIデータは、Fakerおよびカスタム関数を使用してPII情報を作成しました。このデータは、次のステップで作成されたLLM生成非構造化テキストに配置されました。
生成LLM(例、LLAMA3)を使用して、ドメイン固有のテキストに似た非構造化テキストを生成しました。このリポジトリでは、データはオンラインコースで学生のエッセイを模倣します。この作業で使用されている例を促すためのさまざまなプロンプトを参照してください。
通知:この作業中に学んだ有用な洞察は、LLMにPIIデータのplaceholdersを作成するよう促すことでした。ステップ#1のデータは、プレースホルダーに注入されます。 PIIプレースホルダーアプローチは、次の逸話的な利点を提供しました。
PII(例1)とプレースホルダー(例2)でのプロンプトとの違いを示す、プロンプト戦略の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].このプロンプトの手法は、LLMSからプログラム的に認識し、バイオ形式でのPIIの誤解を招くことが困難だったいくつかのミスを日常的に導入しました。例1モデルに、PIIデータをテキストに直接挿入し、いくつかのエラーに気付くように依頼します。
[email protected]電子メールなど、要求されない追加のPIIを注入します。例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には、電話またはfull_nameでエラーを転置する機会がありませんでした。また、LLMが追加のPIIエンティティをより頻繁に組み込む頻度ではないようでした。
上記の2つのステップでは、PIIデータとドメイン固有のテキスト生成が分離されました。ステップ#3では、ステップ#1 PIIデータがステップ#2のLLMドメイン固有の生成テキストに挿入されます。これは、PIIデータとドメイン固有のテキスト生成データのさまざまな組み合わせを簡単に実験できるため有用です。
PIIエンティティ検出に最適なLLMモデルは、Microsoftのデコード強化BERTを使用したDisEntangled Attention 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だけでなく、多くの抱きしめる顔の深い学習アプリケーションに適合させることができます。
このリポジトリは、維持するために最善を尽くします。問題に直面している場合、または改善を行いたい場合は、問題を提起するか、プルリクエストを送信してください。 ?