手把手教你使用TensorFlow生成對抗樣本|附源碼
如果說卷積神經網路是昔日影帝的話,那麼生成對抗已然成為深度學習研究領域中一顆新晉的耀眼新星,它將徹底地改變我們認知世界的方式。對抗學習訓練為指導人工智慧完成複雜任務提供了一個全新的思路,生成對抗圖片能夠非常輕鬆的愚弄之前訓練好的分類器,因此如何利用生成對抗圖片提高系統的魯棒性是一個很有研究的熱點問題。
神經網路合成的對抗樣本很容易讓人大吃一驚,這是因為對輸入進行小巧精心製作的擾動就可能導致神經網路以任意選擇的方式對輸入進行錯誤地分類。鑒於對抗樣本轉移到物質世界,可以使其變得非常強大,因此這是一個值得關注的安全問題。比如說人臉識別,若一張對抗圖像也被識別為真人的話,就會出現一些安全隱患及之後帶來的巨大損失。對生成對抗圖像感興趣的讀者可以關注一下最近的Kaggle挑戰賽NIPS,相關的信息可以參看博主的另外一篇:
《Kaggle首席技術官發布——(Kaggle)NIPS 2017對抗學習挑戰賽起步指南》
在這篇文章中,將手把手帶領讀者利用TensorFlow實現一個簡單的演算法來合成對抗樣本,之後使用這種技術建立一個魯棒的對抗性例子。
本文是一個可執行的Jupyter notebook:可以下載並自己實驗操作一下示例!
建立
我們選擇攻擊在ImageNet數據集上訓練的Inception v3網路。首先我們從TF-slim圖像分類庫中載入預先訓練的網路。這部分不是很有趣,所以請隨意跳過本部分。
import tensorflow as tf
首先,設置輸入圖像。使用tf.Variable而不是使用tf.placeholder,這是因為要確保它是可訓練的。當我們需要時,仍然可以輸入它。
image = tf.Variable(tf.zeros((299, 299, 3)))
接下來,載入Inception v3模型。
def inception(image, reuse):
接下來,載入預訓練的權重。這個Inception v3的top-5的準確率為93.9%。
import tempfile
接下來,編寫一些代碼來顯示圖像,並對它進行分類及顯示分類結果。
import json
示例圖像
載入示例圖像,並確保它已被正確分類。
import PILimport numpy as np
對抗樣本
給定一個圖像X,神經網路輸出標籤上的概率分布為P(y|X)。當手工製作對抗輸入時,我們想要找到一個X",使得logP(y"|X")被最大化為目標標籤y",即輸入將被錯誤分類為目標類。通過約束一些?∞半徑為ε的箱,要求‖X- X"‖∞≤ε,我們可以確保X"與原始X看起來不太一樣。
在這個框架中,對抗樣本是解決一個約束優化的問題,可以使用反向傳播和投影梯度下降來解決,基本上也是用與訓練網路本身相同的技術。演算法很簡單:
首先將對抗樣本初始化為X"←X。然後,重複以下過程直到收斂:
1. X"←X^+α??logP(y"|X")
2. X"←clip(X",X - ε,X+ε)
初始化
首先從最簡單的部分開始:編寫一個TensorFlow op進行相應的初始化。
x = tf.placeholder(tf.float32, (299, 299, 3))x_hat = image # our trainable adversarial inputassign_op = tf.assign(x_hat, x)
梯度下降步驟
接下來,編寫梯度下降步驟以最大化目標類的對數概率(或最小化交叉熵)。
learning_rate = tf.placeholder(tf.float32, ())y_hat = tf.placeholder(tf.int32, ())labels = tf.one_hot(y_hat, 1000)loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=[labels])optim_step = tf.train.GradientDescentOptimizer(
投影步驟
最後,編寫投影步驟,使得對抗樣本在視覺上與原始圖像相似。另外,將其限定為[0,1]範圍內保持有效的圖像。
epsilon = tf.placeholder(tf.float32, ())below = x - epsilon
執行
最後,準備合成一個對抗樣本。我們任意選擇「鱷梨醬」(imagenet class 924)作為我們的目標類。
demo_epsilon = 2.0/255.0 # a really small perturbationdemo_lr = 1e-1demo_steps = 100demo_target = 924 # "guacamole"# initialization stepsess.run(assign_op, feed_dict={x: img})# projected gradient descentfor i in range(demo_steps):
結果如下
step 10, loss=4.18923step 20, loss=0.580237step 30, loss=0.0322334step 40, loss=0.0209522step 50, loss=0.0159688step 60, loss=0.0134457step 70, loss=0.0117799step 80, loss=0.0105757step 90, loss=0.00962179step 100, loss=0.00886694
這種對抗圖像與原始圖像在視覺上無法區分,沒有可見的人為加工。但是它會以很高的概率分類為「鱷梨醬」。
classify(adv, correct_class=img_class, target_class=demo_target)
魯棒的對抗樣本
現在來看一個更高級的例子。遵循我們的方法來合成穩健的對抗樣本,以找到對貓圖像的單一擾動,這在某些選擇的變換分布下同時對抗,可以選擇任何可微分變換的分布;在這篇文章中,我們將合成一個單一的對抗輸入,設置θ∈[- π/4,π/4],這對旋轉是魯棒的。
在繼續下面的工作之前,檢查一下之前的例子是否能對抗旋轉,比如說設置角度為θ=π/8。
ex_angle = np.pi/8angle = tf.placeholder(tf.float32, ())rotated_image = tf.contrib.image.rotate(image, angle)rotated_example = rotated_image.eval(feed_dict={image: adv, angle: ex_angle})classify(rotated_example, correct_class=img_class, target_class=demo_target)
看起來我們之前生成的對抗樣本不是旋轉不變的!
那麼,如何使得一個對抗樣本對變換的分布是魯棒的呢?給定一些變換分布T,我們可以最大化Et~TlogP(y"|t(X")),約束條件為‖X- X"‖∞≤ε。可以通過投影梯度下降法來解決這個優化問題,注意到?Et~TlogP(y"|t(X"))與Et~T?logP(y"|t(X"))相等,並在每個梯度下降步驟中來逼近樣本。
可以使用一個技巧讓TensorFlow為我們做到這一點,而不是通過手動實現梯度採樣得到:我們可以模擬基於採樣的梯度下降,作為隨機分類器的集合中的梯度下降,隨機分類器從分布中隨機抽取並在分類之前變換輸入。
num_samples = 10average_loss = 0for i in range(num_samples):
我們可以重複使用assign_op和project_step,但為了這個新目標,必須寫一個新的optim_step。
最後,我們準備運行PGD來產生對抗輸入。和前面的例子一樣,選擇「鱷梨醬」作為我們的目標類。
demo_epsilon = 8.0/255.0 # still a pretty small perturbationdemo_lr = 2e-1demo_steps = 300demo_target = 924 # "guacamole"# initialization stepsess.run(assign_op, feed_dict={x: img})# projected gradient descentfor i in range(demo_steps):
結果如下
step 50, loss=0.0804289step 100, loss=0.0270499step 150, loss=0.00771527step 200, loss=0.00350717step 250, loss=0.00656128step 300, loss=0.00226182
這種對抗圖像被高度信任地歸類為「鱷梨醬」,即使是旋轉的情況下!
rotated_example = rotated_image.eval(feed_dict={image: adv_robust, angle: ex_angle})classify(rotated_example, correct_class=img_class, target_class=demo_target)
評估
下面來看一下在整個角度範圍內產生的魯棒對抗樣本的旋轉不變性,看P(y"|x")在θ∈[- π/4,π/4]。
thetas = np.linspace(-np.pi/4, np.pi/4, 301)p_naive = []p_robust = []for theta in thetas:
從圖中藍色曲線可以看到,生成的對抗樣本是超級有效的。
作者信息
Anish Athalye:MIT在讀博士生,對分散式系統、系統安全及人工智慧感興趣。
學術:http://www.anish.io/
Email:aathalye@mit.edu
Github:https://github.com/anishathalye
本文由北郵@愛可可-愛生活老師推薦,阿里云云棲社區組織翻譯。
文章原標題《A Step-by-Step Guide to Synthesizing Adversarial Examples》,作者:Anish Athalye,譯者:海棠


※做實景導航的有福了!ARKit增強現實版實景導航開源
※95後大學生用機器學習PAI大戰老年痴呆
※教你打造雲上深度學習實驗室
※使用MaxCompute進行網貸業務風控預測分析
※五年內醫療行業AI應用前瞻
TAG:雲棲社區 |
※使用以 Tensorflow 為後端的 Keras 構建生成對抗網路的代碼示例
※使用gradle生成Spring Boot應用的Docker Image
※基於 Tensorflow eager 的文本生成,注意力,圖像注釋的完整代碼
※TensorFlow官方力推、GitHub爆款項目:用Attention模型自動生成圖像字幕
※python機器學習庫sklearn——生成樣本數據
※Gradle Kotlin DSL的accessors 生成問題
※Regenerate Thumbnails讓WordPress重新生成特色圖像更簡單
※「python」生成器的高級應用send、close和throw方法
※Mybatis+velocity自動生成代碼
※教你在Python中用Scikit生成測試數據集
※CodeWarrior IDE使用Tips-使用burner將elf文件轉換生成HEX和BIN文件的方法和步驟詳解
※Ian Goodfellow:生成對抗網路 GAN 就是強化學習 超全資料
※Additive Works推出用於生成3D列印支撐的新Amphyon模塊
※Void Room用Quest創建無限空間VR遊戲《Tea For God》,採用程序生成和非歐幾里德幾何
※Ian Goodfellow:生成對抗網路 GAN 的公式是怎樣推導出來的
※rapid-generator自動生成代碼步驟
※SpringMVC,Spring,Hibernate框架自動生成器
※SemanticAdv:基於語義屬性的對抗樣本生成方法
※Ian Goodfellow:生成對抗網路 GAN 就是強化學習(超全資料)
※使用 Lets Encrypt 生成免費的 SSL 證書