yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[2007.06174] Generating Fluent Adversarial Examples for Natural Languages [paper-reading] #42

Open yoheikikuta opened 4 years ago

yoheikikuta commented 4 years ago

論文リンク

https://arxiv.org/abs/2007.06174

公開日(yyyy/mm/dd)

2019/07

概要

NLP における流暢な adversarial examples の作成を目指した論文。 black box と white box の両方に使える手法で、単語の置き換えをベースにしているものになっていて、その置き換えをランダムではなくて Metropolice Hastings サンプリングを使って効率的にしている。 提案分布を言語モデルと攻撃対象のモデル予測を使うことで構築して、言語モデルの意味でより自然な文章を作ることを目的としている。white box の場合はこれに微分情報も付与することで、より予測を間違えやすい単語選択を enhance するようになっている。 従来手法と比べると、攻撃対象のモデルの呼び出し回数を少なくした上で高い攻撃成功率を達成。

yoheikikuta commented 4 years ago

NLP における adversarial examples を調べていて、https://github.com/yoheikikuta/paper-reading/issues/41 に続いて第二弾。

この論文も ACL2019 の accepted papers 一覧を眺めていて見つけたものの一つで、従来のものよりもより流暢(人間の目で見た時に自然な)な adversarial examples を作ることを目的としている。

単語の置き換えを Metropolice-Hastings (M-H) 的に定式化し、定常分布に言語モデルを入れたり提案分布を置換・挿入・削除のそれぞれからなるものとしたりしているっぽい。

yoheikikuta commented 4 years ago

モチベーションはタイトルにもあるように流暢(人間から見て自然な)adversarial examples を作りたいというもの。HotFlip のような文字置き換えの手法では語彙的に間違っている単語を作り出してしまうし、genetic attack では自然さが足りない、という問題点がある。

genetic attack は Generating Natural Language Adversarial Examples のことで、black box の単語置き換えをベースとした adversarial example の構成方法である。 ざっくり言うと、元の文章の単語の一つを GloVe の意味で近い単語に置き換えるという Perturbe という処理を複数回行って種を作り、それらを Crossover (二つの文を取り、適当なところで切ってつなぎ合わせる) させながら狙いのラベルに間違えさせるデータを作るというものになっている。

この論文では black box と white box の両方のアルゴリズムを提案していて、それぞれ M-H に基づいてより良さそうな単語の置き換えを目指していくものになっているとのこと。

yoheikikuta commented 4 years ago

問題設定は以下。

ベースとなる M-H もさらっと復習しておく。 これは完全な形の確率分布を求めるのは困難な状況で、それに比例する確率分布が準備できれば(典型的には分配関数を求めるのが大変だというような状況)マルコフ連鎖で所望の確率分布を近似するサンプル列を生成していける手法。 マルコフ連鎖 $ x \rightarrow x' $ で、定常分布を $ π(x) $ 提案分布を $ g(x'|x) $ と書く時に以下のように採択率を定める。

