ょゎょゎ学生によるAdversarial examplesの解説

# はじめに
はじめまして，松ノといいます．
毎年毎年，Qiita Advent Calendarに参加したいと思って参加していなかったので，今年こそはとTECHCAFE×TAIRのQiita Advent Calendar 2021に参加してみることにしました．

# Adversarial examplesとは？
Adversarial examples（AEs）とは，人間の目に見えない程に微小な摂動（ノイズ）を載せた画像です．その画像は，今流行りのConvolutional neural network（CNN）の判断を狂わせてしまうという，困った特徴を持っています．
以下の画像は，AEsを調べていると必ずと言って良い程見かける，Fast gradient sign method（FGSM）という摂動が乗せられたパンダの画像です．左の画像は元画像，右の画像は摂動が乗せられた画像です．私たち人間にはどちらもパンダに見えますが，CNNの1つであるGoogLeNetに入力すると，右の画像はテナガザルであると誤認識しています．
（えー，GoogLeNet？古くない？と思った貴方…そうです，FGSMは古いAdversarial attackの手法です．（[Explaining and Harnessing Adversarial Examples](https://arxiv.org/abs/1412.6572)）AEsという問題提起として出て来た頃の手法で単純なので，チュートリアルとして用いられることが多いのです．）
![adversarial_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2245134/0b9efba4-9d15-93a5-8265-989cf4bc4c57.png)
例えばもし，悪意を持った人間が20km/h制限の看板を摂動を用いて60km/h制限に書き換えたら自動運転車のモデルは誤認識をし，事故を起こしてしまうかもしれません．<br>
以上から，私たちはAEsを防御しなくてはなりません！
今までも多くの研究者が色々な種類のAEsに対する防御手法を提案しています．しかし，研究者によって新しいAdversarial attackが提案される，防御が限定的であるなど，完全なAEsに対する防御手法は2021年現在存在しません．
よって，私たちはより優れた防御手法を提案する必要があるのです．

…<br>
……<br>
………いや，CNNが賢くなれよ．どうしてパンダの画像をテナガザルと勘違いするんだよ．どう見てもパンダだろ．
貴方もそう思ったことでしょう．そこです，そこがミソなのです．<br>
実はAEsという分野は，CNNがとても流行っているけれど，CNNの中身ってよく分からないよね？ほら，こんなよく分からない勘違いするんだよ？みんなでCNNというブラックボックスを暴いていこうよ！という分野なのです．

# なぜCNNは摂動に弱いのか？
AEsやAEsに対する防御手法の根本はこれだと私は思っています．
これが分かって，防御出来ればAdversarial attackは怖くないですし，雨や雪，黄砂，火山灰が降る日の，天下一品の看板も怖くありません．<br>
[天下一品を「進入禁止」と誤認？　ホンダの安全運転支援システムめぐる噂が話題に→広報に真偽を尋ねると...](https://www.j-cast.com/2021/02/03404261.html?p=all)<br>
AEsは畳み込みを行うたびに少しずつ特徴マップを本来の物体の特徴マップからずらすため，誤認識を起こす原因と考えられています．（他にも原因があるかも知れませんが，論文調査が出来ていないためです．）
しかし，ほんの少しづつなので，なかなかいい防御手法が出てこないのです．

# Adversarial attackの種類
まず，Adversarial attackは大きく分けて，以下の3種類があります．
- White-box attack
- Gray-box attack
- Black-box attack
White-box attackは攻撃対象の内部情報（パラメータやアルゴリズム，学習データ）が分かる状態での攻撃手法であり，Black-box attackは攻撃対象の内部情報が一切分からない状態での攻撃手法です．Gray-box attackは攻撃対象の一部の内部情報が分かる状態での攻撃手法であり，Black-box attackの1つと分類されることも多いです．
私はBlack-box attackの手法には詳しくないので，White-box attackの手法のみ紹介します．
攻撃手法で有名なものとして，少し古いものでは以下の5つが挙げられます．
- [Fast gradient signed method（FGSM）](https://arxiv.org/abs/1412.6572)
- [Projected gradient descent（PGD）](https://arxiv.org/abs/1706.06083)
- [Carlini and Wagner attack（C&W）](https://arxiv.org/abs/1608.04644)
- [Deepfool](https://arxiv.org/abs/1511.04599)
- [Basic iterative method（BIM）attack](https://arxiv.org/abs/1607.02533)
どれも防御手法の評価によく使われている優秀な防御手法です．
ただ，最近はより高い精度で誤認識を起こすAdversarial attackが提案されています．
有名なものとして，PGDを改良した[Auto attack](https://arxiv.org/abs/2003.01690)が挙げられます．
他のWhite-box attackの手法やBlack-box attackの手法については，以下の論文に書かれています．<br>
[Adversarial Example Detection for DNN Models: A Review and Experimental Comparison](https://arxiv.org/abs/2105.00203)<br>

## Fast gradient signed method（FGSM）
FGSMのAEs $\tilde{x}$を，任意の定数$\epsilon$を用いて以下の式で定義します．
$$ \tilde{x} := x + \epsilon \cdot \textrm{sign} \left(\nabla_{x}L(x, y, \theta)\right)$$
ここで，$x$は入力データ，$y$は教師信号，$\theta$は重みパラメータ，$L(\cdot)$は誤差関数，signは符号関数です．
この式が何をしているのかというと，画像全体に**同じ強度で**摂動を乗せています．
下の図に示すような，$\epsilon$-ballという概念を使って説明します．
![イプシロンボール_FGSM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2245134/63be2581-498f-3d52-2306-d85bfe390cc5.png)
ここで，中心は元画像の認識結果，白色の部分は正解クラス，緑や橙の部分は不正解クラスです．
摂動である赤矢印によって不正解クラスに移動してしまうと誤認識を起こしてしまいます．
また，赤矢印は誤差関数，赤矢印の方向は重みパラメータを示します．
FGSMはこの赤矢印1本なので，微調整が出来ません．そのため，比較的弱い攻撃手法と言えます．

## Projected gradient descent（PGD）
PGDのAEs $x_{t+1}$を，以下の式で定義します．
$$x_{t+1}:=P(x_{t}+\alpha \cdot \nabla_{x_t} L(x_t, y, \theta ))$$
ここで，$x$は入力データ，$x_t$は$t$回更新した摂動を付与した画像，$y$は教師信号，$\theta$は重みパラメータ，$L(\cdot)$は誤差関数，$\alpha$はステップサイズ，$P(\cdot)$は領域内に投影する関数です．
PGDの$\epsilon$-ballを下の図に示します．
![イプシロンボール_PGD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2245134/0b57c64f-5f4e-1057-02c4-6fedd261d23f.png)
PGDはFGSMと違い何度も反復して摂動を求めるため，強い摂動を作成可能です．

しかしPGDは，重みパラメータの初期値をランダムに決定するので，AEsの性能にムラが出来ます．
そこで提案された攻撃手法がAuto attackです．

## Auto attack
PGDなどの攻撃手法はいろいろな防御手法の論文で評価に用いられるのですが，ハイパーパラメータの設定によっては良い指標にならないこともあります．そこで，一律に強い摂動が生成できる攻撃であるAuto attackが2020年に提案されました．
Auto attackによって改良されたPGDのAEs $x_{k+1}$を，以下の式で定義します．
$$z_{k+1}:=P(x_{k}+\eta_k \nabla_{x_k} L(x_k))$$
$$x_{k+1}:=P(x_{k}+\alpha \cdot (z_{k+1}-x_k)+(1-\alpha)\cdot (x_k-x_{k-1}))$$
上の式から分かるように，PGDの損失関数の部分を$z_{k+1}$としています．
つまりAuto attackとは，PGDにMomentumが追加された式であることが分かります．
Momentumとは，確率的勾配降下法（SGD）に移動平均を適用した最適化手法です．
Momentumにより，ハイパーパラメータの設定が不要となるため，一律に強い摂動が生成できます．

# おわりに
防御手法まで書きたかったのですが，12/14までに書き終わらなかったので，今度書くことにします．