Aidemy Tech Blog

機械学習・ディープラーニング関連技術の活用事例や実装方法をまとめる、株式会社アイデミーの技術ブログです。

不気味なロボットから考えるCNNの仕組みのおさらいとAIによる画像認識の攻防戦

こんにちは!今回ウィークリーニュースをまとめさせていただきます、たくやです!

今回はハロウィンも間近ということでこんなものを紹介したいと思います!

 

見てください、このなんともいえない不気味なロボット・・・。

f:id:meteoputi:20171019215839g:plain

夜、夢に出てきそうな不気味さがありますね・・・。

 

実はこれ、Creoqodeというところが作ったNOVAという自分で組み立てれる人工知能ロボットなんです!

 

f:id:meteoputi:20171019220135j:plain

このロボットを組み立てて、自分でプログラミングをすることにより、

コーディングや、電気やその他工学の概論を画像分析、画像処理、運動学、制御を含む様々な工学の概論を学ぶことができるそうです。

今は試作品段階のようですが、現在クラウドファンディングにて資金調達を行なっているようです。リリースされるのが楽しみですね。

f:id:meteoputi:20171019221906g:plain

f:id:meteoputi:20171019222422g:plain

 

このNOVA、車輪をつけて自分の後をついてくるようにしたり、(子供にそんなことしたら子供はギャン泣きしそうですが)、顔認識機能をつけたりと想像の及ぶ限り様々なことができるようなのですが、

この、画像認識、簡単に誤魔化すことができるのをご存知でしたか?

それが今回紹介させていただく撹乱画像(adversarial image)と呼ばれる手法です。

f:id:meteoputi:20171021061408p:plain

 http://karpathy.github.io/2015/03/30/breaking-convnets/

上の画像では57.7%の確率でパンダと判断された画像にちょっと手を加えることで、99.3%の確率でテナガザルだとAIに間違えて判断させることに成功しています。

私たち人間の目には二つの画像は同じもののように見えるのに、不思議ですね。

今回はそんな撹乱画像の仕組みをもう少し詳しく見ていきたいと思います。

■目次

CNNの仕組み                                                                                                                

AIを騙す?撹乱画像

撹乱画像の作り方とその防御

撹乱画像の脅威

 

通常、AIはディープラーニングを用いて、多くの画像からその動物の特徴を抽出し、それを元にして、画像に写っているのはその動物だ、ということを学習しています。

このとき、ディープラーニングで使われているのが

畳み込みニューラールネットワーク(CNN)と呼ばれる手法で、以前紹介させていただいたニューラルネットワークの進化版です。

ニューラルネットについて知りたい方は下記リンクをお読みください。

今話題のディープラーニングって一体なんなの? 文系から見た人工知能

 

■CNNの仕組み

CNN(Convolution Newral Network)は判断したいものの特徴に着目することで通常のニューラルネットワークと比べて重みの数が少なくてすみ、それによって計算も簡略化されるために、重宝されています。

このCNNは畳み込み層とプーリング層の二つの層をミルフィーユのように交互に重ね合わせた構造になっています。

まず、畳み込み層で、特徴を探していきます。

 

例えば "X"という文字を特定することを考えていきます。

X の特徴は

・右斜めに入った線

・二つの線がクロスしている部分

・左斜めに入った線

の三つが考えられます。

f:id:meteoputi:20171021065153p:plain

これらの特徴を探すために、今回は9×9の画像の中から3×3の一部に着目して、その特徴と合致するかを考えていきます。

左上から少しずつ3×3の枠をずらしていき、どれくらい特徴と合致していたかを数値化して再び出力していきます。

 

そうしてできた特徴マップをさらに抽象化するためにプーリングという処理を施していきます。

難しく聞こえますが、とても簡単で、今回はマックスプーリングというプーリング方法で2×2の枠の中の最大値を出力するという操作をまた、左上から枠を少しずつずらして繰り返していきます。

f:id:meteoputi:20171021070342p:plain

このようにして原画像がフィルタ処理され、プールされて、特徴がフィルタリングされた縮小画像のセットができあがります。

このセットを繰り返すことにより、さらに特徴を抽出していくことが可能となります。繰り返すごとに特徴はより大きくなり、画像はよりコンパクトになります。

もちろん、ディープラーニング(深層学習)という名前の中に”学習”という言葉が入っている通り、最初からうまく判断できるということはありません。

間違えを少しずつ修正しながらより良いモデルを生成していくのです。

では、この修正はどのように行うのでしょうか?

実はこの誤差を修正するために誤差逆伝播法と呼ばれる方法が用いられています。

