Distillation as a Defense to Adversarial Perturbations against Deep Neural Networks

Nicolas Papernot, Patrick McDaniel, Xi Wu, Somesh Jha, Ananthram Swami, Distillation as a Defense to Adversarial Perturbations against Deep Neural Networks.

本文提出一種distillation model, 能夠免疫大部分的adversarial attacks, 具有良好的魯棒性, 同時容易訓練.

主要內容

在這裏插入圖片描述

符號 說明
F()F(\cdot) 神經網絡, 且F(X)=softmax(Z(X))F(X)=\mathrm{softmax^*}(Z(X)).
XXX \in \mathcal{X} 樣本
YY 樣本對應的標籤
FdF^d distilled network
TT temperature

注: 這裏的softmax(z)i:=ezi/Tjeej/T,i=0,,N1\mathrm{softmax}^*(z)_i:=\frac{e^{z_i/T}}{\sum_j e^{e_j/T}}, i= 0,\ldots, N-1;
注: FdF^dFF網絡結構一樣;

算法

Input: TT,訓練數據(X,Y)(X,Y).

  • 在訓練數據(X,Y)(X, Y)上訓練得到FF;
  • 得到新的訓練數據(X,F(X))(X, F(X));
  • 利用(X,F(X))(X, F(X))訓練FdF^d;
  • 修改FdF^d的最後一層T=1T=1.

Output: FdF^d.

爲什麼這個算法是有效的呢?

  1. 訓練FdF^d用的標籤是概率向量F(X)F(X), 拿數字舉例, 如果寫的草一點7711是很相近的, 但如果訓練的標籤是(0,0,0,0,0,0,1,0,0,0)(0,0,0,0,0,0,1,0,0,0)的話反而不符合實際, 會導致不穩定;
  2. TT比較大的時候(訓練):
    Fi(X)XjT=1Tezi/Tg2(X)(l=1N(ziXjzlXj)ezl/T), \frac{\partial F_i(X)}{\partial X_j}|_T = \frac{1}{T}\frac{e^{z_i / T}}{g^2(X)}\big( \sum_{l=1^N}(\frac{\partial z_i}{\partial X_j}-\frac{\partial z_l}{\partial X_j})e^{z_l /T}\big),
    會比較小, 其中g(X)=l=0N1ezl(X)/Tg(X)=\sum_{l=0}^{N-1} e^{z_l(X)/T}.
  3. 在測試的時候, 我們令T=1T=1, 假設XX在原先情況下z1/Tz_1/T最大, z2/Tz_2/T次大, 則
    ϵ=z2/Tz1/T=0+Tr(GTδX)+o(δx), \epsilon=z_2/T-z_1/T= 0 + \mathbf{Tr}(\mathcal{G}^T \delta X) + o(\delta x),

    Tϵ=z2z1=0+TTr(GTδX)+o(δx), T\epsilon=z_2-z_1= 0 + T \cdot \mathbf{Tr}(\mathcal{G}^T \delta X) + o(\delta x),
    其中G\mathcal{G}z2z1z_2-z_1XX處的負梯度.

一些有趣的指標

魯棒性定義

ρadv(F)=Eμ[Δadv(X,F)], \rho_{adv}(F)= E_{\mu}[\Delta_{adv}(X,F)],
其中μ\mu爲樣本的分佈
Δadv(X,F)=argminδX{δX:F(X+δX)F(X)}. \Delta_{adv}(X,F) = \arg \min_{\delta X} \{ \| \delta X\| : F(X+\delta X) \not = F(X) \}.
可採用下式來實際估計
ρadv(F)1XXXminδXδX. \rho_{adv}(F) \approx \frac{1}{|\mathcal{X}|} \sum_{X \in \mathcal{X}} \min _{\delta X} \|\delta X\|.

合格的抗干擾機制

  1. 對原有結構有較少的影響;
  2. 網絡對乾淨數據因具有相當的正確率;
  3. 較好的訓練速度;
  4. δX\| \delta X\|較小的情況能夠免疫干擾.

原文還有一個理論分析, 但我認爲不重要, 略過.

代碼

import torch.nn as nn

class Tsoftmax(nn.Module):

    def __init__(self, T=100):
        super(Tsoftmax, self).__init__()
        self.T = T

    def forward(self, x):
        if self.train():
            return nn.functional.softmax(x / self.T)
        else:
            return nn.functional.softmax(x)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章