2018-04-11 19:01:39
機械学習の国際学会 NIPS’17 に併設され Kaggle で開催されたコンテスト「NIPS’17 Adversarial Learning Competition」に PFN のメンバーで参加し、4 位入賞を果たすことができました。その結果、NIPS’17 に招待され発表を行い、手法についての論文も執筆し公開しました。ソースコードも公開しています。本記事では、具体的にどういった内容のコンテストだったかや、我々がどのようなアプローチで取り組み 4 位入賞を達成したのかについて紹介します。
Adversarial example [1, 2, 3] は深層学習を実用化していく上での最も大きな課題の 1 つとして考えられている非常にホットな研究分野です。画像認識を例に取ると、元画像に対し人が気づかない程度の僅かな変更を加えるだけで、CNN による画像認識を大きく誤動作させることができることが知られています。
上の画像は adversarial example の例です(出典 [2])。左の元画像にはパンダが写っており、CNN もパンダであると正しく分類できています。真ん中に描かれているのは悪意を持って作られたノイズです。右の画像も、我々人間には一見して左のものと同じパンダの画像に見えます。しかし、実際にはノイズがわずかに重ねられており、右の画像を CNN に分類させると、パンダではなくテナガザルの画像であると非常に高い確度をもって誤判定してしまいます。
今回開催された NIPS’17 Adversarial Learning Competition は、その名の通り、adversarial example に関するコンテストです。攻撃トラックと防御トラックの 2 種目を順番に説明します。
画像を入力として受け取り、悪意を持ってノイズを加え画像を adversarial example に変換し出力するプログラムを提出します。防御トラックに提出された画像分類器をどれだけ騙せるかが得点になります。具体的には、防御トラックに提出された全画像分類器に対するエラー率の平均がスコアになります。できるだけ強い adversarial example を作る手法を開発することが目的になります。
画像を入力として受け取り、分類結果を出力するプログラムを提出します。攻撃トラックに提出された全攻撃プログラムが生成した全画像に対する精度の平均がスコアになります。できるだけ adversarial example に騙されにくい画像分類器を作ることが目的になります。
画像は複数用意されています。また、攻撃トラックのプログラムには実行時にパラメータ ε が渡され、ノイズの大きさは ε までにしなければなりません。具体的には、画像の各ピクセルの各 R, G, B の値を ε まで変更することが許されます。別の言い方をすると、ノイズの L∞ ノルムを ε 以下にする必要があります。攻撃トラックは non-targeted と targeted の 2 部門に分かれていますが、本記事では我々が参加した non-targeted 部門についてのみ紹介しています。詳しくは以下のコンテストの公式ページ [4, 5, 6] をご覧ください。
我々は攻撃トラックに参加しました。まずは、標準的な adversarial example の作り方について説明します。最も有名な手法である FGSM (fast gradient sign method) [2] をはじめとする既存のほとんど全てのアプローチは、大まかに以下を行います。
このステップを 1 度だけ行うか繰り返すか。誤差逆伝播に用いるロス関数をどのように定義するか。勾配をどのように用いて画像を更新するか。こういった部分が工夫され、強い adversarial example を生成する手法が開発されてきました。今回のコンテストでも、攻撃トラックに参加したほとんどのチームはこういったアプローチを用いました。
我々は現在主流となっている上述のアプローチと大きく異なる、「adversarial example を直接生成するニューラルネットワークを作る」というアプローチを取りました。
攻撃を行う際の処理は、ニューラルネットワークに画像を入れるだけです。出力された画像がそのまま adversarial example となります。
このアプローチでのキモは、当然、このニューラルネットワークをどのように作るかという点になります。以下、我々が作る adversarial example を出力するニューラルネットワークを「攻撃ネットワーク」と呼びます。以下を 1 イテレーションとして、これを繰り返すことによって攻撃ネットワークを学習しました。
攻撃ネットワークのアーキテクチャとしては fully convolutional なものを設計し用いました。なお、これと類似したアプローチは以下の論文 [7] で提案されています。
より強い adversarial example を生成するために、攻撃ネットワークのアーキテクチャや学習方法の工夫を試み、multi-target training, multi-task training, gradient hint などのテクニックを開発しました。詳しくは論文をご覧ください。
学習に非常に時間がかかってしまう点を解決し、攻撃ネットワークのアーキテクチャをより大規模にするため、ChainerMN [8] を用いて 128 GPUでの分散学習を行いました。特に、攻撃ネットワークの方が分類ネットワークよりも大規模なため GPU メモリの都合上バッチサイズを小さくしなければいけない点、上述の multi-target training により分類ネットワークはワーカー毎に異なるものを用いている点などを考慮し、標準的なデータ並列に加えて、ChainerMN の最新機能であるモデル並列機能を組み合わせて用い、効果的な並列化を実現しました。
我々のアプローチでは、手法だけでなく、生成された adversarial example も非常に個性的なものになりました。
左列が元画像、真ん中の列が生成された adversarial example、右の列が生成されたノイズ(元画像と adversarial example の差)です。以下の 2 つの特徴が見て取れます。
この 2 つの特徴により、多くの画像分類器はこの adversarial example をジグゾーパズルとして分類してしまうようです。興味深いのが、我々は特にこのようなジグゾーパズル風の画像を生成するように学習を行ったわけではないという点です。画像分類器を騙す画像を作るという目的関数のもと攻撃ネットワークの学習を行ったところ、攻撃ネットワークが自動的にこのようなジグゾーパズル風の画像を生成することが効果的であると学習したことになります。
我々の最終順位は約 100 チーム中 4 位となりました。優勝を目指し取り組んでいただけあり非常に残念ではありますが、4 位までが入賞とされ、NIPS’17 のワークショップに招待され発表を行いました。