AIを欺く、敵対的画像生成

2020.03.16

Lab研究員 北山

もくじ

  1. 1.敵対的画像生成
  2. 2.因果と偽相関
  3. 3.母集団
  4. 4.敵対的画像生成
  5. 5.計算グラフ
  6. 6.逆伝播
  7. 7.騙し画像を生成
  8. 8.間違いを正した画像を生成
  9. 9.もっともらしい画像を生成
  10. 10.識別モデルの限界?

敵対的画像生成

Lab_202003_1.png

画像(左)にノイズのようなわずかな摂動(中)を加えると、人間にはパンダにしか見ないのにAIはテナガザルと間違える画像(右)を生成することができます。
敵対的とありますが GAN, Genera tive Adversarial Networks ではありません。関係する話ではありますが。今回の主題は Adversarial Examples です↓
でもその前に、前号で「AIはどこを見ているのか?」という話題をお送りしましたが、正解率を上げるためにはどうすればいいのかということに何も触れずに終わってしまったのでそこから始めます。

因果と偽相関

Lab_202003_2.png

↑前号記事より

AIはどこを見ているのかということは因果や偽相関と関係します。
例えば被写体にシリアルナンバーが刻印されているとします。不良品の全てのシリアルナンバーには偶然 ”A" という文字が含まれています。でも、良品のシリアルナンバーには一切 ”A" が含まれません。

この場合、"A" という文字の有無で良品と不良品を識別できてしまいます。おそらくAIも "A" に注目するでしょう。このモデルを本番で使用したら、見当はずれな予測を連発し使い物になりません。
"A" という文字と良品/不良品には何の因果関係もありません。
AIが注目した文字 "A" は偽相関です。

これまでのPoCで何度かこれと似た状況が確認されています。AIがどこを見ているのかが分かれば、文字 ”A" を見ていることを知ることができます。

基本的な対策は、人間が補助(見てほしくない場所をマスクするなど)するか、とにかくサンプル数を多くし偶然の要素をできるだけ排除することです。数万枚、数十万枚というオーダーでも多すぎるということはありません。数十万枚でも多すぎることはないという理由は以降であきらかになります。

母集団

沢山画像があると少なからず教師ラベルの付け間違いが起こります。ラベルを付け間違えるとAIの性能が低下します。何故、人はラベルを付け間違えるのでしょう。うっかりミスもあるかもしれませんが、間違えやすいということは識別が難しいということです。
自動車とパンダのように違いが明確なら滅多に間違えないでしょう。でも、製造業の画像は、これまでのPoCの経験からも違いが分かりにくい画像が多いです。
製造業では「規格外」と言われるように、規定を超えるものが不良とされることがよくあります。例えば欠陥の大きさがある一定のサイズ以上だと不良など。このため規格付近は違いが不明瞭になりがちです。

機械学習の分類は複数の母集団を想定していることが多いですが

Lab_202003_3.png

規格内、規格外で良否を判定する場合、母集団は1つと考えらます。

Lab_202003_4.png

であれば果たして複数の母集団を前提としたモデルで十分でしょうか。識別境界付近ではほぼ同じ画像なのに一方は良品、他方は不良とラベリングされます。
逆に、全く様相が異なる欠陥に同じラベルが付与されていることもありえます。あるいは微妙なサイズの違いをAIは識別できるでしょうか。製造業に特化するのであれば、このあたりも掘り下げる必要がありそうです。

敵対的画像生成

本題です。

AIを騙す画像をどうやって生成するか、そのヒントは前号で紹介した Guided Backprop にあります。
Guided Backprop は誤差逆伝播で重み w ではなく画像 x の修正量(損失の勾配)を求めました

この仕組みを利用し、ニューラルネットワークの学習時に重み w を固定し、画像 x を更新すれば、画像 x を最適化することができます。
例えば数字の4の画像の教師ラベルを6にして学習すると、見た目は4なのに6と間違える画像を生成できます。

言葉で書くと簡単ですが、そのような計算を行うプログラムを一から書くのは大変です。そこで Chainerなどのディープラーニング・フレームワークの出番です。

ディープラーニング・フレームワークの中核機能は計算グラフです。
計算グラフを利用すればこのような機能を容易に実現することができます。

計算グラフ

計算グラフを簡単に紹介します。
興味がない人は読み飛ばしてください。
例えば、次の計算の手順を

Lab_202003_6.png

図で表すと次のようになります。
matmul は行列の積です。ここではベクトルの内積を求めています。

Lab_202003_6_2.png

計算で求めた結果から次の計算を行うことはよくあります。
上で求めた y を用いて次の計算を行うとします。

Lab_202003_7.png

このとき計算手順は次のようになります。

Lab_202003_8.png

このように計算過程をグラフとして表すことができ、ディープラーニング・フレームワークは計算グラフに従って演算を行います。
計算グラフがあると学習時に必要な勾配を求めやすくなります。

逆伝播

重み w や画像 x について最後の p の勾配を求めるとき、次のように式展開すると出力値 p から上で計算した順を逆にたどりながら勾配を求めることができます。

Lab_202003_9.png

ここで

Lab_202003_10.png

勾配を求める計算手順を図で表すと次のようになります。
入力値から出力値を求める順伝播(上段)に対し、勾配は出力値から入力へ向かって計算します。これを逆伝播(下段)といいます。

Lab_202003_11.png

多層ニューラルネットワークはこの仕組みを用いて学習しています。
ややこしそうですが、1つ1つ丁寧に見ていくと理解してもらえると思います。

騙し画像を生成

AIが騙される画像を生成します。
手書き数字のデータセットMNISTで試した結果がこちら↓
左がオリジナル、右が生成した画像です。

Lab_202003_12.png

数字の4ですが、AIは97%の確信度で数字の6と間違えています。

間違いを正した画像を生成

騙し画像とは反対に、AIが判定を間違えた画像から正しく判定される画像を生成することもできます。オリジナル画像と生成画像を比較すればAIが判定を間違えた理由が分かるかもしれません。試した結果がこちら↓
左がオリジナル、右が生成した画像です。

AIはオリジナルを 99.9%の確信度で数字の6と誤判定しました。
生成画像では99.7%の確信度で数字の4と判定しています。

Lab_202003_13.png

ほとんど違いが分かりません。。

もっともらしい画像を生成

何もない真っ黒な画像を入力し、数字の6と判定される画像を生成すると、どうなるでしょうか。理想の6ができるかもしれません。
試した結果がこちら↓
左がオリジナル、右が生成した画像です。

Lab_202003_14.png

もはや数字ですらありません・・・
AIはこんな画像を100%の確信度で数字の6だと言ってます。

識別モデルの限界?

わずかな摂動でAIが誤判定する理由は、重み w のパラメータ空間が広すぎることにあります。識別モデルはとにかく識別境界さえ引ければよいという学習を行っているため、学習サンプルに存在しないパラメータ空間の隙をつかれるといとも簡単に騙されます。この問題を緩和するためには膨大な学習サンプを用いたり、データ拡張で人工的にデータを増量します。パラメータ空間は広大なので、どれだけデータを増やしても多すぎるということはありません。

次回はこの敵対的画像生成をAIの性能向上に利用できないかを考えます。

参考文献
Explaining and Harnessing Adversarial Examples

  • LINE
  • Mail