什么是對(duì)抗樣本
Adversarial Examples(對(duì)抗樣本):對(duì)輸入樣本故意添加一些人無(wú)法察覺(jué)的細(xì)微的干擾,導(dǎo)致模型以高置信度給出一個(gè)錯(cuò)誤的輸出。對(duì)抗樣本與對(duì)抗學(xué)習(xí)(GAN)不同。

對(duì)抗性樣本的存在是因?yàn)閿?shù)據(jù)維度通常過(guò)高,即使考慮所在的子區(qū)域,往往還是過(guò)高,對(duì)整個(gè)(數(shù)據(jù)分布的)空間的的手術(shù)是不可行的,在訓(xùn)練樣本沒(méi)有覆蓋的區(qū)域,無(wú)論該區(qū)域示范屬于數(shù)據(jù)分布所在的區(qū)域,無(wú)論模型強(qiáng)不強(qiáng),都有出現(xiàn)對(duì)抗性樣本的可能。
如何產(chǎn)生對(duì)抗樣本
我們通過(guò)什么樣的方式欺騙卷積網(wǎng)絡(luò)讓它錯(cuò)誤識(shí)別一張圖?例如,把一艘船識(shí)別成一架飛機(jī)?;谌四X的理解,我們可能會(huì)認(rèn)為背景變藍(lán),船長(zhǎng)出機(jī)翼,從而用藍(lán)天或者機(jī)翼來(lái)判別這是一架飛機(jī)。但事實(shí)并非如此。
我們是通過(guò)梯度下降和反向傳播找到能夠欺騙CNN的圖像,找到了對(duì)抗樣本。一般就肉眼是看不到和原圖像的區(qū)別的。簡(jiǎn)單來(lái)說(shuō),保持輸入圖像不變,對(duì)圖片的每個(gè)像素值計(jì)算梯度并更新,區(qū)別于訓(xùn)練分類器時(shí),通過(guò)反向傳播更新模型參數(shù)來(lái)提高對(duì)目標(biāo)標(biāo)簽的分?jǐn)?shù)。也就是說(shuō),用一張船的圖片,只要往以標(biāo)簽為飛機(jī)的梯度方向更新圖像,這只會(huì)稍稍改變圖像,但CNN將其分類為飛機(jī)的概率就顯著提高了。
為什么對(duì)抗樣本會(huì)產(chǎn)生
對(duì)抗樣本是輸入特征維度過(guò)高和模型的線性性質(zhì)導(dǎo)致的,不是過(guò)擬合的結(jié)果。
如果是過(guò)擬合,那么每個(gè)對(duì)抗樣本的出現(xiàn)是偶然的運(yùn)氣不好,并且用不同的模型重新擬合時(shí),應(yīng)該會(huì)看到模型在訓(xùn)練集之外犯不同的錯(cuò)誤。但實(shí)際上,研究人員發(fā)現(xiàn)許多不同的模型對(duì)同一個(gè)對(duì)抗樣本會(huì)犯同樣的錯(cuò)誤。所以不是過(guò)擬合。
其實(shí),產(chǎn)生對(duì)抗樣本的合理解釋是欠擬合,輸入空間維度過(guò)高,模型過(guò)于線性的結(jié)果。進(jìn)一步來(lái)說(shuō),在高維空間,每個(gè)像素值只需要非常小的改變,這些改變會(huì)通過(guò)和線性模型的參數(shù)進(jìn)行點(diǎn)乘累計(jì)造成很明顯的變化。而圖片通常都有極高的維度,所以不需要擔(dān)心維度不夠。也就是說(shuō),只要方向正確,圖像只要邁一小步,而在特征空間上是一大步,就能大程度的跨越?jīng)Q策層。
有人會(huì)產(chǎn)生疑問(wèn),深度學(xué)習(xí)的精髓不就是那些非線性激活函數(shù)嗎?為什么還會(huì)有線性欠擬合的困擾?這些非線性激活函數(shù)在一定程度上是線性的,如現(xiàn)在流行的relu,有一半是線性的,以前流行的sigmoid函數(shù)或者tanh函數(shù),都是希望輸入值落在中間接近線性的部分而不是兩邊斜率接近0的部分,防止梯度消失。還有深度模型,其組成部分都是線性的,全連接網(wǎng)絡(luò)的矩陣乘法是線性的,卷積網(wǎng)絡(luò)的卷積計(jì)算也是計(jì)算點(diǎn)乘,線性的,還有序列模型用到LSTM用的是最簡(jiǎn)單的加法,更是線性的。
對(duì)抗樣本的可移植性
研究者已經(jīng)嘗試過(guò)多種利用對(duì)抗樣本的攻擊,并發(fā)現(xiàn)可行。比如通過(guò)相似模型訓(xùn)練出的對(duì)抗樣本,可以讓亞馬遜或谷歌服務(wù)器提供的圖像識(shí)別服務(wù)出錯(cuò),一張對(duì)抗樣本經(jīng)過(guò)拍照,在由手機(jī)上的圖像分類對(duì)照片進(jìn)行分類也會(huì)出錯(cuò),而且產(chǎn)生這個(gè)對(duì)抗樣本的模型和手機(jī)上使用的模型是不同的。
對(duì)抗樣本的防御
目前,找到一個(gè)對(duì)抗樣本比設(shè)計(jì)一個(gè)能防御對(duì)抗樣本的模型要容易得多。
對(duì)抗訓(xùn)練
將對(duì)抗樣本和正常樣本一起訓(xùn)練,可以提高模型的準(zhǔn)確度,同時(shí)也能有效降低對(duì)抗樣本的攻擊成功率。不過(guò)這種防御只是針對(duì)同樣用來(lái)產(chǎn)生訓(xùn)練集中的對(duì)抗樣本的方法。
蒸餾
蒸餾是最先由Hinton提出的,通過(guò)訓(xùn)練一個(gè)模型來(lái)預(yù)測(cè)另一個(gè)訓(xùn)練好的模型輸出的概率的訓(xùn)練過(guò)程。防御性蒸餾只是想讓最終模型輸出結(jié)果更柔和一點(diǎn)。雖然這里的前后兩個(gè)模型結(jié)構(gòu)相同,第一個(gè)模型訓(xùn)練的是硬標(biāo)簽(比如狗的概率是1,貓的概率是0),而第二個(gè)模型訓(xùn)練的是軟標(biāo)簽(狗0.85,貓0.15),這樣后面的這個(gè)蒸餾模型對(duì)FGSM攻擊更具魯棒性。
隱藏梯度
構(gòu)造對(duì)抗樣本的方法一般都是用到模型的梯度,比如想要模型把飛機(jī)誤認(rèn)為是船,只需要將飛機(jī)的圖片往提高分類為船的概率的方向推一把就行。那是不是只要把模型的梯度藏起來(lái),攻擊者就往哪個(gè)方向推這個(gè)飛機(jī)了?設(shè)想用GoogleAPI得到對(duì)飛機(jī)的分類結(jié)果是99.9%飛機(jī),0.01%的船,那么攻擊者就知道,這個(gè)飛機(jī)的圖片比較容易被誤分為船,相當(dāng)于知道了梯度的方向,只需要在自己的模型上往船的方向生成對(duì)抗樣本就行了。把分類結(jié)果改成“飛機(jī)”,不給其他可能的類別就能讓模型更魯棒了呢。很遺憾,只要攻擊者自己訓(xùn)練一個(gè)能輸出各類概率的模型,用這個(gè)模型生成的對(duì)抗樣本通常能攻擊成功,這也叫黑盒攻擊。
其它防御方法將另外詳細(xì)總結(jié)。
對(duì)抗樣本之所以難以防御是因?yàn)楹茈y去對(duì)對(duì)抗樣本的生成過(guò)程建立一個(gè)理論模型。生成對(duì)抗樣本的優(yōu)化問(wèn)題是非線性而且非凸的,我們沒(méi)有掌握一個(gè)好的工具去描述這種復(fù)雜的優(yōu)化問(wèn)題的解,也就很難去想出理論上能解決對(duì)抗樣本的方法了。從另一個(gè)角度,現(xiàn)在的機(jī)器學(xué)習(xí)算法有效的范圍只在一個(gè)相對(duì)小的樣本空間中,對(duì)比于巨大的樣本空間全局,很難要求機(jī)器學(xué)習(xí)算法對(duì)空間中每個(gè)樣本都輸出好的結(jié)果。