標語的に言えば、本当はこの $ π(x) $ から直接サンプルしたいがそれが難しい場合、サンプルするのが容易な g からサンプルすることにして、そこで $ π(x) $ と $ π(x') $ の比が計算できるなら望むサンプル列が得られる、というものである。

いまの問題設定に合わせて考えてみる。 入力文 $ x $ を adversarial example $ x' $ に変更したいわけだが、ラベルの情報がここに入ってくる。モデルに間違えさせたい target label $ \tilde{y} $ がある場合、これを given にした場合にどういう文章が出てくるかの確率分布を定常分布とする $ π(x|\tilde{y}) $ 。 いま、元々の入力文であればラベルが間違えてるわけなので $ π(x|\tilde{y})$ は小さいはずだが、これを単語置き換えなどをして間違えるようになった $ x' $ にしていくと $ π(x'|\tilde{y}) $ が高くなるはずである。ランダムに置き換えるのでなく、設定した定常分布を頼りにして間違えやすい文を作っていくということになっている。

詳細は以下で見ていくが、この M-H に基づいた攻撃方法を Metropolis Hastings Attack (MHA) と読んでいる。サンプリング手法を取り入れて名付けるほどのものなのかという気もするが、名前があった方が便利ということなんだろう。


後ろの方まで読んだら black box でもモデルの softmax 出力値も使っていた。なのでラベルだけでなくて、少なくとも間違えさせたいラベルに対応する softmax 成分の出力値にはアクセスできる必要がある。

yoheikikuta commented 4 years ago

Black Box (b-MHA)

ここまでで明らかなように、この論文で重要になるのは定常分布と提案分布の設定である。

まず、定常分布は以下のように定めている。LM は Language Model である文章が与えられればそれが生成される確率を表現できることができるもので、これは何かしらの言語モデルを準備すればよい。$ C (\tilde{y}|x) $ は入力 x を与えた時に $ \tilde{y} $ と予測する確率を与える予測モデルで、これは何かしらの分類器で、攻撃対象のモデルである。

marginal distribution は計算が大変だが、この比例する形があればマルコフ遷移における採択率を計算できるのが M-H 法であった。

次に提案分布。 単語の置き換えを基本にしているので、操作として「置換・挿入・削除」の三つを扱うことにしている。

まずは traversal indexing をすると言っている。これ最初なんだか分からんかったけど、$ t $ 回目の提案時点で $ i $ 番目の単語 $ w_i $ を選ぶ時、$ t+1 $ 回目の提案では選ばれた単語 $ w* $ を以下のように書く、と言って以下の式を出している。

単に単語を一個ずつずらして一番後ろのは一番目に持ってくる、というだけに見える。 なんでこれが必要かよく分からんがとりあえず進んでおく。

まだ準備が必要で、置換や挿入の際に候補を絞っておくための pre-selection についても理解しておく。 これは score $ S(w|x) $ を以下のように定義して、上位のいくらかを使うというものになっている。

ここで $ x $ の suffix の意味は 1,...,m-1 までの単語という意味で、$ LM_b $ は逆向きの言語モデルでお尻から n,...,m+1 番目までの単語を入力としたときに w を出す確率となっている。双方向からのスコアを掛けているというだけだ。 この書き方から想像できるように bi-directional LSTM などを使っているが、流行り的には単に BERT のような transformer encoder 的にすれば MLM として扱うんだろう。

ようやく提案分布の具体的な操作を定義できるところまで来た。単語 $ w_m $ が変換の対象の単語とするとき、以下の三つの操作の提案分布を定義する。

あとはこれらそれぞれに確率を付与して、最終的な提案分布を以下のように定義する。

yoheikikuta commented 4 years ago

White Box (w-MHA)

ベースは b-MHA と同じで、違いは pre-selection のみとなる。色々定義あって面倒だったのでばっとスクショ。誤認識するような置き換えを微分情報の alignment をもとにして enhance しているというだけ。

w-MHA では挿入は使えない。 単語を挿入した後、置換のための微分情報を計算することを考える。上の計算の意味をよくよく考えてみると、元々の入力に対する loss function を置き換え対象の単語の embedding で微分することで最急降下の方向を計算している。挿入の場合、loss function を計算したあとに、それを loss function の計算で使われていない新しい単語の embedding で微分しないといけないので、それは不可能であるということだ。

そして削除も同じ理由で使えないと言っている。しかしこれは微分情報とか使わないので別にいいと思うのだが...よく分からん。


ここは改めてちょっと考えてみた。

挿入の場合は、本当に計算したい微分は元々の入力で計算した loss に対して、ランダムに挿入する単語の embedding で微分をするというもの。これで最急降下の方向を求めてそれに近い単語でランダムに挿入したものを置き換えたいわけである。しかし loss の計算にはランダムに挿入した単語は入ってないので微分ができない、ということになっている。

削除の場合は loss の微分をやったとしても、置き換え対象の単語があるわけではないのでここで紹介したような形では微分情報を使えない、ということだろう。原理的には単語を一個ずつ除いて loss を計算して、それらを比べて loss が最も大きくなるものを除くことにする、というのはできるはずだが計算はやや大変だ。

yoheikikuta commented 4 years ago

実験の設定。

データは以下を使用。

攻撃対象となるモデルは以下を使用。

比較手法は以下を使用。

MHA の設定は以下を使用。

あと言語モデルで何を使ったかが必要な情報だと思うのだが、論文を読む限り書いてなさそう。 code もないっぽいので分からん。

yoheikikuta commented 4 years ago

まず、提案手法の効率性を検証。 IMDB では攻撃対象のモデルで正しく分類された 1000 件を持ってきて、SNLI では 500 件を持ってきて、攻撃対象のモデルの呼び出し回数ごとに攻撃の成功率をプロットしたものが以下(詳しくは書いてないがこれはデータ一件あたりということ。一回の M-H 提案ステップで 30 個の pre-selection 単語それぞれで一回は呼び出しが発生する。提案ステップは最大 200 回なので 6000 を upper bound にしている)。提案手法の方が効率が良いことが分かる。

この結果を基に一件辺りの呼び出し最大回数を 6000 に設定し、adversarial attack の成功率を見たものが以下(これは全テストデータの結果だと思われる)。 IMDB では成功率が高くてあまり差が見られないが、SNLI では大きく改善している様子が見て取れる。攻撃対象のモデルの呼び出し回数も比較的少ない(これは間違えさせるために呼び出した平均だろう)。

ちなみに PPL は言語モデル(そのモデルが何なのかが分かってないのだが)の値で、提案手法の方が値が小さいのでより「生成されそう」な文章を作れている。これをもって fluent だと主張。最初論文を眺めたときは人間の目から見てという話なのかと思ってたけど PPL の意味であった。

これらがメインの結果。 なんかちょっと記述が不十分で想像で補わないといけない点が多いのが読んでてちょっとストレス。

yoheikikuta commented 4 years ago

実際に生成された adversarial examples を見てみる。

確かに良くなっているが、appendix とかでもっと例が欲しかったなという印象。置換の例だけだし。

ボランティアの人に人間目線での実験もしてもらって、人間は adversarial examples でも正しくラベルづけできているし、流暢さも検討してもらって提案手法が高かったと言っている。これはだいぶ小規模にやってるのでまあ良さそう、くらいの感じ。

yoheikikuta commented 4 years ago

最後に adversarial training も試している。

まずは adversarial training によって adversarial attack をどれくらい防げるかを試したもの。 全然防げてない。これ結構びっくりだった。攻撃方法をそのまま使って学習してもこんなもんなのか?画像の場合とだいぶ様子が異なる。あまり信じられない。 論文の主張としては genetic で学習しても提案手法は全然変化なしだが、提案手法で学習すれば genetic の成功率は少し落ちるのでより良いぞ、ということらしい。

汎化性能をどれくらい高められるかも SNLI の場合に試している。学習データ数が少ない場合に少し改善している。そこまで impressing というわけではないかな。

yoheikikuta commented 4 years ago

ということで一通り読んだ。

ランダムな置き換えではなくて M-H を使ってより効率的に置き換えていこうということで、従来までの手法を着実に進展させたという印象。

NLP で adversarial examples を使って学習させて、その結果どれくらい adversarial attack を防げるかは見たことなかったが、全然防げないことに驚いた。これは気になるところなのでもうちょっと調べていこう。