下圖展示了一個有趣的現(xiàn)象:在法國斗牛犬的圖像上添加一小塊對抗性補(bǔ)丁后,VGG分類器竟然以極高的置信度將其判定為足球。Grad-CAM可視化清楚地顯示,模型的注意力完全從狗身上轉(zhuǎn)移到了那塊補(bǔ)丁——一個精心構(gòu)造的小擾動就足以劫持整個決策過程。
![]()
95%準(zhǔn)確率的模型可能不堪一擊
ResNet、VGG、EfficientNet這些主流架構(gòu)在ImageNet上動輒90%以上的準(zhǔn)確率,看起來已經(jīng)相當(dāng)可靠。但這些模型隱藏著一個被多數(shù)工程師忽視的致命缺陷:它們極易被對抗樣本愚弄。
改變一個像素,可能肉眼完全看不出區(qū)別,但分類器會徹底崩潰。本文會用FGSM(快速梯度符號法)演示如何制作對抗樣本,并解釋神經(jīng)網(wǎng)絡(luò)為何如此脆弱。
對抗樣本到底是什么
簡單說,對抗樣本就是專門設(shè)計(jì)來欺騙模型的輸入。和隨機(jī)噪聲不同,這種擾動是經(jīng)過精確計(jì)算的——目標(biāo)是在人眼察覺不到的前提下,最大化模型的預(yù)測誤差。
這里存在一個悖論:模型可以正確識別成千上萬張圖片,但只要加上一點(diǎn)經(jīng)過數(shù)學(xué)優(yōu)化的噪聲(像素值變化不到1%),它就會完全判斷失誤。
對抗攻擊絕非學(xué)術(shù)界的自娛自樂。自動駕駛汽車可能把停車標(biāo)志識別成限速標(biāo)志;人臉識別系統(tǒng)可能被繞過;放射科AI可能給出錯誤診斷;有害內(nèi)容可能躲過審核系統(tǒng)的檢測。
問題的根源在于:分類器學(xué)到的是統(tǒng)計(jì)層面的捷徑,而非真正的語義理解。高準(zhǔn)確率和高安全性是兩回事。
FGSM:簡單卻致命的攻擊方法
Ian Goodfellow等人在2015年提出的FGSM至今仍是最經(jīng)典的對抗攻擊之一。它的原理出奇地簡單,但恰恰暴露了深度神經(jīng)網(wǎng)絡(luò)的根本弱點(diǎn)。
數(shù)學(xué)原理
給定分類器和輸入圖像,F(xiàn)GSM計(jì)算一個擾動把圖像推向錯誤分類的方向。具體做法是沿著損失函數(shù)梯度的方向移動每個像素,用epsilon參數(shù)控制擾動幅度,確保改動在視覺上不可察覺。
FGSM為何有效
深度網(wǎng)絡(luò)雖然有非線性激活函數(shù)但在局部表現(xiàn)出近似線性的特性。每個像素上的微小變化會在高維空間中累積,最終在輸出空間產(chǎn)生巨大偏移。梯度恰好指明了這個最有效的攻擊方向——隨機(jī)噪聲做不到的事情,梯度對齊的噪聲可以輕松做到。
上圖就是是Goodfellow等人最初展示的結(jié)果:在熊貓圖像上疊加梯度符號計(jì)算得到的微小擾動,模型就會以極高置信度將其誤判為長臂猿。兩張圖片在人眼看來毫無差別,但神經(jīng)網(wǎng)絡(luò)的判斷卻天差地別。
Python實(shí)戰(zhàn):構(gòu)建你的第一個對抗樣本
下面用PyTorch和預(yù)訓(xùn)練的ResNet-50從零實(shí)現(xiàn)一個對抗樣本。
先安裝依賴:
pip install torch torchvision matplotlib numpy pillow
導(dǎo)入必要的庫:
import torch
import torch.nn.functional as F
import torchvision.models as models
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
第一步:加載分類器
用ResNet-50作為目標(biāo)模型。這個架構(gòu)在生產(chǎn)環(huán)境中很常見,而且支持梯度計(jì)算:
model = models.resnet50(pretrained=True)
model.eval()
第二步:準(zhǔn)備圖像
按ImageNet標(biāo)準(zhǔn)預(yù)處理輸入圖像:
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
img = Image.open("your_image.jpg").convert("RGB")
x = transform(img).unsqueeze(0)
x.requires_grad = True
注意requires_grad=True這行。沒有它就無法計(jì)算梯度,對抗攻擊也就無從談起。
第三步:獲取原始預(yù)測
跑一次前向傳播,看看模型本來會給出什么分類:
logits = model(x)
pred = logits.argmax(dim=1)
print(f"Original prediction: {pred.item()}")
正常情況下模型應(yīng)該能正確分類。
第四步:FGSM攻擊
核心代碼如下:
label = pred
loss = F.cross_entropy(logits, label)
loss.backward()
epsilon = 0.01 # perturbation budget
perturbation = epsilon * x.grad.sign()
x_adv = x + perturbation
x_adv = torch.clamp(x_adv, 0, 1)
這段代碼做了什么?計(jì)算損失對輸入像素的梯度,取符號得到方向,乘以epsilon控制幅度,加到原圖上就得到對抗樣本。最后用clamp保證像素值在合法范圍內(nèi)。
第五步:檢驗(yàn)效果
用同一個模型測試對抗圖像:
logits_adv = model(x_adv)
pred_adv = logits_adv.argmax(dim=1)
print(f"Adversarial prediction: {pred_adv.item()}")
大多數(shù)情況下預(yù)測結(jié)果會完全不同。圖像看起來一樣,分類卻天壤之別。
第六步:可視化
把原圖、對抗圖、噪聲模式放在一起對比:
def show_adversarial_attack(original, adversarial, perturbation):
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
axes[0].imshow(original)
axes[0].set_title("Original Image")
axes[0].axis("off")
axes[1].imshow(adversarial)
axes[1].set_title("Adversarial Image")
axes[1].axis("off")
axes[2].imshow(perturbation, cmap="gray")
axes[2].set_title("Noise Pattern (10x Amplified)")
axes[2].axis("off")
plt.tight_layout()
plt.show()
orig_np = x.detach().squeeze().permute(1, 2, 0).numpy()
adv_np = x_adv.detach().squeeze().permute(1, 2, 0).numpy()
noise_np = (adv_np - orig_np) * 10
show_adversarial_attack(orig_np, adv_np, noise_np)
噪聲模式放大10倍后看起來像電視雪花。人眼根本分辨不出兩張圖的區(qū)別,但神經(jīng)網(wǎng)絡(luò)卻認(rèn)為它們是完全不同的物體。
神經(jīng)網(wǎng)絡(luò)為何如此脆弱
理解這個問題需要從三個角度切入。
高維幾何:一張224×224的RGB圖像有150,528個維度。在這么高的維度里每個維度上的微小擾動累加起來就是巨大的距離。
局部線性:盡管激活函數(shù)是非線性的,深度網(wǎng)絡(luò)在數(shù)據(jù)點(diǎn)附近的小鄰域內(nèi)表現(xiàn)得非常線性,這讓基于梯度的攻擊特別有效。
非泛化特征:研究發(fā)現(xiàn)模型大量依賴那些與標(biāo)簽相關(guān)、但與人類感知無關(guān)的統(tǒng)計(jì)模式。對抗樣本正是在利用這些"捷徑特征"。
一個令人不安的事實(shí):深度學(xué)習(xí)模型優(yōu)化的目標(biāo)是訓(xùn)練集上的準(zhǔn)確率,而不是對擾動的泛化性。
一些限制需要說明
FGSM只是單步攻擊算比較弱的。迭代方法如PGD和Carlini-Wagner攻擊力更強(qiáng)也更難防御。
本文的演示假設(shè)攻擊者能拿到模型權(quán)重和梯度,屬于白盒場景。現(xiàn)實(shí)中攻擊者可能只能觀察模型輸出,需要用黑盒攻擊技術(shù)或者利用對抗樣本的遷移性。
數(shù)字?jǐn)_動只是一種形式。物理世界的對抗樣本——比如貼在物體上的特制貼紙——可以在不同光照和角度下持續(xù)欺騙視覺系統(tǒng)。
防御手段確實(shí)存在:對抗訓(xùn)練、輸入預(yù)處理、集成方法、認(rèn)證防御等等。但這些方法往往要犧牲準(zhǔn)確率,而且沒有哪個能提供完全的保護(hù)。
防御策略
幾種主流防御思路:
對抗訓(xùn)練把對抗樣本混入訓(xùn)練數(shù)據(jù),讓模型學(xué)會應(yīng)對擾動。輸入變換用JPEG壓縮、隨機(jī)縮放、降低位深等預(yù)處理來破壞對抗擾動。集成防御結(jié)合多個模型的預(yù)測或引入隨機(jī)性來增加攻擊難度。認(rèn)證防御用隨機(jī)平滑等技術(shù)在一定范圍內(nèi)提供數(shù)學(xué)上的泛化性保證。檢測方法則訓(xùn)練專門的模型來識別對抗樣本。
每種方法都有代價(jià),在泛化性、準(zhǔn)確率、計(jì)算開銷之間做權(quán)衡。
總結(jié)
對抗樣本揭示的是統(tǒng)計(jì)優(yōu)化和人類感知之間的根本鴻溝。深度學(xué)習(xí)擅長模式匹配,但它并不理解圖像的語義。
對抗樣本不會消失。這不是可以修復(fù)的bug而是當(dāng)前深度學(xué)習(xí)架構(gòu)的內(nèi)在屬性。隨著AI在關(guān)鍵基礎(chǔ)設(shè)施中的應(yīng)用越來越廣,理解和緩解對抗脆弱性變得愈發(fā)重要。
泛化性應(yīng)該和準(zhǔn)確率、公平性、效率一樣,成為一等公民級別的工程需求。否則,高準(zhǔn)確率帶來的只是虛假的安全感。
https://avoid.overfit.cn/post/935d5167003748db859452026a44b056
作者: Sarthakvyadav
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.