Poisoning Attack in Adversarial Machine Learning
Data Poisoning攻击区别于Evasion攻击,是攻击者通过对模型的训练数据做手脚来达到控制模型输出的目的,是一种在训练过程中产生的对模型安全性的威胁。Data Poisoning,即对训练数据“下毒”或“污染”。这种攻击手段常见于外包模型训练工作的场景,例如我们常常将模型训练任务委托给第三方云平台(如Google Colab等等),此时第三方平台就掌握了我们的所有训练数据,很容易在训练数据上做手脚,以达到不为人知的目的。
此类data poisoning攻击一般分为两大类:分别是Backdoor attack和Training-only attack,区别在于前者需要接触到模型的训练数据(training data)以及验证数据(test data),而后者仅需要接触到模型的训练数据即可完成攻击。前者进一步可以分为Basic backdoor attack和clean-label backdoor attack,区别在于是否需要对训练数据的label进行perturb(更改)。
Backdoor Data Poisoning
基本原理是,通过在训练数据上做手脚,以使训练好的模型在实际工作当中,如果待分类样本中有"trigger",就会把这个样本分类错误。所谓的trigger,就是在实际图形中的一个小特征,比如一个红色的小方块,或一团黑白的马赛克,是人为标记上的。此时被攻击的模型我们也成为Trojan模型,这个trigger也称为Trojan Trigger。整个攻击过程分为两个步骤:
-
对训练数据进行污染,对某一类别的训练数据中的一部分加上trigger,同时把标签统一改为“4”,没有加trigger的图片的标签保持不动。被修改的训练集拿去给模型训练,此时模型会默默学习到——所有加上这类trigger的图片的类别都应是“4”,不论它的数据pattern(真正表现的图形)是什么。
-
训练好的模型在工作时,给任意一张输入图像加上trigger,模型就会立刻将它分类为“4”;如果是不加trigger的输入,这张图像会被分类到正确的类别。
下图4完整的展示了攻击过程,下图中的trigger是一张白块。由此可见,这个trigger就像是模型给攻击者留好的后门,首先它在使用时不易被发现——如果不加trigger,模型就会照常工作,不会表现出任何异样;当攻击者准备使用它时只需要在test input上加入事先预留的trigger,模型就会乖乖的把input分类成攻击者想要的类别。
可用于攻击的trigger可以有很多种形式,例如3:
对此类攻击手段而言,最重要的是两个指标:
- 当没有trigger时,模型的正确率要高,即clean data的分类正确率。
- 当有trigger时,模型将poisoned data分类成目标类别的正确率要高。
该方法的优势:计算量小,poison策略和模型本身是无关的(model- agnostic);而该方法的劣势:需要同时改变训练样本的数据和标签、同时在测试过程也要改变测试数据4。
我们自然而然会问:有没有办法来设计一套不需要改变训练数据label的攻击方法(因为一旦改变,攻击就比较容易检测出来了)?有没有办法设计一套不需要在测试集上加trigger的攻击手段(让不知情的使用者也会中招)?前者的答案是Clean-label,后者的答案是training-only attack。
Clean-Label Attack
顾名思义,这种方法不需要改变训练集的label,只需要对训练集的data做手脚。Clean-label attack的原理是同时对训练集data做perturbation以及加trigger,就能实现模型在测试过程中遇到trigger就会分类出错。这种攻击手段用两种方式均可实现,分别是Adversarial perturbation-enabled backdoor6以及hidden trigger backdoor7。
Adversarial Perturbation-Enabled Backdoor6
这种攻击方法首先会将目标类别尽量污染成其他类别,然后再对该类别施加trigger。先解释前半句话:
x p = arg max x ′ ℓ t r ( x ′ , y , θ ) s . t . ∥ x ′ − x ∥ p ≤ ϵ \mathbf{x_p = \mathop{\arg\max}_{x'} \ell_{tr}(x', y, \boldsymbol\theta) \\ s.t. {\|x' - x \|}_p \le \epsilon} xp=argmaxx′ℓtr(x′,y,θ)s.t.∥x′−x∥p≤ϵ
对于选定的图像 x \mathbf x x(例如猫这一类的训练图片)做perturbation,实际上是一个优化过程,优化方向是让一个pretrained model认为 x \mathbf x x不像 x \mathbf x x,数学上即使得pretrained model的loss ℓ t r \ell_{tr} ℓtr最大。注意这里的perturbation是没有给定方向的(untargeted),即一张猫的图片perturb后模型可能会按照像狗的方向优化,另一张猫的图片按照像马的方向优化,这取决于每张图片在pretrained model上不同标签的打分结果。接着我们在污染过的训练样本 x p \mathbf{x_p} xp上加trigger,让目标模型去用这样的样本集训练 ( x p + t r i g g e r , y ) (\mathbf{x_p} + trigger, \mathbf y) (xp+trigger,y)。注意,因为污染样本的方向是随机的,实际上是让模型学习到:“狗+trigger、马+trigger、驴+trigger…”这些特征应该被分类成猫,这里的“狗、马、驴”的特征实际上是猫被向“狗、马、驴”方向污染而产生的,这也就是为什么能够不改变训练集的label也能下backdoor的原因。
Hidden Trigger Backdoor7
一般的DNN图像分类模型总是由以下两部分组成,Feature Extractor以及Classifier,最终组成总的 g ∘ f ( x ) g \circ f(\mathbf x) g∘f(x)即为整个模型:
Hidden Trigger Backdoor的思想是,首先我们选中某一被攻击的类别(如下图的airplane)加上trigger x t r i g g e r \mathbf x_{trigger} xtrigger,对另一类别(下图的dog)进行perturb优化,优化的方向是使被污染图片 x p \mathbf x_p xp的被提取到的特征 f ( x p ) f(\mathbf x_p) f(xp)尽量和有trigger的图片相似:
x p = arg min x ′ ∥ f ( x ′ ) − f ( x t r i g g e r ) ∥ 2 2 s . t . ∥ x ′ − x ∥ ∞ ≤ ϵ \mathbf{x_p} = \mathop{\arg\min}_{\mathbf x'} {\| f(\mathbf x') - f(\mathbf x_{trigger}) \|}_{2}^2\\ s.t. \| \mathbf {x' - x} \|_{\infty} \le \epsilon xp=argminx′∥f(x′)−f(xtrigger)∥22s.t.∥x′−x∥∞≤ϵ
这种做法的思想实际上是让被perturb的类别模仿加上trigger的另一类别,这样做在实际训练的过程中,训练集的所有图像都没有加trigger,trigger被“隐藏”在了perturbation中,因此称为hidden trigger。加在Dog类上的Perturbation被用来在特征层面模仿附有trigger的Airplane类。因而在测试的时候,输入加上trigger的Airplane类会被模型误认为Dog,以达到利用trigger实施攻击的目的。
对以上两种方法做比较,可以发现Adversarial Perturbation-Enabled Attack是一种无向的(untargeted)攻击,而后者则是有向的。
将clean-label attack和basic backdoor attack相对比可以发现,前者比后者少了对训练集label的更改,因而能使攻击更隐蔽。
Training Only Attacks
Training Only Attack是指在攻击时完全不用trigger,其中比较重要的一种方法是Feature Collision Backdoor Attack8,它可被视作是Hidden Trigger的一种泛化(generalization)。以上图为例,Hidden Trigger将Dog类在feature层面上模仿加了trigger的Airplane类,而Feature Collision直接让Dog类的图片直接去模仿Airplane类的图片 f ( x c l e a n ) f(\mathbf{x}_{clean}) f(xclean)(Airplane本身,不加trigger)。通过这种方式,让训练集的一部分Dog的特征和Airplane的特征“碰撞”(彼此非常接近),但是标签不同。模型在学习的过程中会认为同样是Airplane的特征,有些被标记成Dog,而有些被标记成Airplane;反之亦然。
x p = arg min x ′ ∥ f ( x ′ ) − f ( x c l e a n ) ∥ 2 2 s . t . ∥ x ′ − x ∥ ∞ ≤ ϵ \mathbf{x_p} = \arg\min_{\mathbf x'} {\| f(\mathbf x') - f(\mathbf x_{clean}) \|}_{2}^2\\ s.t. \| \mathbf {x' - x} \|_{\infty} \le \epsilon xp=argx′min∥f(x′)−f(xclean)∥22s.t.∥x′−x∥∞≤ϵ
如此一来,在测试时,即使不对测试样本加任何trigger,模型也会很大概率将Dog类识别成Airplane,或将Airplane识别成Dog。
Defense Methods3
针对Backdoor Attack防御的基本思路是,我们能不能从一个被攻击的模型 θ p \mathbf{\theta_p} θp中恢复出攻击者预留的trigger?这里就涉及到一个估计的问题:对于任意一个输入 x \mathbf x x,也一定有一不变的trigger使得加上trigger后的输入 x p \mathbf x_p xp 的预测结果是错误的。
如果我们用 m \mathbf m m表征trigger的位置, m \mathbf m m是一个和 x \mathbf x x大小相同的掩膜(mask)矩阵,仅有 0 0 0和 1 1 1组成; δ \boldsymbol{\delta} δ表征trigger本身,就可以通过优化以下误分类率来恢复 m \mathbf m m和 δ \boldsymbol\delta δ:
( m ^ , δ ^ ) = arg max m , δ ℓ t r ( ( 1 − m ) ∘ x + m ∘ δ , y ; θ p o i s o n ) + λ ∥ m ∥ 1 (\hat{\mathbf m}, \hat{\boldsymbol\delta}) = \mathop{\arg\max}_{\mathbf m, \boldsymbol{\delta}} \ell_{tr}(\mathbf{(1 - m) \circ x + m \circ \boldsymbol\delta, y; \boldsymbol\theta_{poison}}) + \lambda \|\mathbf m\|_1 (m^,δ^)=argmaxm,δℓtr((1−m)∘x+m∘δ,y;θpoison)+λ∥m∥1
通过这种方法产生的 m \mathbf m m是稀疏的,因为最后的正则项采用的是 ℓ 1 \ell_1 ℓ1范数。
A Generalization view on Data Poisoning - Bi-level Optimization
所谓Bi-level optimization问题是指形如:
min x = ℓ ( x , y ∗ ( x ) ) s . t . y ∗ ( x ) = arg min y g ( y , x ) \min_{\mathbf x} = \ell(\mathbf x, \mathbf y^{*}(\mathbf x))\\ s.t. \mathbf y^{*}(\mathbf x) = \mathop{\arg\min}_{\mathbf y}g(\mathbf y, \mathbf x) xmin=ℓ(x,y∗(x))s.t.y∗(x)=argminyg(y,x)
的优化问题。其中该问题包含两层优化,第一层是outer loop,其中 ℓ \ell ℓ一般是定义好的损失函数,而 y ∗ \mathbf y^* y∗也是关于 x \mathbf x x的优化函数,即inner loop优化问题。特别的,如果 g = − ℓ g = -\ell g=−ℓ那么该问题就特殊化为 m i n − m a x min-max min−max问题:
min x max y ℓ ( x , y ) \min_{\mathbf x}\max_{\mathbf y} \ell(\mathbf{x, y}) xminymaxℓ(x,y)
特别的,我们可以将Data Poisoning写成该问题的形式12 13:
- x \mathbf x x即为被优化的poisoned data,最优解为 x p = ( 1 − m ) ∘ x + m ∘ δ \mathbf x_p = \mathbf{(1-m)\circ x + m \circ \boldsymbol\delta} xp=(1−m)∘x+m∘δ,其中 ( m , δ ) (\mathbf m, \boldsymbol\delta) (m,δ)即为实际被优化的参数对。
- y \mathbf y y是被攻击的模型参数,将在poisoned data上被训练。
- ℓ \ell ℓ是Attack loss ℓ a t k \ell_{atk} ℓatk
- g g g是模型训练时的loss: ℓ t r \ell_{tr} ℓtr。
因此可以讲bi-level的形式改写为:
min m , δ ℓ a t k ( X p v a l , θ ∗ ) s . t . θ ∗ = arg min θ ℓ t r ( θ ; X p ∪ X c l e a n ) w h e r e X p = { x p ( i ) = ( 1 − m ) ∘ x p ( i ) + m ∘ δ } \min_{\mathbf m, \boldsymbol\delta} \ell_{atk}(\mathcal{X}_{p}^{val}, \boldsymbol{\theta^*})\\ s.t. \quad \boldsymbol\theta^* = \mathop{\arg\min}_{\boldsymbol\theta}\ell_{tr}(\boldsymbol\theta; \mathcal{X}_p\cup\mathcal{X}_{clean})\\ where \quad\mathcal{X}_{p} = \{\mathbf{x_p^{(i)}} = \mathbf{(1-m)\circ x_{p}^{(i)} + m \circ \boldsymbol\delta}\} m,δminℓatk(Xpval,θ∗)s.t.θ∗=argminθℓtr(θ;Xp∪Xclean)whereXp={xp(i)=(1−m)∘xp(i)+m∘δ}
注意这里 X c l e a n \mathcal{X}_{clean} Xclean和 X p \mathcal{X}_{p} Xp分别是原始的和被污染的训练集数据,而 X p v a l \mathcal{X}_{p}^{val} Xpval是验证集加上trigger的数据。trigger的形式和位置可以是和数据无关的(data- agnostic)也可以是和数据有关的,此时对于每个训练数据,都会有自己的 ( m i , θ i ) (\mathbf{m_i}, \boldsymbol\theta_i) (mi,θi)。
该类问题的解法可以采用Alternating Optimization,也就是给定 θ ( 0 ) \boldsymbol\theta(0) θ(0)和 ( m ( 0 ) , δ ( 0 ) ) (\mathbf{m}(0),\boldsymbol\delta(0)) (m(0),δ(0)),分别对inner loop和outer loop进行迭代优化:
θ ( k ) = arg min θ ℓ t r ( θ ; X p ( k − 1 ) ∪ X c l e a n ) ( θ − s t e p ) \boldsymbol\theta(k) = \mathop{\arg\min}_{\boldsymbol\theta}\ell_{tr}(\boldsymbol\theta; \mathcal{X}_p(k-1)\cup\mathcal{X}_{clean})\qquad (\boldsymbol\theta-step) θ(k)=argminθℓtr(θ;Xp(k−1)∪Xclean)(θ−step)
( m ( k ) , δ ( k ) ) = ( m ( k − 1 ) , δ ( k − 1 ) ) − α ∇ m , δ ℓ a t k ( X p v a l ( k − 1 ) , θ ( k ) ) ( ( m , δ ) − s t e p ) ) (\mathbf m(k), \boldsymbol\delta(k)) = (\mathbf m(k-1), \boldsymbol\delta(k-1))-\alpha\nabla_{\mathbf m, \boldsymbol\delta}\ell_{atk}(\mathcal{X}_{p}^{val}(k-1), \boldsymbol\theta(k)) \\ ((\mathbf m, \boldsymbol\delta)-step)) (m(k),δ(k))=(m(k−1),δ(k−1))−α∇m,δℓatk(Xpval(k−1),θ(k))((m,δ)−step))
可以看出,在 ( θ − s t e p ) (\boldsymbol\theta-step) (θ−step)中,可以用N-step的PGD方法;而在 ( ( m , δ ) − s t e p ) ((\mathbf m, \boldsymbol\delta)-step) ((m,δ)−step)中,可以使用梯度下降法。关于如何求梯度 ∇ m , δ ℓ a t k ( X p v a l ( k − 1 ) , θ ( k ) ) \nabla_{\mathbf m, \boldsymbol\delta}\ell_{atk}(\mathcal{X}_{p}^{val}(k-1), \boldsymbol\theta(k)) ∇m,δℓatk(Xpval(k−1),θ(k)),可以参考11