TextAttack：NLPにおける敵対的攻撃に関するPythonフレームワーク

#はじめに
　本記事は日鉄ソリューションズ(NSSOL)様のインターンシップの一環として執筆したものです．

　自然言語処理の敵対的攻撃に関する論文 [TextAttack: A Framework for Adversarial Attacks, Data Augmentation, and Adversarial Training in NLP](https://arxiv.org/abs/2005.05909) で提案されたPythonフレームワーク([GitHub](https://github.com/QData/TextAttack)，[公式ドキュメント](https://textattack.readthedocs.io/en/latest/index.html))の使用方法の解説，データ拡張とともに，実際に利用してみて得られた知見をまとめました．

#忙しい方へ

* 敵対的攻撃という攻撃によって機械学習モデルの精度が大きく影響を受ける場合があります．
* 本記事ではそれに関連したTextAttackと呼ばれるフレームワークの使い方を解説します．
* 攻撃を応用したデータ拡張を用いて精度評価もしていきます．
* 攻撃に対するロバスト性と精度にはトレードオフに近い関係がありそうかも・・・

#概要
　TextAttackはコマンドライン上またはPython APIとして利用できるPythonフレームワークであり，以下の3つの機能を有しています．

* __敵対的攻撃__
    * ユーザが攻撃を新規に生成できる
    * 既存の16手法のレシピ(実装済みコード)を利用できる
* __データ拡張__
    * 攻撃と同様の操作によって学習前にデータ拡張が可能
* __モデルの学習__
    * (様式に則った)任意のNLPモデルを学習・評価できる
    * 82以上のFine Tuning済みの既存モデルを提供している
    * 敵対的攻撃・データ拡張を適用した学習が可能

次図は以上のことをまとめたフローチャートで，[原著論文](https://arxiv.org/abs/2005.05909)からの引用になります．

![スクリーンショット 2021-01-18 17.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/0fe5f28c-9e18-bb3e-e563-6f2803360476.png)

それぞれについての詳細は後述しますが，TextAttackを利用することの利点としては

* NLPにおける敵対的攻撃を最小限の労力で実装できる
* 利用可能な実装済みレシピが多数存在
* 学習済みモデルも豊富で，学習や評価まで簡単
* 自作モデルへの導入も容易

などが挙げられると思います．

　また，[Huggingface](https://github.com/huggingface)の拡張機能を利用しており，NLPで良く用いられるデータセットや，BERTをはじめとした事前学習済モデルをGithubリポジトリから勝手に引っ張ってきてくれるので，ローカルに何も用意せずとも利用できるのも魅力的です．

　英語ではありますが[公式のドキュメント](https://textattack.readthedocs.io/en/latest/index.html)も丁寧に書かれていてわかりやすかったので，より詳細に知りたい方はそちらも参考にしてみてください．

#敵対的攻撃とは
　2013年，コンピュータビジョンの分野において，ニューラルネットワークには特定の入力に対して脆弱性が存在することが[報告](https://arxiv.org/abs/1312.6199)されました．あるモデルで正しく分類できていた入力画像に対して微小なノイズを加えたところ，誤って推定されてしまうという問題が生じたのです．
![スクリーンショット 2021-01-19 2.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/759ea2a8-fe80-dbf8-2d9a-744214ac6cba.png)
上の図は，"豚"と推定されていた画像にノイズを加えたところ，"旅客機"と判断されてしまった例です．我々にはどちらの画像も豚にしか見えませんよね．
<br>
見えませんよね？
<br>
　このように，機械学習モデルを騙すように設計された入力のことを__敵対的サンプル(adversarial samples)__と言います．敵対的サンプルはさらに「ゼロから生成されたもの」と「元々良性だったサンプルに手を加えたもの」に分類され，特に後者を__敵対的摂動(adversarial perturbations)__と呼び，__敵対的攻撃(adversarial attack)__とは敵対的摂動を意図的に生み出すことを指します(ただし，特に区別する必要がある場合を除いて敵対的攻撃によって得られた例を敵対的サンプルと呼ぶらしいので，本記事もそれに倣い以後区別なく呼称します)．
<br>
　自動運転車や音声入力など機械学習モデルの実用化が進むにつれ，セキュリティ面の強化は言うまでもなく非常に重要な課題であり，多くの研究者の注目を集めています．
　では，自然言語処理(NLP)の分野にはどのような敵対的攻撃があるのでしょうか．例として次のようなものが挙げられていました．
![スクリーンショット 2021-01-19 22.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/d279282d-7c35-7623-4e96-ec11593d6f75.png)
この例では入力された文章の意味が positive か negative かを分類するようなモデルを考えます．一番上はオリジナルの入力で，これに対する出力は positive(77%) であると推定されています．一方，1文字目の "C" を "A" とタイプミスしてしまった2行目， "film" の同義語である "footage" を用いた3行目を入力とした場合は，文章の意味自体に大きな違いはないにも関わらず出力結果がどちらも negative と推定されており，敵対的サンプルとなっていることがわかります．

　このような例に対して堅牢なモデルを構築するために，どういった場合に敵対的サンプルが生じ，それを回避するためにはどうすれば良いのかを調査するのがTextAttackの主旨になってきます．


#TextAttackにおける敵対的攻撃
　TextAttackでは，敵対的攻撃は__目的関数・最適化手法・変換・制約条件__の4つの要素から構成されると定義しており，既存の攻撃手法もこの定義によって区別することができます．

* __目的関数__ (Goal Function)
　目的関数は，攻撃が成功したかどうかを判別する関数です．敵対的攻撃における成功・失敗の判断基準はもちろん「攻撃対象のモデルの出力結果が正しいか否か」であるので，対象モデルの目的関数に一致します．すなわち，攻撃がどのタスクをターゲットにしたものなのか(例: 文書分類, 翻訳など)に依存します．
<br>

* __探索手法__ (Search Method)
　探索手法は，敵対的サンプルを発見するために後述する変換・制約条件をどのような順で適用させていくかを決定する指標になります．代表的なものとしてはGreedy AlgorithmやGenetic Algorithm,Particle Swarm Optimizationなどがあげられます．
<br>

* __変換__ (Transformations)
　名前の通り，実際に入力を変換するものになります．ある単語を同義語に置き換えるのか，ランダムにtypoを発生させるのか，単語を削除するのか，はたまた挿入するのかなどを決定します．
<br>

* __制約条件__ (Constraints)
　変換を適用させるための制約条件を設定します．例えば一度変換を適用した単語には二度以上適用しないといったものやある語長以下の文章には変換を適用しないといったもの，文法誤り率やコサイン類似度，分散表現や単語埋め込みによる距離でしきい値を設けるといったものがあります．

#TextAttackの使用方法
　[チュートリアル](https://textattack.readthedocs.io/en/latest/2notebook/0_End_to_End.html)を参考にしながらTextAttackを実際に使ってみましょう．
　インストールは`pip`コマンドで行います．

```:terminal
$ pip install textattack
```

インストールができたら，コマンドライン上で`textattack <command>`と入力して使うか，Pythonスクリプト内で`import`します．


##1．敵対的攻撃
　まずはメインの敵対的攻撃から．使い方は簡単です．
　コマンドライン上で以下のように入力するだけ．　

```:terminal
$ textattack attack --recipe textfooler --model bert-base-uncased-ag-news --num-examples 5
```

　こちらは公式がAG Newsデータセットを用いてFine TuningしたBERTモデルの入力5サンプルに対して，[textfooler](https://arxiv.org/abs/1907.11932)と呼ばれる攻撃を実行するコマンドになります．
　この結果が以下のように出力されます．

<details>
<summary>実行結果例</summary>
<div>


 0%|                                                                                                                                                                        | 0/5 [00:00<?, ?it/s]
--------------------------------------------- Result 1 ---------------------------------------------
<font color="Red">__World (91%)__</font> --> __[SKIPPED]__

Lazard adversaries edge closer to a deal Bruce Wasserstein, head of Lazard, could reach an agreement as early as this week with Michel David-Weill, the chairman, extending the deadline for 


[Succeeded / Failed / Total] 0 / 0 / 1:  20%|███████                                                                                                | 1/5 [00:00<00:00, 27.38it/s]
--------------------------------------------- Result 2 ---------------------------------------------
<font color="Purple">__Sci/tech (99%)__</font> --> <font color="Red">__World (50%)__</font>

European <font color="Purple">__spacecraft__</font> prepares to <font color="Purple">__orbit Moon__</font> Europes first <font color="Purple">__lunar spacecraft__</font> is set to go into orbit around the Moon on Monday. SMART-1 has already reached the gateway to the Moon, the region where its <font color="Purple">__gravity__</font> starts to dominate that of the <font color="Purple">__Earth__</font>.

European <font color="Red">__warships__</font> prepares to <font color="Red">__track Lune__</font> Europes first <font color="Red">__lem baseship__</font> is set to go into orbit around the Moon on Monday. SMART-1 has already reached the gateway to the Moon, the region where its <font color="Red">__severity__</font> starts to dominate that of the <font color="Red">__Territories__</font>.


[Succeeded / Failed / Total] 1 / 0 / 2:  40%|██████████████                                                                        | 2/5 [00:02<00:03,  1.22s/it]
--------------------------------------------- Result 3 ---------------------------------------------
<font color="Blue">__Business (100%)__</font> --> <font color="Green">__Sports (60%)__</font>

Fed lifts rates a further quarter point <font color="Blue">__By Andrew__</font> Balls in Washington and <font color="Blue">__Jennifer__</font> Hughes in New York. The US <font color="Blue">__Federal__</font> Reserve on <font color="Blue">__Tuesday__</font> raised interest rates by a quarter point to 2.25 per cent and signalled there had been no change in its assessment of <font color="Blue">__economic conditions__</font>.

Fed lifts rates a further quarter point <font color="Green">__For Sebastien__</font> Balls in Washington and <font color="Green">__Stefani__</font> Hughes in New York. The US <font color="Green">__Govt__</font> Reserve on <font color="Green">__Domingo__</font> raised interest rates by a quarter point to 2.25 per cent and signalled there had been no change in its assessment of <font color="Green">__financially situations__</font>.


[Succeeded / Failed / Total] 2 / 0 / 3:  60%|█████████████████████                                                | 3/5 [00:04<00:02,  1.47s/it]
--------------------------------------------- Result 4 ---------------------------------------------
<font color="Green">__Sports (100%)__</font> --> <font color="Red">__[FAILED]__</font>

Pepperdine 80, Fairleigh Dickinson 79 Glen McGowan had 22 points and little-used reserve Chase Griffin came off the bench to make two clutch free throws to help Pepperdine hold off Fairleigh Dickinson 80-79 Friday for fifth place in the BCA Invitational.


[Succeeded / Failed / Total] 2 / 1 / 4:  80%|████████████████████████████                        | 4/5 [00:09<00:02,  2.39s/it]
--------------------------------------------- Result 5 ---------------------------------------------
<font color="Red">__World (100%) --> <font color="Blue">__Business (87%)

Indian-Americans hail <font color="Red">__Manmohan__</font> speech New York, Sep 27 (UNI) Members of the Indian-American community who attended a public meeting addressed by Prime Minister Manmohan Singh welcomed his speech and expressed confidence that India would soon be a developed economy.

Indian-Americans hail <font color="Blue">__Ashok__</font> speech New York, Sep 27 (UNI) Members of the Indian-American community who attended a public meeting addressed by Prime Minister Manmohan Singh welcomed his speech and expressed confidence that India would soon be a developed economy.


[Succeeded / Failed / Total] 3 / 1 / 5: 100%|███████████████████████████████████| 5/5 [00:10<00:00,  2.07s/it]

どのような攻撃が行われているかが一目でわかりますね．
</div></details>


|　Attack Results　|　　|
|:---:|:---:|
|　Number of successful attacks　|3|
|　Number of failed attacks　|1|
|　Number of skipped attacks　|1|
|　Original accuracy　|80.0 %|
|　Accuracy under attack　|20.0 %|
|　Attack success rate　|75.0 %|
|　Average perturbed word [%]　|11.2 %|
|　Average num. words per input　|40.2|
|　Avg num queries　|230.75|

全5サンプル中4サンプルに対して攻撃を行い，3サンプル攻撃に成功したため攻撃成功率は75%となっています(1サンプルは元々推定が間違っていたので攻撃対象から除外されています)．攻撃によってモデルの精度が80％から20％に低下していることも確認できます．
<br>

* 今回，`--recipe`によって既存の攻撃手法を決定しましたが，`--goal-function` `--search` `--transformation` `--constraint`を用いてユーザ定義の攻撃を用いることもできます．
 
* 今回は公式に提供された学習済みモデルを用いましたが，ローカルパスを指定してあげることで任意のモデルに対して攻撃を行うことができます．

* 公式のものや後述する`textattack train`コマンドを用いて学習されたモデルを指定した場合，データセットは自動的に学習時と同じもの(今回はag-newsデータセット)が選択されるようになっていますが，`--dataset-from-huggingface` `--dataset-from-file`によって任意のデータセットを選択することもできます．


##2．データ拡張(data augmentation)
　続いてデータ拡張になります．TextAttackでは，[攻撃要素]()のうち変換・制約条件の2つの機能を用いることでデータ拡張が行われます．
　コマンドラインからは以下のようなコマンドで実行されます．

```:terminal
$ textattack augment --recipe eda --csv /path/to/csv --input-column hoge -pct-words-to-swap .1 --transformations-per-example 2 --outfile augment.csv --exclude-original 
```

* ここでは[EDA](https://arxiv.org/abs/1901.11196)と呼ばれる手法を指定しています． 

* 上記のようにパスを指定したCSVファイルのhoge列か，`--interactive`としてインタプリタを起動して標準入力で入力した文字列に対してデータ拡張することができます．

* 今回の場合，入力単語数の10%がEDAによって拡張されたサンプルが2サンプルずつaugment.csvに出力されます．

コマンドからもわかるように，`textattack augment`ではHuggingfaceのデータセットやCSV以外の形式で保存されたデータを使用することはできません．
<br>
　一方で，Python APIとしてスクリプト内に記述すれば数行でデータ拡張が行えます．以下は入力文字列の変換を行いリストで返すような関数になります．

```Python:augment.py(Python3.6)
from textattack.augmentation import WordNetAugmenter

def augment(text:str):
    augmenter = WordNetAugmenter(
                   pct_words_to_swap=0.2, 
                   transformations_per_example=5
                )
    return augmenter.augment(text)
```

##3．モデルの訓練
###訓練
　モデルの訓練は以下のコマンドで実行できます．

```:terminal
textattack train --model bert-base-uncased --dataset ag-news --max-length 128 --batch-size 256 --epochs 10 --allowed-labels 0 1 2 3
```
この例では特に敵対的攻撃もデータ拡張も行わず，事前学習モデルをag-newsデータセットでFine Tuningを行っているだけになります．学習や評価のコードを書かなくて済むので攻撃を行わなくてもかなり便利そうです．

このコマンドがすごいところはここだけではありません．特に`--attack` `--augment`によって，敵対的攻撃およびデータ拡張を学習に取り入れることができるのです．

- 前者は__敵対的訓練(adversarial training)__と呼ばれる学習法で，指定したepochごとに敵対的攻撃が行われ，次のepochから攻撃が成功した入力を元の入力と入れ替えることで訓練データを逐次的に変化させながら学習を行います．

- 後者は前者とは異なり，学習の前にデータ拡張を行い，増加させた入力データで学習を行うというものです．

どちらも攻撃にロバストになると報告されているので，(時間の都合上)特に今回は後者のデータ拡張＋学習に焦点を当てて，後ほど精度評価を行っていきます．

###評価
　`textattack attack`コマンドで同時に精度評価(original accuracy)も行えるのですが，精度のみ算出することもできます．

```:terminal
textattack attack --recipe textfooler --num-examples 1000 --model /path/to/model
```

モデルは学習済みモデルを指定することもできます．

##4．おまけ： データセットの分析

以下のコマンドを使用すると，指定したいデータセットの詳細を算出することができます．訓練時の`--max-length`を決定したりするのに役立てることができます．

```:terminal
textattack peek-dataset --dataset-from-huggingface glue^sst2
```

<details>
<summary>実行結果</summary>
<div>
　<font color="Blue">__textattack__</font>: Loading <font color="Blue">datasets</font> dataset <font color="Blue">glue</font>, subset <font color="Blue">sst2</font>, split <font color="Blue">train</font>.
　<font color="Blue">__textattack__</font>: Number of samples: 67349
　<font color="Blue">__textattack__</font>: Number of words per input:
　<font color="Blue">__textattack__</font>:     total:   586019
　<font color="Blue">__textattack__</font>:     mean:    8.70
　<font color="Blue">__textattack__</font>:     std:     7.37
　<font color="Blue">__textattack__</font>:     min:     0
　<font color="Blue">__textattack__</font>:     max:     48
　<font color="Blue">__textattack__</font>: Dataset lowercased: True
　<font color="Blue">__textattack__</font>: First sample:
　it 's stupid  

　<font color="Blue">__textattack__</font>: Last sample:
　another wholly unnecessary addition  

　<font color="Blue">__textattack__</font>: Found 2 distinct outputs.
　<font color="Blue">__textattack__</font>: Most common outputs:
　　　　　1      (37569)
　　　　　0      (29780)
</div></details>

##補足
※2021/02/01時点でバグがあるようで、大概の場合動きはしますが少々デバッグしないと正しく動作しないことを確認しておりますのでご注意ください。

#データ拡張による精度評価
ここからは実際にデータ拡張＋学習を行った結果について評価を行います．実行環境はこちら．

- CentOS Linux 7.3.1611
- Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
- メモリ 32GB
- NVIDIA GP100GL ×2

##データ拡張手法
　TextAttackの実装されているデータ拡張手法の中から，EDA, Checklist, Embedding, WordNet(,CLARE)についての比較検討を行っていきます．それぞれの特徴をまとめるとこんな感じ．

|手法|特徴|
|:---:|:---:|
|[EDA](https://arxiv.org/abs/1901.11196)|WordNetを用いた同義語置換・単語のランダム挿入/入れ替え/削除を行う．1サンプルに対してどれか1つを適用．|
|[Checklist](https://arxiv.org/abs/2005.04118)|数字/地名/人物名の変更・語の展開/省略を行う．1サンプルに複数の変換が実行される場合や何も変換しない場合がある．|
|[CLARE](https://arxiv.org/abs/2009.07502)|Masked LMモデルによって同義語の置換・文の意味が変わらないような語の挿入/結合を行う．1サンプルに複数の変換が実行される場合がある．|
|Embedding|単語の埋め込みによって分散表現から語を置換する．|
|WordNet|WordNetを用いて同義語の置換を行う．|

　これらのデータ拡張手法を用いて，データセットを拡張し，拡張前後で精度がどのように変化するかを検証します．CLAREについては，検証したかったのですが時間の都合上学習までは行えませんでした...

##モデル ・ データセットの選択
　モデルはHuggingfaceによって事前学習済のBERT<sub>BASE</sub>モデルを選択しました．有名なので説明は不要かと思いますが，念のためBERTの提案された論文のリンクを[こちら](https://www.aclweb.org/anthology/N19-1423/)に貼っておきます．
　データセットは，TextAttackはNLPタスクであれば基本的になんでも対応しているそうですが，分類タスクがメインだそうなので，今回は以下の2つのデータセットを使用しました．


|データセット|詳細|
|:---:|:---:|
|AG News|ニュース記事とそのカテゴリがラベル付けされた多クラス分類用データセット．カテゴリは(World, Sci/tech, Business, Sports)の4種．|
|SST2|映画のレビューとその内容のpositive/negativeがラベル付けされた2値分類用データセット．1サンプル中の文章は比較的短いものが多い．|

　データセットでサンプル数にもばらつきがあるので，今回はどちらも学習に6,000サンプル，テストに1,000サンプルのみ使用しました．


##結果・考察

###データ拡張

　学習を行う前に，それぞれの手法でどのようにデータ拡張されているかを見るため，ローカルにAG NewsデータセットをDLして200サンプルずつデータ拡張を行ってみました．
　結果例と計算時間を以下に示します．

|手法|計算時間[s]|　　　　　　　　　　　　　結果例|
|:---:|:---:|:---|
|Original|NaN|Reuters - As Shakespeare said, a rose by any other\name would smell as sweet. Right?|
|EDA|142.6|Reuters - As Shakespeare said, a rose by any other\\<font color='Red'>__identify__</font> would smell as sweet. Right?|
|Checklist|54.9|Reuters - As <font color='Red'>__Giacomo__</font> said, a rose by any other\name would smell as sweet. Right?|
|CLARE|18603.5|Reuters - <font color='Red'>__As in__</font> Shakespeare said, a rose by any other\name would smell as sweet. Right?|
|Embedding|764.1|Reuters - As Shakespeare <font color='Red'>__avowed__</font>, a rose by any other\name would smell as sweet. Right?|
|WordNet|122.2|Reuters - As Shakespeare said, a rose by any other\name would smell as sweet. <font color='Red'>__properly__</font>?|

　この例では単語が削除されたものはありませんが，それぞれ前述した通りの転換が実行されていることがわかります．EDAではnameが動詞と捉えられてしまったのでしょうか．WordNetも違和感がありますね．CLAREはマージによって高度な言い換えが行えています．
<br>
　一方，実行時間を比較するとChecklistが最も早く，CLAREが最も遅いことが見て取れます．Checklistは数字の変換や固有名詞を既存のものと置き換えるだけなので高速です．EDAはWordNetの機能を拡張したものと言えるので納得の計算時間ですね．CLAREは高度な変換が行えるのですが，次に遅いEmbeddingと比較しても極端に遅いことがわかります．これはおそらくTextAttackのデータ拡張がCPU上でしか動かないことが問題かと思われますが，ちょっと6,000サンプルに対して実行するのは時間の制約上無理そうなので，本記事でのCLAREの検証はここまでとなります．


###学習

実際に各手法で各サンプル10％の単語に変換を行い，サンプル数が2倍になるようにデータ拡張をしたものを入力に用いて学習し，拡張しなかった場合との攻撃結果の比較をまとめました．ここで用いる攻撃は`textattack attack`のコマンドを実行した際にデフォルトで設定されていたものを用いており，以下のような設定になります．

|要素|手法・関数|
|:---:|:---:|
|目的関数|UntargetedClassification|
|探索手法|GreedyWordSwapWIR|
|変換|WordSwapEmbedding|
|制約条件|[ RepeatModification, StopwordModification ]|

行われる変換は単語埋め込みによる置換だそうです．また，攻撃時の置換は20％の割合で行います．
　続いて結果を示します．

__AG News__

|拡張手法|Original accuracy|Accuracy under attack|Attack success rate|
|:---:|:---:|:---:|:---:|
|-|__91.8 %__|13.6 %|85.2 %|
|EDA|90.5 %|20.0 %|77.9 %|
|Checklist|91.3 %|13.8 %|84.9 %|
|Embedding|90.7 %|14.9 %|83.6 %|
|WordNet|90.2 %|__22.2 %__|__75.4 %__|


　まずはAG Newsデータセットの結果になります．データ拡張前のものが攻撃前の精度は最も良く，攻撃下ではWordnetの精度が最も良くなることが確認できます．確かに，攻撃下では全ての手法で精度の向上が確認されました．特にEDAとWordNetの精度が高いことから，Wordnetによる同義語の置換が良い影響を及ぼしている要因ではないかと考えられます．
<br>
　__一方，攻撃前の精度は良くなっているどころか，悪化してしまいました．__この原因を調査していたところ，[攻撃に対するロバスト性が結果の精度に影響を与える旨の論文](https://arxiv.org/abs/1805.12152)を発見しました．この論文内では，
>　線形分類器の標準的な分類の目的は正確に結果を予測することであり，入力の持つある特徴と正解ラベルとの相関は，その特徴が分類にどの程度有用であるかを定量化します．
　本論文で得られた結果は，攻撃モデル（敵対者にもたらされる摂動）によって特徴相関に暗黙のしきい値が課されることを示唆しています。標準モデルはゼロではない相関を持つすべての特徴を利用することができますが、攻撃にロバストなモデルはこの閾値以下の相関を持つ特徴に頼ることはできません。(筆者要約)

と述べられていました．すなわち，敵対的サンプルを学習するということは「入力の特徴を疑う」ことになり，__<font color='Red'>攻撃前は参照できていた特徴を参照できなくなる</font>__ことによって精度が低下してしまうと考えられます．
　それでも限られたデータセットの場合には重みの学習が不十分なため精度は上がるそうですが，サンプル数が増えるほどその貢献は小さくなり，十分なデータが与えられている場合には精度が悪化してしまうようです．

　では，どのような間違いが多いのでしょうか？scikit-learnを用いて混同行列を作成し可視化してみたいと思います．
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/d0ac87a5-b220-8bed-fc5d-eab003ab9f51.png)
縦軸が正解ラベルのクラス，横軸が推定結果のクラスになり，濃いブロックはサンプル数を表します．上半分が攻撃前，下半分が攻撃後の結果になります．
　攻撃前は多くが正しく推定されており，正解ラベルと推定結果のクラスが一致していて，行列でいうところの対角成分が濃くなっていることがわかります．一方，攻撃後になるとかなりばらつきが出てしまっています．特に，どの手法を見ても攻撃前に多少色の濃い部分が顕著に増えているように見えます．

上の図からわかることと大差ありませんが，せっかくなのでF値も出してみました．
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/f1c8d04e-9b0a-ed5d-3c45-942659c7ce05.png)
P値が若干良さげですが，偏りなく値が悪くなっていることがわかります．

　攻撃が単語埋め込みによる置換なのでEmbeddingが一番良くなりそうなものですが，そういうわけでもないみたいですね・・・
<br>
　データセットをSST2に変えてみた結果は次のようになります．

__SST2__

|拡張手法|Original accuracy|Accuracy under attack|Attack success rate|
|:---:|:---:|:---:|:---:|
|-|__90.9 %__|__12.4 %__|__86.4 %__|
|EDA|90.3 %|9.17 %|89.8 %|
|Checklist|90.4 %|10.3 %|88.6 %|
|Embedding|90.3 %|9.29 %|89.7 %|
|WordNet|89.6 %|11.0 %|87.7 %|

　__あれ？攻撃後の精度も悪くなってる？__
　とりあえず混同行列とF値も一気にみてしまいましょう．　

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/7eefadb8-df78-13fd-70ad-2981128c2379.png)
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425716/b4eee468-5567-a233-f68c-b179245008e8.png)

　どれも同じような結果になっていて比較としてあまり成立してないですね...

　攻撃前の結果が悪くなるのは前述したことが理由として挙げられそうですが，攻撃後の結果が悪くなる原因ははっきりとわかっていません．考えられる要素としては

* サンプル中に存在する単語数の平均が17.4語とAG News(38.6語)に比較して半分ほど短く，前置詞や冠詞などのあまり文意に影響しない単語を除くとpositive/negativeの判断基準となる語が文中に少なく，分類が難しい
* 前置詞や冠詞は同義語が少なく，あまり攻撃対象とされないため相対的に重要単語が攻撃される可能性が上がる
* 文法的な誤りを考慮していないことで本来参照すべき単語に注目できていない
* 摂動を受ける前後で分類結果が変わらない＝重要でない単語 と認識されてしまった

などが挙げられるでしょうか．

意外とデータ拡張によって結果が良くなったりしないものなんですね...

###追加検討
　追加検討として，簡単にパラメータを変更した結果も簡単に載せてみます．ここではEDAのみの検討となります．変更点としては，

* データ拡張を1サンプルあたり2つ→4つに変更
* 変換割合を10%→20%に変更

となります．最初の行に比較のため先程の結果もそのまま載せます．

__AG News__

|手法|拡張サンプル数|変換割合|Original accuracy|Accuracy under attack|Attack success rate|
|:---:|:---:|:---:|:---:|:---:|:---:|
|EDA|×2|10 %|__90.5 %__|__20.0 %__|__77.90 %__|
||×2|20 %|90.3 %|14.5 %|83.9 %|
||×4|10 %|90.1 %|16.7 %|81.5 %|

__SST2__

|手法|拡張サンプル数|変換割合|Original accuracy|Accuracy under attack|Attack success rate|
|:---:|:---:|:---:|:---:|:---:|:---:|
|EDA|×2|10 %|__90.3 %__|__9.17 %__|__89.8 %__|
||×2|20 %|88.2 %|8.94 %|89.9 %|
||×4|10 %|89.5 %|7.91 %|91.2 %|

　まあ，拡張前の方がいい精度が出ているので増やしたところでさらに悪くなるのは当然かもしれません．ただ，AG Newsではデータ拡張前よりも攻撃成功率は低くなっていますね．
　今回の結果からはサンプル数と変換割合どちらが有用かは判断がつけられませんでしたが，ご参考までに．

#まとめ・感想
* 敵対的攻撃について調査しました．
* TextAttackというフレームワークについて説明しました．
* データ拡張手法を用いた敵対的攻撃の検証を行いました．
    * データ拡張で攻撃に対するロバスト性が向上する場合があることを確認しました．
    * 一方，精度が低下する問題が生じることもわかりました．

同義語置換によってこれほど推定できなくなるなんて衝撃ですね．今回は時間の関係で試せませんでしたが，CLAREについても検証してみたいですね．
<br>
Qiita初投稿です．
筆者の解釈の誤っている部分がある，筋違いな検討をしている等ありましたらぜひコメントいただければと思います．

#参考文献
[1] [TextAttack: A Framework for Adversarial Attacks, Data Augmentation, and Adversarial Training in NLP](https://arxiv.org/abs/2005.05909)
[2] [Intriguing properties of neural networks](https://arxiv.org/abs/1312.6199)
[3] [Is BERT Really Robust? A Strong Baseline for Natural Language Attack on Text Classification and Entailment](https://arxiv.org/abs/1907.11932)
[4] [EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks](https://arxiv.org/abs/1901.11196)
[5] [Beyond Accuracy: Behavioral Testing of NLP models with CheckList](https://arxiv.org/abs/2005.04118)
[6] [Contextualized Perturbation for Textual Adversarial Attack](https://arxiv.org/abs/2009.07502)
[7] [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://www.aclweb.org/anthology/N19-1423/)
[8] [Robustness May Be at Odds with Accuracy](https://arxiv.org/abs/1805.12152)