先ほど説明したCNNは、入力から順番に計算していくので「順伝播」と呼ばれていて、誤差逆伝播法は誤差を出力層から逆に戻っていきます。

まず、適当な重みの値を設定して、学習データを入れて順伝播します。

そして、出力層で出た値と、本来欲しかった出力値の誤差を求めます。

誤差逆伝播法では、この誤差を最小にするため勾配降下法という手法を用います。

簡単に言うと、誤差の勾配、すなわち関数の傾きがマイナスの方向に点を動かしていくことで、極小値を出そうっていう手法です。

 

畳み込みニューラルネットワークの仕組み | コンピュータサイエンス | POSTD

CNNの詳しい説明には上記のブログを参照させていただきました。

 

少々話が逸れすぎてしましたが、誤差をEとすると勾配はそれを微分した式

Δ = ∇E

となり、それこそが撹乱画像のキーになる言葉なのです。

                                                                                                           

■AIを騙す?撹乱画像

 

例えば、バナナ画像を撮り、猫クラスのその画像の勾配に従って各ピクセルを動かすと、AIはその画像を猫だと判断してしまいます。画像は微かに変更する必要がありますが、その分、猫のスコアは増加します。しかしながら、その変化もわずかなために私たちの目には画像が他のものに写ったりすることはないのです。

要するに、誤差逆伝播法のせいで、わずかに変更した特徴が大きく拡張されてしまい、

取り込むと誤認識を起こしてしまうような致命的で局所的な欠陥も計算に取り込んでしまうのです。

このことを利用すると意図的にAIに、犬を飛行機と判断するような面白い間違えを起こさせることができます。

f:id:meteoputi:20171021081417p:plain

 https://blog.openai.com/robust-adversarial-inputs/

現に上の写真では猫をデスクトップコンピュータと勘違いさせることに成功しています。

                                                                                  

■撹乱画像の作り方とその防御                         

ここからはさらに深く、撹乱画像の作り方とその防御について学んでいきます。

撹乱画像を含むこのような手法はAdversarial exampleと呼ばれることがあります。

元の画像の入力を x 、誤認識させたい画像への摂動を η とすると入力後の画像は
x~=x+η
と表されます。

 

*摂動とは 分類器を考えた時、自然画像が高い確率で誤分類される原因となる普遍的な(画像に依存しない)ベクトルの存在。

 

ここでは小さな摂動を考えるため、小さな値
を用いて

η<ϵとします。

ηの要素のうち一番大きなものでもϵより小さいという意味です。画像のピクセルごとに摂動を与える時に、どれもϵよりも小さい摂動を与えることになります。)

重み w との内積は

wTx~=wTx+wTηと表されます。

ではどのような摂動η を与えれば影響を大きくできるでしょうか。 

sign(w)

の方向に摂動を与えれば良さそうです。

なぜなら、ベクトルの内積を最大化することを考えれば良いためです。

 

*1      

*2 signとsgnは同じです。

 

内積がベクトルであることを考えれば方向を揃えることで、その効果が倍増するのはわかると思います。

<補足>

f:id:meteoputi:20171021230432p:plain

https://juken-mikata.net/how-to/mathematics/vector-inner-product.html

cosθのθを0に近づければ近づけるほど(a,bのベクトルの方向が同じになればなるほど)aとbのベクトルの内積が大きくなるのがわかると思います。

 

それではFast Gradient Sign Method (FGSM)と呼ばれる撹乱画像の攻撃手法がどのような摂動を与えるのか式で見てみましょう。

x~=x+ϵsign(xLoss(x,y))


y
x に対応するラベルです。損失を最大化する方向に入力 x を変化させるという意味の式になっています。

もう少し詳しく解説すると、コスト関数は最もシンプルな形では

(Y1-Y2)^2 - (X1-X2)^2で表されます。

これを微分したものは一次関数であり線形であり、かつそれは傾き(勾配)を表しています。その傾きをベクトルとみなしているということです。

コスト関数を最大化するためにsignを用いてベクトルの方向を揃えています。

しかしながら、これは正しいクラスに対する損失を増加させているだけなので、どのクラスに誤分類されるかは分かりません。

しかし、その方向性をあらかじめ計算し、その重みを元画像に掛け合わせることで、

事前に意図したものにAIが画像を誤認識するように仕向けられるのです。

感覚的にわかってもらうために下のような図を用意しました。

f:id:meteoputi:20171022050036p:plain

図の青や赤で書いてある線は分類器が猫か、それ以外かを判断するための境界線だと思ってください。ただこれは平坦な紙の上に書かれたものではありません。

実はこの表面はボコボコしているのです。この傾斜は画像の特徴で構成されており、ボールを転がしてみて、最終的にボールが止まったところがどこの領域かで、AIはそれが何かを判断します。

