# 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 函數