Text Attack フレームワークの探索: コンポーネント、機能、および実際のアプリケーション
導入
ここ数年、自然言語処理 (NLP) モデルの敵対的堅牢性をテストすることへの関心が高まっています。この分野の研究では、敵対的な例を生成し、それらから防御するための新しい技術を取り上げています。これらの攻撃は異なるデータと被害者モデルに基づいて評価されるため、直接比較することは困難です。
以前の作業をベースラインとして複製するには時間がかかり、ソース コードの欠落によるエラーのリスクが高まります。出版物には細部が省略されているため、結果を完全に再現することも困難です。これらの問題により、この分野でのベンチマーク比較に課題が生じます。
Text Attack のようなフレームワークは、これらの課題に対処するために開発されました。これは、敵対的攻撃、データ拡張、敵対的トレーニングのための NLP Python フレームワークです。このフレームワークは現在の課題に対処し、敵対的な堅牢性の進歩を促します。この投稿では Text Attack について詳しく説明し、そのコンポーネントの詳細を説明します。さらに、詳細なコード例を通じて実際の実装を検討します。
前提条件
- NLP の基本的な理解: トークン化、埋め込み、シーケンス モデル (トランスフォーマーなど) などの自然言語処理 (NLP) の概念に精通していること。
- Python プログラミング スキル: ライブラリのインストール、スクリプトの作成、データの処理など、Python の経験。
- PyTorch の知識: Text Attack は PyTorch ベースのモデルと統合されることが多いため、PyTorch の基礎的な理解。
- Text Attack のインストール:
pip install text Attack
を使用して、Text Attack フレームワークを環境にインストールします。 NumPy、pandas、PyTorch などの依存関係がインストールされていることを確認します。 - データセットの知識: ハグ顔データセット ライブラリで利用可能なデータセットなどのデータセットの処理方法を理解します。
Text Attack の主要コンポーネント
Text Attack は、NLP 攻撃を次の 4 つのコンポーネントに分解することにより、敵対的攻撃手法を統合します。
- 目標関数: 攻撃の目的は目標関数によって定義されます。目標関数には、モデルの予測を変更したり、モデルを騙して特定のエラーを発生させたりすることが含まれます。
- 一連の制約: 単語数を制限したり、行われたすべての変更が文法的に正確であることを保証したりするなど、攻撃が遵守しなければならないルールです。
- 変換: 変換は、敵対的な例を生成するために入力テキストがどのように変更されるかを決定します。たとえば、単語をその同義語で置換したり、単語を挿入/削除したりします。
- 検索方法: このコンポーネントは、勾配ベースの方法やランダム検索アルゴリズムの使用など、最も効果的な敵対的な例を見つけるために、攻撃が変更の可能性のある空間を探索する方法を決定します。
Textアタックの主な特徴
Text Attack のモジュラー設計の中心となるのは、上で述べたように 4 つの主要コンポーネントです。
画像ソース
この図の「攻撃モジュール」セクションは、文献に記載されている攻撃を再実装する Text Attack の機能を示しています。このセクションでは、使用できる 16 の論文と事前に構築された攻撃レシピがあることについて説明します。
この図は、Text Attack を使用して、新しい攻撃の作成と既存の攻撃のベンチマークという 2 つの方法で攻撃を構築する方法を示しています。ユーザーは、新規コンポーネントと既存コンポーネントを組み合わせて、新しい敵対的戦略を作成できます。
Text Attack には 82 を超える事前トレーニング済みモデルがあるため、研究者は標準モデルに対して新しい攻撃をテストできます。これにより、結果を以前の作業と比較できるようになります。
この図は、データ拡張と敵対的トレーニングという 2 つの攻撃方法を示しています。 Augmenter モジュールを使用すると、新しいサンプルを生成して既存のトレーニング データセットを拡張し、ユーザー モデルを改善できます。 Text Attack のトレーニング パイプラインを使用すると、敵対的なサンプルを作成し、それをトレーニング プロセスにフィードしてモデルを改善できます。
Text Attack の事前トレーニング済みモデルとデータセット
Text Attack の事前トレーニング済みモデルには、トランスフォーマーベースの BERT バリアントとともに、ワードレベルの LSTM および CNN モジュールが含まれています。これらのモデルは、HuggingFace が提供するさまざまなデータセットで事前トレーニングを受けています。
Text Attack と NLP ライブラリの統合により、テストおよび検証データセットに対応する事前トレーニング済みモデルの自動読み込みが可能になります。これまでの文献の多くは分類と含意に焦点を当てていましたが、Text Attack の一連の事前トレーニング済みモデルは、研究に新たな道を提供します。これにより、研究者はすべての GLUE タスクにわたるモデルの堅牢性に関する研究を掘り下げることができます。
敵対的トレーニング
Text Attack を使用すると、敵対的な例の新しいトレーニング セットを作成できます。このプロセスにはいくつかの手順が含まれます。
- 初期トレーニング: モデルは、クリーンなトレーニング セット上で多数のエポックにわたってトレーニングされます。
- 敵対的な例の生成: 攻撃により、各入力の敵対的なバージョンが作成されます。
- データセットの置換: このプロセスには、元のデータセットを摂動されたバリアントで置換することが含まれます。
- 定期的な再生成: 敵対的データセットは、モデルの現在の弱点に従って定期的に再生成されます。
以下の表は、_TextAtt_ack で使用されるさまざまな攻撃レシピに対する敵対的トレーニングを行った場合と行わない場合の標準 LSTM 分類子の精度を示しています。
画像ソース
これは、ベースラインの Carlini と比較した、deepwordbug、textfooler、pruthi、hotflip、およびbae 攻撃に対する LSTM モデルのパフォーマンスを示しています。 > クリーンなトレーニングセットでスコアを獲得します。この表では、攻撃ありと攻撃なしの精度を比較し、それぞれ 20 エポックと 75 エポックでのディープワードバグに対するモデルの堅牢性を評価しています。また、20 エポックでのテキストフーラーに対するモデルの脆弱性も評価します。
攻撃レシピを使用した既存の攻撃のベンチマーク
Text Attack では、複数の過去の研究攻撃を 1 つのフレームワークに結合するモジュール構造が可能です。これは 1 つまたは 2 つの新しいコンポーネントを追加することで実現され、新しい攻撃計画を作成する際の柔軟性と生産性が向上します。
攻撃レシピは、NLP モデルの敵対的な例を生成するために使用される、事前に定義された一連のステップと構成です。各攻撃レシピには 4 つの主要コンポーネント (目標機能、制約、変換、検索方法) があります。
攻撃レシピは、最新の研究から抽出されたベスト プラクティスとテクニックです。これらは、敵対的な例の作成をスピードアップします。研究者と実務家の両方の作業を支援することで、基礎となる詳細をすべて知らなくても複雑な攻撃戦略を実装できるようになります。以下の図では、いくつかの一般的なタイプの攻撃を示しています。
敵対的攻撃の概要
実用的な使用例: 感情分析
映画のレビューを肯定的なカテゴリーと否定的なカテゴリーに分類する感情分析モデルがあると考えてみましょう。私たちはテキストフーラー攻撃レシピを使用して、このモデルの強度と堅牢性をテストしたいと考えています。与えられた入力は「映画は素晴らしかった」であり、モデルは肯定的な感情を予測しました。以下の図でプロセスを見てみましょう。
感情分析モデルの敵対的攻撃プロセス
攻撃プロセスを開始するには、ステートメントの中でポジティブな感情に関連する重要な単語を見つける必要があります。たとえば、「素晴らしい 」は、WordNet データベースを使用して同義語に置き換えることができます。
私たちは文法の正確さと元の意味を可能な限り維持したいと考えています。貪欲アルゴリズムでは反復アプローチを使用し、置換のたびにモデルの予測がチェックされます。 このプロセスは、望ましい結果を達成する置換ができなくなるか、予測に変化が生じるまで続行されます。モデルに対する攻撃は、「素晴らしい」という単語を「素晴らしい」などの同等の言葉に置き換えることで成功する可能性があり、感情をポジティブからネガティブに反転させます。 この場合、最初のステートメント「映画は素晴らしかった 」は「映画は素晴らしかった 」に変更されています。モデルの予測が肯定的なものから肯定的なものに変化したことがわかります。ネガティブ。これはモデルに脆弱性があることの証拠です。
_textfooler は、感情分析モデルの欠陥を明らかにするために設計された巧妙なスキームです。この手法は、文脈上の一貫性を維持しながらキーワードをその同義語に置き換えることにより、モデルの予測に大きな影響を与えることができます。このため、このような敵対的攻撃に対する脆弱性を最小限に抑えるトレーニングと評価のフレームワークを優先する必要があります。
Text Attack の AttackedText オブジェクトによる敵対的 NLP 攻撃の強化
従来の NLP 攻撃実装を使用する場合、トークン化されたテキストに変更を加えると、大文字化や単語の分割に関する問題が発生することがよくあります。トークン化では、テキストを個別の単語またはトークンに分割する必要があるため、最初の大文字や単語間の境界が崩れる可能性があります。
トークン化「映画は素晴らしかったです!」 」は「その 」、「映画 」、「だった 」、または「素晴らしい!」 につながる可能性があります。 」というように、先頭の大文字が省略されています。これにより、変換がより困難になります。このような懸念により、敵対的な例の一貫性と妥当性が弱まり、NLP モデルの復元力の正確な評価が妨げられる可能性があります。
Text Attack の AttackedText オブジェクトは、トークン化されたバージョンではなく、元のテキストに対して直接変換を実行できるようにすることで、これらの問題に取り組みます。オブジェクトは初期入力を保持し、大文字や単語の境界などのすべての属性を保持します。
このオブジェクトに含まれるヘルパー メソッドにより、制御された変更が容易になります。大文字の変換や特定の単語の境界の調整などの課題を管理できます。例として、「Hello 」を「Hi 」に置き換える変換を考えてみましょう。 「hi World!」のような誤った出力は生成されません。 」ではなく、「Hello World!」を正しく変換します。 ”を「“Hi World!”」に。
AttackedText オブジェクトを使用すると、さまざまな利点が得られます。変換中に元のテキスト構造と大文字の使用の信頼性を維持することで、敵対的な例を生成します。単語の分割と大文字化の精度により、モデルに対する攻撃の信頼性が高まります。これにより、モデルの堅牢性の信頼できる評価プロセスが実現します。
さらに、開発者は、新しい攻撃の導入を妨げるトークン化の障害がなく、効率的な変更を生み出すことに集中できます。本質的に、 AttackedText コンポーネントは Text Attack の敵対的変換能力を大幅に増幅および強化します。
Text Attack の検索メソッドを使用した攻撃中に、同じ入力が複数回発生するのが一般的です。このような場合、以前に計算した結果を保存 (またはキャッシュ) すると、効率が大幅に向上します。
キャッシュによる Text Attack の効率の向上
Text Attack の検索メソッドを使用した攻撃中、同じ入力が複数回発生するのが一般的です。以前に計算した結果を保存 (またはキャッシュ) すると、このような場合の効率を向上させることができます。
Text Attack は、タスクを繰り返すことなく、事前計算されたモデル出力の取得を迅速化し、すべての制約が満たされているかどうかを検証できます。このプロセスはメモ化として知られています。この最適化手法により、検索メソッドの実行が高速化され、攻撃中の全体的な効率が向上します。
敵対的な例でテストすることで感情分析モデルの堅牢性を評価するText Attack のアプリケーションを考えてみましょう。以下の図でプロセスを視覚化して説明しましょう。
Adversarial example generation with caching
- 最初の入力: 冒頭の声明には次のように書かれています。センチメント アナライザーは、ポジティブなセンチメントとして特徴づけられる感情の調子を正確に認識します。
- 敵対的攻撃: Text Attack は、元の文に狡猾な変更を適用してモデルの予測を操作する敵対的攻撃手法を使用します。表現が変更された例 - たとえば、「映画は素晴らしかったです!」 「その映画は素晴らしかった」または「その映画は素晴らしかった」は、このプロセスの一部である可能性があります。
- キャッシュ: キャッシュの力を利用して、重複を装ったバリエーションがリアルタイムで識別および分類され、効率が最適化され、不必要な再処理が防止されます。たとえば、「映画は素晴らしかったです。」 」は、そのまままたはわずかな変更を加えて繰り返し生成され、システムは最初の検出時に以前に計算されたキャッシュされた応答を使用します。特定の言語に対してさらなるアクションが実行される前に、Text Attack の洗練されたアルゴリズム モデルによる精査の下で、制約の一貫性が常にクロスチェックされます。
- 効率の向上: Text Attack の効率の向上は目覚ましいものです。探索の旅を続けているときに、同じように「映画は素晴らしかった」という楽しい言葉に出会ったと想像してみてください。このツールはキャッシュされた結果を取得するため、出力を計算したり制約を監視したりする必要がなくなりました。これにより、貴重な時間を節約し、コンピューティング能力を節約し、成功へのスムーズな移行につながります。
カスタム変換
Text Attack での変換の作成を開始するために、単純な変換が試行されます。つまり、任意の単語を「バナナ」という単語に変更します。 Text Attack 内では、WordSwap と呼ばれる抽象クラスが、ストップワードの交換を回避しながら、文を単語に分解します。 WordSwap を拡張し、1 つの関数 - _get_replacement_words だけを実行することで、すべての用語を「banana 」に置き換えることができます。
後続のコードを実行する前に、お使いの環境で次のコマンドを実行してください。
pip3 install textattack[tensorflow]
次のコードは、WordSwap を継承するカスタム変換クラス BananaWordSwap を定義します。入力内の任意の単語を「banana」という単語に置き換えます。
from textattack.transformations import WordSwap
class BananaWordSwap(WordSwap):
"""Transforms an input by replacing any word with 'banana'."""
# We don't need a constructor, since our class doesn't require any parameters.
def _get_replacement_words(self, word):
"""Returns 'banana', no matter what 'word' was originally.
Returns a list with one item, since `_get_replacement_words` is intended to
return a list of candidate replacement words.
"""
return ["banana"]
変換の使用
変換が選択されました。ただし、攻撃を完了するにはまだいくつかのアイテムが不足しています。攻撃を実行するには、検索方法と制約も選択する必要があります。さらに、この戦略を使用する前に、目標関数、モデル、およびデータセットが必要です。 (目標関数は、モデルが実行するタスク (この場合は分類) と攻撃の種類 (この場合は対象外の攻撃を実行します) を示します。)
目標関数、モデル、データセットの作成
私たちの使命は、分類モデルに対して攻撃を開始することです。したがって、UntargetedClassification クラスを使用します。私たちのタスクでは、AG News データセットを使用してニュースの分類用に特別に改良された BERT を見てみましょう。多くのモデルが用意されており、HuggingFace のモデル ハブに簡単に保存されているため、心配する必要はありません。 Text Attack は、これらの高品質モデルおよびそのデータセットのいずれかと相乗的に結合します。
# Import the model
import transformers
from textattack.models.wrappers import HuggingFaceModelWrapper
model = transformers.AutoModelForSequenceClassification.from_pretrained(
"textattack/bert-base-uncased-ag-news"
)
tokenizer = transformers.AutoTokenizer.from_pretrained(
"textattack/bert-base-uncased-ag-news"
)
model_wrapper = HuggingFaceModelWrapper(model, tokenizer)
Create the goal function using the model
from textattack.goal_functions import UntargetedClassification
goal_function = UntargetedClassification(model_wrapper)
Import the dataset
from textattack.datasets import HuggingFaceDataset
dataset = HuggingFaceDataset("ag_news", None, "test")
攻撃を作成する
貪欲な検索方法を使用してみましょう。今のところ制約は使用しません。
from textattack.search_methods import GreedySearch
from textattack.constraints.pre_transformation import (
RepeatModification,
StopwordModification,
)
from textattack import Attack
We're going to use our Banana word swap class as the attack transformation.
transformation = BananaWordSwap()We'll constrain modification of already modified indices and stopwords
constraints = [RepeatModification(), StopwordModification()]We'll use the Greedy search method
search_method = GreedySearch()Now, let's make the attack from the 4 components:
attack = Attack(goal_function, constraints, transformation, search_method)
攻撃を出力してすべてのパラメータを確認できます。
print(attack)
出力:
Attack(
(search_method): GreedySearch
(goal_function): UntargetedClassification
(transformation): BananaWordSwap
(constraints):
(0): RepeatModification
(1): StopwordModification
(is_black_box): True
)
攻撃を利用する
攻撃を使って 10 個のサンプルを攻撃してみましょう。
from tqdm import tqdm # tqdm provides us a nice progress bar.
from textattack.loggers import CSVLogger # tracks a dataframe for us.
from textattack.attack_results import SuccessfulAttackResult
from textattack import Attacker
from textattack import AttackArgs
from textattack.datasets import Dataset
attack_args = AttackArgs(num_examples=10)
attacker = Attacker(attack, dataset, attack_args)
attack_results = attacker.attack_dataset()
The following legacy tutorial code shows how the Attack API works in detail.
logger = CSVLogger(color_method='html')
num_successes = 0i = 0while num_successes < 10:result = next(results_iterable) example, ground_truth_output = dataset[i] i += 1 result = attack.attack(example, ground_truth_output) if isinstance(result, SuccessfulAttackResult): logger.log_attack_result(result) num_successes += 1 print(f'{num_successes} of 10 successes complete.')
出力:
+-------------------------------+--------+
| Attack Results | |
+-------------------------------+--------+
| Number of successful attacks: | 8 |
| Number of failed attacks: | 2 |
| Number of skipped attacks: | 0 |
| Original accuracy: | 100.0% |
| Accuracy under attack: | 20.0% |
| Attack success rate: | 80.0% |
| Average perturbed word %: | 18.71% |
| Average num. words per input: | 63.0 |
| Avg num queries: | 934.0 |
+-------------------------------+--------+
上記のコードでは、Text Attack ライブラリを利用して、データセットに対して敵対的攻撃を実行します。進行状況バー用のtqdmや攻撃結果を記録するためのCSVLoggerなどの重要なモジュールがインポートされます。 10 個の例に対して攻撃を実行するために、 AttackArgs クラスを使用しました。
指定された攻撃タイプ、対応するデータセット、および必要な引数を使用して攻撃者 オブジェクトを作成しました。次に、 Attack_dataset メソッドを実行して攻撃を実行し、結果を取得しました。あるいは、データセット内の各要素を調べて攻撃を実行し、攻撃が成功した場合は結果をログに記録することで、成功した攻撃を手動でログに記録することもできます。 – このスクリプト スニペットのコメントアウトされたセクションに含まれるコードによって証明されています。
テキスト分類モデルに対する敵対的攻撃では、80% の成功率が達成されました。 10 回の試行のうち、8 回で入力の誤分類が発生し、精度が以前の完璧なスコアからわずか 20% に低下しました。
スキップされた攻撃は記録されなかったため、攻撃戦略の堅牢性と有効性が証明されました。平均すると、各クエリでは、約 63 単語を含む入力内の単語の 18.71% が変更されました。さらに、攻撃プロセス中にモデルは入力ごとに約 934 回クエリされました。
攻撃結果の可視化
以下のコードでは、CSVLogger メソッドを使用して AttackResult オブジェクトをログに記録しています。このロガーは、結果として生じるすべての攻撃をデータ フレームに効果的に保存します。情報へのアクセスと表示が容易になります。 color_method を「html」に設定すると、攻撃結果の差異が HTML の色付けで表現され、視覚的にわかりやすくなります。このプロセスではIPython ユーティリティとパンダを使用しました。
import pandas as pd
pd.options.display.max_colwidth = (
480 # increase colum width so we can actually read the examples
)
logger = CSVLogger(color_method="html")
for result in attack_results:
if isinstance(result, SuccessfulAttackResult):
logger.log_attack_result(result)
from IPython.core.display import display, HTML
results = pd.DataFrame.from_records(logger.row_list)
display(HTML(results[["original_text", "perturbed_text"]].to_html(escape=False)))
注: 読者はコードを起動して結果を視覚化できます。
結論
この記事では、NLP モデル内の敵対的な堅牢性について広範な分析を提供し、特に Text Attack Python フレームワークに重点を置いています。これは、生成プロセスと有害な攻撃に対する防御メカニズムを合理化し、強化することを目的とした Python ベースのフレームワークです。
このフレームワークは、目標関数、制約、変換、検索方法などの基本コンポーネントを組み込んだモジュール式アーキテクチャを提供します。この構造により、ユーザーはカスタマイズされた攻撃を効率的に作成できるようになります。また、ベンチマークによる容易な適応と標準化されたパフォーマンス評価も容易になります。
このフレームワークは、データ拡張技術を使用した敵対的トレーニング実践へのサポートを拡張します。これにより、現実世界のアプリケーション シナリオにおけるモデルの堅牢性が強化されます。このフレームワークの効率性は、経験的な例証によって実証されています。これらは、さまざまな領域にわたる実用性を強調しています。
参考文献
テキスト攻撃紙
Text Attack ドキュメント
コードリファレンス