sotetsuk's tech blog

Adversarial exampleについて

この記事はMachine Learning Advent Calendar 2015 - Qiitaの16日目です。

今回はDeep learningに関連したトピックであるAdversarial exampleについて簡単にまとめたいと思います(宣言していたものと違いますが...*1)。SNSなどを通じて情報が入ってくることは比較的多い話題だとは思うのですが、日本語でまとめた記事はあまりないかなと思ったので、誰かの役に立ってくれると嬉しいです。

 

これまでの経緯として、Adversarial exampleはSzegedy et al. (2014)ではじめて提案され、arXivに掲載された2013年12月から現在に至るまで2年間で100を超える引用数があります。ICLRなどを中心とした会議(というかarXiv)で研究・議論が進んでいて、今夏のDeep Learning Summer Schoolでは、GoogleのIan Goodfellowがこのトピックについて講義を行っています(slide)。

 

Adversarial exampleとは

Adversarialという単語を調べてみると

1. 反対の 2. 敵対する、対立する といった意味が出てきます。

 

Szegedy et al. (2014)では、学習済ニューラルネットワークを"欺く"ようにデータセットのサンプルから造られた人工的なサンプルのことを、adversarial exampleと呼んでいます。学習済ニュラルネットワークに対し、正しいクラスAだと識別されるサンプル xを用意します。これに対し、少しだけノイズ r \|r\|_{2}は十分小)を加えた \tilde{x} = x+rが、ニューラルネットワークを欺く(誤ったクラスだと識別する)ように最適化問題を解いて rを求めます。すると、(たとえば画像認識なら)人間の目には x + r xと同じようにクラスAにしか見えないのに、ニューラルネットワークは違うクラスのサンプルだと(強い確信度で)誤ってしまうサンプルが作れます。これは、もしニューラルネットワークを欺こうとする敵対者がいれば、そうしたサンプルを作れてしまうことになります。この問題は、実社会での応用を見据えれば極めて重要になってくる可能性があります。具体例としてGoodfellow et al. (2015)から引用してきた画像を示します(この rの構成方法は最適化問題を解くよりシンプルなものです): 

 

f:id:sotetsuk:20151216061247p:plain

 

パンダだと正しく識別していたものが、ノイズを加えられることで、人間の目にはパンダにしか見えないのにも関わらず、誤って識別されていることがわかります。Deep learningはご存知のようにImageNetなどの画像認識タスクで高い識別性能、汎化性能を示しているわけですが、このニューラルネットワークの挙動は、自然画像データのように空間の中で連続性が担保されていて欲しい( x \tilde{x} = x+r rが小さければ似たもの、同じクラスのものであって欲しい)データに対して適切でないという印象を受けます。

 

似たような研究として、Nguyen et al. (2015)は人間の目には全く意味を成さない画像(サンプル)なのにも関わらず、高い識別性能を示すDeep neural networkが、ある特定のクラスの画像だと強く思い込む画像を進化的アルゴリズムを使って構成しています(fooling images): 

 

f:id:sotetsuk:20151216171249p:plain 

  

なんでこんなことが起こるの?

直感的にはニューラルネットワーク非線形性から説明がされそうな気がしますが、Goodfellow et al. (2015)では、入力データ空間が高次元であれば(例え識別器が線形であっても)adversarial exampleを構成するのに十分である、という説明をしています。

まずそもそも、Goodfellow et al. (2015)によればadversarial exampleは線形な識別器でも実際に起こります。データ空間の高次元性による説明は線形識別器でもadversarial exampleが造れることに対する直感的な説明を与えます: 

学習済識別器にサンプルを入力して出力を得る際、ニューラルネットワークやロジスティック回帰をはじめとする多くの識別器では、その出力は次のような重みと入力の内積に依存します: 

$$\begin{equation}\displaystyle w^{\mathrm{T}}\tilde{x} = w^{\mathrm{T}}x + w^{\mathrm{T}}r\end{equation}$$

 w^{\mathrm{T}}rがどのように出力に影響を与えるのか考えます。ここで、 r = \varepsilon \cdot sign(w)とします。これは \|r\|_{\infty} = \varepsilonかつ、内積計算時に各要素の積が正の値として加算されていくようにしています。すると、 w^{\mathrm{T}}r \varepsilon \cdot n \cdot mとかけます(但し、 nはデータ空間の次元数、 m wの各要素の大きさの平均)。これは nに対し線形なので、少なくともこのように rを構成することで、 w^{\mathrm{T}}r = w^{\mathrm{T}}\tilde{x} - w^{\mathrm{T}}xを大きくしていくことが出来ます。これは、線形な識別器でadversarial exampleが構成できる直感的な説明になっています。近年提案されているDeep learningのモデルも(部分)線形な活性化関数を用いていることを考えれば、一つの仮説として説明力のあるもののように感じます。 

Adversarial training

Goodfellow et al. (2015)では、adversarial exampleを正則化に使うというアイディアを提案しています。最小化するコスト関数 J(\theta, x)に次のようにして正則化項を加えます: 

$$\begin{equation}\displaystyle \tilde{J}(\theta, x) = \alpha J(\theta, x) + (1-\alpha)J(\theta, \tilde{x})\end{equation}$$

Goodfellow et al. (2015)では、これによってMNISTでテスト誤差の改善を報告しています。

 

これに着想を受け、2015年末時点で既にいくつかの進展があり、PFIの岡野原さんがTwitterで紹介されていたので、そのコメントと共に紹介します。

 

Miyato et al. (2015)はコスト関数ではなくデータ空間に直接滑らかさを定義することによって、ラベル情報なしでadversarial trainingする手法を提案しました(VAT;Virtual Adversarial Training)。ラベル情報なしで学習できるためsemi-supervised learningのタスクに応用でき、arXiv掲載時点ではMNISTにおけるsemi-supervisedタスクのstate-of-the-artでした。

 

Nøkland (2015)は、よりシンプルな方法でコスト関数の勾配を変形し正則化する学習法を提案しました。

  

まとめ・感想

Adversarial exampleについて、文献を上げながら簡単に経緯と概要を説明しました。少し内容の薄い記事になってしまった感もありますが、最後に参考文献とリンクを上げているので、興味があればそちらを見てみて下さい。

参考文献

  • Szegedy et al., Intriguing properties of neural networks. (2014) ICLR. (arXiv)
  • Goodfellow "Adversarial example." (2015) Deep Learning Summer School. (slide)
  • Nguyen et al. "Deep Neural Networks Are Easily Fooled: High Confidence Predictions for Unrecognizable Images." (2015) CVPR. (arXiv)
  • Goodfellow et al. "Explaining and Harnessing Adversarial Examples." (2015) ICLR. (arXiv)
  • Miyato et al. "Distributional smoothing by virtual adversarial examples." (2015) arXiv. (arXiv)
  • Nøkland "Improving Back-Propagation by Adding an Adversarial Gradient." (2015) arXiv. (arXiv)

本文では触れなかった関連する文献やブログもあげておきます: 

*1:もともとはポアソン過程やその亜種を使ったWeb上のユーザ行動のモデリング事例について書く予定だったのですが、工数が存在しませんでした...