# AI 的問題
如果直接的使用 AI,可能會出現一些問題,因為近期的 AI 規模越來越大,複雜度隨之上升,同樣的也就更難去理解 AI,也更難找到 blind-spot。
所以使用 AI 時不只要考慮他的功用,同時也要考慮像是安全等等面向。
## 什麼時候需要考慮到安全
很多時候其實都要,最經典的例子就是自駕車。
>老師提到,MUSK 覺得用光達很愚蠢,所以就採用純 vision 的sensor
>原本老師在博士班時為此賭氣不買他的股票,現在他錯了
# ML 什麼時候失效
雖然 ML 在各個領域都超越了人類,但是這些情況大多是在「well-controlled」的環境下所達成。
## 訓練資料跟測試資料不一樣
ML 在現實生活中往往會失效,原因是因為訓練資料跟實際遇到的資料往往有誤差或甚至不一樣,可能情況有三種:
- Adversarial attacks
- 壞人把 nois 跟 worst case 做最佳化
- Domain Shift
- out of domain generalization
- 出現了跟訓練資料同種但有點特別的情形
- 例如訓練貓咪圖片,但是測試時出現了稀有少見的貓,或是訓練時沒出現的貓
- Unseen Data
- out of domain detection
- 例如訓練貓,但是測試給孔雀
# Adversarial attacks
壞人可以對訓練資料跟測試資料做手腳:
- 對訓練資料:Data Poisoning / Causitive attack
- 把你的訓練資料加點料,讓模型偏離原本的用途
- 你可能會想壞人要怎麼對訓練資料動手腳?
- 經典例子是,微軟曾在 Twitter 推出聊天機器人 Tay
- 網友可以教他,所以 Tay 就被教成種族歧視分子了
- 令一個例子是 Backdoor Attack
- 當你沒有資源訓練模型時,有些公司會提供幫你訓練的服務
- 但是他就有可能在訓練時對你的資料動手腳
- 例如 STOP sign 下面多貼一張小黃紙,就會變速限標誌
- 對測試資料:Adversarial Examples / (Evasion Attack or Exploratory Attack)
- 找到模型的 blind-spot,是今天要介紹的主題
- 壞人會根據模型的一些資訊,製造出 adversarial noise,使模型把變釋出熊貓變成長臂猿
- 或是 stop sign 變成最大時速 100 的標誌
- 雖然在某些情況,這種 digital attack 不容易達成
- 例如自駕車的辨識系統,前提是你可以駭進自駕車系統
- 所以另一種方式就是直接對現實物體動手腳
- 例如人臉辨識系統,然後你戴上特殊眼鏡
:::warning
Adversarial attack 所加上的 noise,通常來說都是肉眼難以分辨的。
:::
:::info
上面有兩種名字的原因是,一個是 ML 領域的名稱,一個是安全領域的人在叫的。
Evasion Attack 直翻叫做逃脫攻擊,來源是以前開發病毒的人,為了躲過防毒軟體時用的名稱
:::
下面介紹對各種模型的 Adversarial Attack。
## Object Detector
上面提到的大多都是騙過「Image Classifier」,但同樣的手段卻不容易對「Object Detector」有影響,例如 Fast R CNN 或 YOLO,可見其 Robust 程度。
但是老師的研究最終還是可以透過其他花紋成功騙過物件偵測模型,方法是透過「ShapeShifter」。
## Image Captioning
對一張圖片產生描述的模型。
一樣可以讓他把 STOP sign 描述成泰迪熊。
## Image Segmentation
把圖片分成你想要的區塊。
一樣可以讓他從道路車景中截出一個小小兵。
## Generative Models
例如 Autoencoder,原本可以拿來把圖片壓縮後,傳給他人再解碼,減少傳輸體積。
但是如果對壓縮的 source 圖片加 noise 再 encode,decode 出來就可能會不如預期,例如很多人臉變成都同一張人臉。
## Text 方面
例如做假新聞的偵測,只要把當中一些詞「換句話說」,他就可以從 100% 假新聞變成 77% 真的新聞。
## 語音辨識 & Malware 辨識
加入些微無法分辨的噪音,讓模型聽錯你講的話。
把有害軟體加一些內容,一樣可以逃過辨識。
## Medical Data
一樣對心電圖加點擾動,可能對醫生來說沒有差異,但是對模型就可以導致誤判。
## 3D (Points) Cloud
3D (Points) Cloud 是透過光學感側器,將物體以三維空間的許多個點表示,呈現出物體的輪廓跟樣子。
但是你可以透過把點做點偏移,或是加一些點,就讓辨識結果不同。
## Reinforcement Learning
例如兩個 Agent 原本在玩攻防遊戲,攻擊方跑到防守方後面的紅線後。
訓練好後,如果讓防守方自己以某種特別的方式摔倒,攻擊方也會自己跌倒。
所以或許你可以下一些奇怪的棋路,讓 Alpha Go 混亂。
>老師說這比較難,因為 Alpha Go 還有搭配 Search 等等更複雜的結構
## Adversarial Reprogramming
你可以把原本一個圖片辨識的模型,變成一個「數格子」的模型。
該論文就是在 Noise 中間留個區塊,裡面可以放有不同格子數的圖片,然後模型就會說該圖片是哪種圖片,例如虎鯊或是金魚。
每種種類對應到幾個格子,像虎鯊對應到 4 個格子;如果你給他辨識中間放 4 個格子的圖片,模型就會告訴你這是虎鯊。
:::info
也就是你可以改變原本模型的功能,讓他做其他的事情
:::
---
:::warning
其實 Adversarial Attack 可以當作是某種 Worst Case Analysis,看看你的模型能不能扛過這種最極端的 noise。
:::
---
# Adversarial for Good
其實 Adversarial Attack 還可以有好的應用。
## Protecting Stealing Art Style
把畫家的畫加上些 noise,防範那些「學習繪圖風格」的模型。
## Protecting CAPTCHA
將圖片加上 noise,以防 CAPTCHA 被突破。
老師的實驗室有在做的語音 CAPTCHA 的保護。
---
# Create Adversarial Examples
在講如何製造前,先講 「Threat Model」。
跟安全有關的論文都會有一個章節介紹 「Threat Model」。
## Threat Model
介紹情境,Attacker 是誰,有什麼目的跟動機,還有能力跟計算資源,對你的系統有多少了解。
## White-box attacks
攻擊者知道你全部的東西:
- 模型架構、權重
- 預處理跟後處理
- 甚至你的防禦機制都知道
這是一般做防禦時會採用的設定,因為要從最糟的情況下驗證 Robust 程度。
## Black-box attacks
攻擊者只知道「少部分的資訊」:
- 用到哪些演算法、特徵
- 模型架構、權重等等
這是一般做攻擊時會採用的設定,畢竟攻擊時不一定知道全部的資訊。
相比白箱,黑箱的 spectrum 比較多元,因為各 paper 可能 attacker 知道的訊息都不一樣。
:::info
還有 gray-box,知道一部分的資訊。
:::
## Transferability
在 DNN 中,如果拿攻擊 A 模型的 noise,去攻擊 B 模型,通常也可以得到不錯的效果,有一個原因是 DNN 模型之間的架構具有相似度。
如果換成是 ML,也多少具有這樣的特性。
## Transfer attack
基於 Transferability,壞人就可以自己 train model,自己根據該 model 做白箱攻擊,然後就可以來攻擊其他類似的模型了。
:::warning
轉移率可能不高,但是還是有方法可以提高轉移率
:::
---
# Formal Problem Definition
概念上來說,就是 task decision boundary 跟 Model decision boundary 之間有誤差。
所以你可以想辦法把靠近 boundary 的資料「推一點點」,讓他雖然依舊處於原本的 task decision boundary,但是卻跨過了 Model decision boundary,導致模型失誤。
:::info
給一個 Classifier $C$ 跟一個 example $x$,找到一個 adversarial example $x'$,使得 $d(x',x)\le \epsilon$,且 $C(x')\ne C(x)$
:::
$d$ 這個距離函數是 application dependent,例如圖片辨識通常會是 $l_p$ norm,文字的話就是語義接近。
數學上為了方便都會使用下面這種 $l_p$ base 的 norm:
$$
||\mathbf{x}-\mathbf{x'}||_p=\left(\sum_{i=1}^{N}|x_i-x_i'|^p\right)^{\frac{1}{p}}
$$
常聽到的例如 L1 norm、L2 norm。
雖然如果要更精確的話,就要自己設計或使用其他的 distance function。
>原來這叫做 $l_p$ base 的 norm
:::warning
如果 $p\rightarrow \infty$,會得到:
$$
||\delta||_{\infty}=\max{|\delta_i|},\ \ i=1,...,N
$$
:::
## Rewrite Problem Definition
跟導數的定義一樣,可以有另一種寫法:
:::info
給一個 Classifier $C$ 跟一個 example $x$,找到一個 adversarial perturbation $\delta$,使得 $||\delta||_p\le \epsilon$,且 $C(x+\delta)\ne C(x)$
:::
距離函數 $d$ 跟上面一樣用 $l_p$:
$$
||\boldsymbol{\delta}||_p=\left(\sum_{i=1}^{N}|\delta_i|^p\right)^{\frac{1}{p}}
$$
- $p=0$:控制 pixels 可以被更改的數量
- $p=1$:控制 pixels 可以更改的量
- $p=2$:控制 pixels 更改量的歐式距離
- $p=\infty$:控制 pixel 最大可以更改的量
:::danger
可能要去查一下這個 p=0 的酷東西
FAST RNN YOLO 等等
:::
## Targeted Attack
比較像是分類時的例子,就是讓分類結果跟原本不同,變成目標的種類:
:::info
給一個 Classifier $C$ 跟一個 example $x$,找到一個 adversarial perturbation $\delta$,使得 $||\delta||_p\le \epsilon$,且 $C(x+\delta)=y'\ne C(x)$
$y'$ 是目標 class。
:::
## Gradient Descent
對於 DNN 模型,在訓練時大多都是對可微的 loss 函數,做 SGD 找到最好的方向去更新權重 $\color{blue}{\boldsymbol{\theta}}$。
$$
\min_{\color{blue}{\boldsymbol{\theta}}}\sum_{\mathbf{x},y\in S}l(\mathbf{x},y;\color{blue}{\boldsymbol{\theta}})
$$
可以發現換成上面的 $\color{red}{\boldsymbol{\delta}}$ 也很簡單,一樣是透過 SGD 找到一個最佳的方向去更新 $\color{red}{\boldsymbol{\delta}}$:
$$
\begin{align}
\text{(untargeted)}&\ \max_{\color{red}{\boldsymbol{\delta}}\in\boldsymbol{\Delta}}l(\mathbf{x}+\color{red}{\boldsymbol{\delta}},y;\boldsymbol{\theta})\\
\text{(targeted)}&\ \max_{\color{red}{\boldsymbol{\delta}}\in\boldsymbol{\Delta}}-l(\mathbf{x}+\color{red}{\boldsymbol{\delta}},y';\boldsymbol{\theta})\\
\end{align}
$$
也就是固定 $\boldsymbol{\theta}$,改成最佳化 $\color{red}{\boldsymbol{\delta}}$。
>[可以複習反向傳播](https://hackmd.io/H3gyQHeHQz-RTTkx-9cuig?view#%E9%80%A3%E9%8E%96%E7%8E%87)
$\boldsymbol{\Delta}$ 是你 $\color{red}{\boldsymbol{\delta}}$ 的範圍。 untargeted 就是拉大差距,targeted 就是縮小跟目標的差距,。
:::warning
可以發現 DNN 模型因為具有反向傳播這種很好算的算法,同樣的也導致他很好被 Attack;反之對於例如隨機森林這種 ML 方法,就不容易 Attack。
:::
# Fast Gradient Method
雖然整體 Neural Network 是非線性,但是今天如果是對很小的 $\color{red}{\boldsymbol{\delta}}$,在局部上就可以近似為線性,因此就可以使用一階泰勒展開,把問題轉換為:
$$
l(\mathbf{x}+\color{red}{\boldsymbol{\delta}},y;\boldsymbol{\theta})\approx l(\mathbf{x},y;\boldsymbol{\theta})+\color{red}{\boldsymbol{\delta}}\cdot \boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})
$$
## L2
如果是 L2 norm 的話,問題就是:
$$
\begin{align}
\text{Maximize:}&l(\mathbf{x},y;\boldsymbol{\theta})+\color{red}{\boldsymbol{\delta}}\cdot \boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})\\
\text{Subject to:}&||\color{red}{\boldsymbol{\delta}}||_2 \le \epsilon\\
\end{align}
$$
之前在做梯度下降時,有說下降最快的方向就是跟梯度「反方向」,下降最快;但是到了這裡,我們為了要差距越大,所以就是跟梯度「同方向」:
$$
\color{red}{\boldsymbol{\delta}}=\epsilon \cdot \frac{\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})}{|| \boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta}) ||_2}
$$
## L$\infty$ / aka Fast Gradient Sign Method (FGSM)
如果今天是:
$$
\begin{align}
\text{Subject to:}||\color{red}{\boldsymbol{\delta}}||_{\infty} \le \epsilon\\
\end{align}
$$
回顧上面:
$$
||\delta||_{\infty}=\max{|\delta_i|},\ \ i=1,...,N
$$
所以就是要讓 $\color{red}{\boldsymbol{\delta}}$ 的每個分量都是 $\epsilon$,但是 $\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})$ 中有些分量可能是正號有些是負號,因此我們必須讓 $\color{red}{\boldsymbol{\delta}}$ 的每個分量跟$\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})$ 每個分量同號:
$$
\color{red}{\boldsymbol{\delta}}=\epsilon\cdot\text{sign}\left(\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})\right)
$$
## L1
如果今天是:
$$
\begin{align}
\text{Subject to:}||\color{red}{\boldsymbol{\delta}}||_{1} \le \epsilon\\
\end{align}
$$
那麼就會是從 $\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})$ 中,走分量最大的那個:
$$
\begin{align}
i^*=&\text{argmax}_i|\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})_i|\\
\delta=&\left\{\begin{matrix}
\epsilon \cdot \text{sign}(\boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta})_i) & i=i^*\\
0 & \text{otherwise}
\end{matrix}\right.
\end{align}
$$
由於一次只更動一個值,以圖片來說就是一個 pixel;所以你可以做很多 iteration 來改動一些 pixels
## 線性模型也很脆弱
不要以為 DNN 是因為其非線性的特性讓他脆弱,容易有 blind spot,其實線性模型也可以很脆弱:
$$
\mathbf{w}^T\mathbf{x'}=\mathbf{w}^T\mathbf{x}+\color{red}{\mathbf{w}^T\boldsymbol{\delta}}
$$
例如單純的 binary clssification,雖然 $\color{red}{\boldsymbol{\delta}}$ 很小,但如果是使用 $L_{\infty}$,其對整體分數的影響會是 $\color{red}{\epsilon\cdot ||\mathbf{w}||_1}$,維度越高影響就越大,也就越脆弱。
另外,其實現今的眾多 DNN 模型中,也具有局部線性的特性,也是其容易售攻擊的原因。
>例如 ReLU、Sigmoid 等等 Activation function
:::warning
可以看出其根本的原因是 ML 算法判斷時是透過「分數」,跟人類有所不同,也因而導致其脆弱性。
:::
大多的攻擊其實非常類似,只有以下不同:
- Loss Function
- 甚至可以對 Loss Function 做 optimization,提高 Transferability
- Constraints
- 例如上面就是有不同的 $p$ 值
- Optimization Algorithm
- 例如上面大多都是 GD,但也有可能是使用海森矩陣等等
## Projected Gradient Descent / PGD
大致上就是跑很多次 FGM:
$$
\mathbf{x}^{t+1}=\text{clip}(\mathbf{x}^{t}+\alpha\cdot \boldsymbol{\nabla}_{\mathbf{x}} l(\mathbf{x},y;\boldsymbol{\theta}),[-\epsilon,\epsilon])
$$
但是會去限制 $\boldsymbol{\delta}$ 在一個 $\Delta$ 範圍內,如果超過的話就把他投射到範圍內的另外一邊。
>那個 $\Delta$ 範圍又叫做 $\epsilon$-ball
此外也會從 $\epsilon$-ball 內隨機挑選某一點,作為下一次 iteration 的起始點
:::info
這是目前被認為最強只需要一階微分的攻擊
:::
:::danger
該來去研究那個投射函數 clip 了。
:::
## Carlini Wagner Attack
$$
\begin{align}
\text{minimize:}&||\delta||_p+c\cdot f(x+\delta)\\
\text{s.t.:}&x+\delta\in[0,1]^n
\end{align}
$$
當中的 $f$ 是一個 loss,是採用類似 hinge loss 的東西:
$$
f(x')=\max\left(\max(Z(x')_i:i\ne t)-Z(x')_t,-\kappa\right)
$$
$c$ 是採用 binary search 的方式去搜尋,亦開始會先從很小的 $c$ 去找,如果發現不符合 s.t. 的內容,就會增加 $c$ 的值,反覆恆跳。
:::info
但是比上面的 PGM 慢。
:::
## One / Few Pixels Attack
找到最佳 pixel 的方式不一樣,是用 evolution algorithm。
## Universal Adversarial Perturbation
就是一個 noise 可以攻擊到全部 input。
例如用於影片的物體辨識。
## Fooling Images
使用基因演算法 Evolution Algorithm,去更新 Composition貓Pattern Producing Networks (CPPN),產生出一些可以被分錯類別的圖。
## Zeroth Order Optimization
黑盒攻擊的另一種,就是去近似出梯度,根據微積分告訴我們:
$$
\frac{\partial f(\mathbf{x})}{\partial \mathbf{x_i}}\approx\frac{f(\mathbf{x}+h\mathbf{e_i})-f(\mathbf{x}-h\mathbf{e_i})}{2h}
$$
## Adversarial Attack Against Human Vision
這篇 paper 他把很多模型做 ensemble,然後最終發現可以成功攻擊所有模型的圖片,其實連人類也都騙到了。
但這通常不是所希望的,通常希望是微小的改變讓人類不容易分辨出來。
---
# 趨勢
現在在 Classifier 的攻擊方,比較多在研究的是 Transferability,因為目前的攻擊方是比防守方厲害得,所以才會著重看能不能從白箱測試研發出的攻擊轉移到其他 model 上面。
---
# 挖坑
:::danger
以下為挖坑地區
:::
- 可以去稍微了解 Fast R CNN 跟 YOLO
- 可以自己推推看 $l_p$ 的 $p=0$ 情況
- 去聊解 PGD 的 clip 函數