糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

Deep Text Classification Can be Fooled (Preprint) 読んだ

Deep Text Classification Can be Fooled
入力を少し変化させるだけで機械学習によるモデルの推定結果を変えてしまう技術は Adversarial example と呼ばれている.
よく見るのは画像を用いた例だけど,それが文書分類でもできないかと思い探したところ,まずこれがでてきたので読む.

画像一般についてはこちらが詳しい.これを読むまで Deep Learning 特有の問題と思っていたが,実際はそうではないらしい.
はじめてのAdversarial Example

前提

文書 を入力として,その文書のクラス を推定するモデル があるとする.
そこで, に手を加えた によってモデルの出力を任意のクラス に誤分類 させたい.
画像と違うのは,入力が文書であるため,人間の目で見ても不自然でないように変更しなければならないということ.

手法

基本的には Explaining and Harnessing Adversarial Examples (FGSM) で提案されているように,コスト関数の勾配を用いる.
分類モデル Character-level Convolutional Networks for Text Classification で提案されている Character-level CNN.
文書の変更は挿入,修正,削除の3つの方法を適用する.それぞれ説明する.

挿入

各学習データ と目的のクラス および損失関数 に対して,勾配 を計算することで,各次元,つまりは各単語に対して勾配が得られる.
各学習データにおいてこの勾配が大きい単語上位100件を得,それを全学習データで数え上げることで, Hot Training Phrases (HTPs) を得る.
あとは HTP を挿入していくだけで誤分類できる.例えば Company 99.7% と予測していた文書に historic という単語を加えるだけで Building 88.6% と誤分類させることに成功している.
挿入位置も重要で,適当なところに入れると出力が変化しない.元クラスに強く寄与している,つまり が大きい単語の近くに挿入することで適切に誤分類できる.
複数の単語を挿入しなければいけない場合は HTP が含まれた文章を新たに追加する.もしちょうどいいものがなければ,読み手にばれにくい嘘の文章を追加する.

修正

修正といっても削除に近い.
元クラスに寄与している語を を使って探す.これを Hot Sample Phrase (HSP) と呼ぶ.
HSP に対して,元クラスへの損失関数 を増加させつつ,目的のクラスへの損失関数 を減少させるような修正を行なう.
単語の修正とは一体何かというと,

  • ススペルさせる (ミススペコーパスを事前に用意しておく)
  • 人間に見分けがつきにくいような置換を行なう.例えば l と 1 (おそらく置換ルールを用意しておく)

という二種類を行なう.
例えば comedy film property が HSP (Film, 99.9%) だった場合,flim と typo することで Company 99.0% にできる例が示されている.

削除

HSP が高い単語を削除するが,無闇に削除すると人間にばれる.よって形容詞と副詞を削除する.
論文中では seven-part British terevision series という HSP に対して British を削除することで Film 95.5% を 60.5% まで低下させている.

組み合わせる

これら三つを組み合わせることで飛躍的にうまくいく.

実験

例が作れたかどうかだけではなく,人間に読ませる実験も行っている.
変更を加えた文章も人間は適切に分類しており,うまく のみを騙せていることがわかった.
また,「人為的に変更した箇所と思われる部分を指摘せよ」という指示も出したが,精度 5.0%, 再現率 2.0% だったのでかなりばれにくいことがわかった.

シンプルだけどとてもおもしろかった.日本語でやるとすると見た目が似た漢字などが使えるのかもしれない.
日本語の多クラス分類データセットがあればすぐにでも実験できそう.
また, Adversarial example 自体は CNN 固有の問題でないので, GBDT などでも再現できるのではないだろうか.
(追記) 寝て起きて気づいたけれど,「挿入位置にセンシティブである」ということから bag-of-words で表現するモデルでは正しく動作しない気がしてきた.