今、何もしていない状態の猫の画像を優秀なAIに読み込ませたとします。ボールは猫の領域内で止まり、もちろんAIは正しく猫を猫だと判断することができるでしょう。

しかし、ピクセルをちょこっといじった撹乱画像を読み込ませてみましょう。

もちろん、ちょっとした細工が施してあるため、AIは猫とは全然関係ない特徴を拾い上げてしまい、コロコロとボールは坂を赤や青の線の外へと転がっていきます。そしてとうとう、ボールは境界線をこえ、AIはとうとう画像を猫だと判断できなくなります。

今、AIに猫の画像を読み込ませ、犬と判断させたいとします。

簡単です。犬の特徴量をピクセルに加えて傾斜を犬の方向へ調節してあげれば良いのです。こうして、ボールは犬の領域まで転がっていき,AIは猫の画像を犬と判断してしまいます。

 

このような手法で元画像を変化させていくと、どんな風に画像が変化していくでしょうか。例えば車の画像であれば、ダチョウクラスに向かって変化させていくと車の画像が徐々にダチョウっぽく変化していくと予想する人が多いのではないでしょうか。

実際にはそうはなりません。人間には分からないレベルで僅かに変化するだけです。人間には元画像と全く同じように見えますが、モデルは高い確信度でダチョウだと分類するようになってしまいます。

なぜ、人間の目には車に見えるのに、機械の目にはダチョウに映るのでしょうか。

それは、何度かでてきた”ベクトル”という言葉にヒントがあります。

ベクトルの方向を全て揃えてあげることで、一つ一つは小さな値でも、チリも積もればの原理でその力は大きなものになるのです。

具体的に例をみてみましょう。

[-0.4, 0.5, -0.2, 0.4, -0,3, 0.6, -0.4, 0.1, -0.9, 0.7]

[-1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0]

という数列があったとします。

両者の内積を普通に取ってしまうと答えは0.3となってしまいますが

signを使って符号を揃えてあげることで答えは4.5となります。

その差はなんと 4.2 です!違いは一目瞭然ですね。

画像の認識では数列はさらに大きく、複雑なものになります。

signを使って符号を揃えるのと揃えないのでは全く違った結果になってくるのです。

 

 

実はこの撹乱画像、ディープラーニングに特有の問題だと誤解されている場合がありますが、そうではありません。線形性に原因があることを考えるとロジスティック回帰のような単純なモデルでも問題になります。

Adversarial exampleに対する防御方法の一つとして、下記のようにadversarial exampleもtraining setに含めて学習するという方法が考えられます。

αLoss(W,x,l)+(1α)Loss(W,x+ϵsign(∇xLoss(W,x,y))
事前に行われるであろう攻撃をあらかじめ、学習に組み込んで、その上で正しい答えを出せるようにトレーニングをさせるため、エラー値が下がるのは当然と言えます。

現に普通に学習するとadversarial exampleに対しエラー率が89.4%だったモデルで、上記のようにしてadversarial trainingを行うとエラー率が17.9%に下がったという報告もあるそうです。だいぶエラー率が下がりましたが、まだ2割近くもエラーがあります。また、FGSMによる攻撃はある程度防御できても、他の手法による攻撃には脆弱であると考えられます。このように様々な攻撃に対して有効な防御方法は少なくとも現時点では存在せず、更なる研究が求められています。

 

はじめてのAdversarial Example

この撹乱画像の防御では上記のサイトを大いに参照させていただきました。

Adversarial Example をさらに詳しく知りたい方はこちらを参照してみてください。

                                                                                  

■撹乱画像の脅威

では、この画像の誤認識がなぜ問題となってくるのでしょうか?

今まで私たちは画像認識精度を高めることに注力しすぎて、画像認識への攻撃からの防御の術を開発してきませんでした。

また、たちが悪いことに攻撃の方が防御よりもよっぽど簡単なのです。

将来、自動運転が実現され、車が標識を読み込む際に、その看板に細工がしてある、なんてことを考えるとこの問題はやはり、簡単に見過ごすことができる問題とは言えそうにありません。

 

参照

http://postd.cc/how-do-convolutional-neural-networks-work/

http://palloc.hateblo.jp/entry/2016/08/02/213847

https://www.kickstarter.com/projects/creoqode/nova-diy-artificial-intelligence-robot?lang=ja

https://www.digitaltrends.com/cool-tech/creepy-robot-mask-coding/#/4

http://karpathy.github.io/2015/03/30/breaking-convnets/

https://elix-tech.github.io/ja/2017/10/15/adversarial.html