首个在基于深度学习的推荐系统中进行投毒攻击的研究。文章总结的攻击深度学习推荐系统的难点,概括的来说就是:
- user-item 的数据是离散变量(和loss function建立不起联系)
- 神经网络的训练过程耗时(重新训练embedding至收敛)
我们的优化目标肯定是希望最大化target item的hit ratio:
max
H
R
t
subject to
∥
y
(
v
)
∥
0
≤
n
+
1
,
∀
v
∈
{
v
1
,
v
2
,
…
,
v
m
}
y
v
i
∈
{
0
,
1
,
…
,
r
max
}
begin{aligned} max & mathrm{HR}_{t} \ text { subject to } &left|mathbf{y}_{(v)}right|_{0} leq n+1, forall v inleft{v_{1}, v_{2}, ldots, v_{m}right} \ & y_{v i} inleft{0,1, ldots, r_{max }right} end{aligned}
max subject to HRt∥∥y(v)∥∥0≤n+1,∀v∈{v1,v2,…,vm}yvi∈{0,1,…,rmax}
直接优化这个函数行不通,采取多种方法:
把整数评分都转换成0.0~1.0的连续值,最后生成打分时再离散成整数。
Approximating the Hit Ratio因为Hit Ratio是非线性不可微的。对于一个用户u定义一个loss function:
l
u
=
max
{
min
i
∈
L
u
log
[
y
^
u
i
]
−
log
[
y
^
u
t
]
,
−
κ
}
l_{u}=max left{min _{i in L_{u}} log left[widehat{y}_{u i}right]-log left[widehat{y}_{u t}right],-kapparight}
lu=max{i∈Luminlog[y
ui]−log[y
ut],−κ}
如果目标物品 t 已经出现在推荐列表
L
u
L_u
Lu中,那么不需要做优化;否则应该提高 t 的排名,使
y
^
u
t
widehat{y}_{u t}
y
ut至少应该比
L
u
L_u
Lu中排名最低的
y
^
u
i
widehat{y}_{u i}
y
ui高。其中$kappa
是
一
个
超
参
数
,
保
证
目
标
物
品
至
少
高
于
是一个超参数,保证目标物品至少高于
是一个超参数,保证目标物品至少高于L_u$中最后一个物品一段距离。
所有用户的loss function就是
l
′
=
∑
u
∈
S
l
u
l^{prime}=sum_{u in S} l_{u}
l′=u∈S∑lu
现在优化问题转换成了:
min
G
[
y
(
v
)
]
=
∥
y
(
v
)
∥
2
2
+
η
⋅
l
′
subject to
y
v
i
∈
[
0
,
r
max
]
begin{aligned} min Gleft[mathbf{y}_{(v)}right] &=left|mathbf{y}_{(v)}right|_{2}^{2}+eta cdot l^{prime} \ text { subject to } & y_{v i} inleft[0, r_{max }right] end{aligned}
minG[y(v)] subject to =∥∥y(v)∥∥22+η⋅l′yvi∈[0,rmax]
因为推荐系统里的标签是离散的,梯度在反向传播到输入层时会消失,所以直接用图片的攻击方法不行。一个自然的想法时把fake user的评分向量
y
(
v
)
y_(v)
y(v)作为自变量,定义如下投毒攻击:
min
y
(
v
)
G
[
y
(
v
)
,
w
∗
]
subject to
w
∗
=
arg
min
w
L
[
w
,
Y
∪
y
(
v
)
]
begin{aligned} min _{mathbf{y}_{(v)}} & Gleft[mathbf{y}_{(v)}, mathbf{w}^{*}right] \ text { subject to } & mathbf{w}^{*}=underset{mathbf{w}}{arg min } mathcal{L}left[mathbf{w}, mathbf{Y} cup mathbf{y}_{(v)}right] end{aligned}
y(v)min subject to G[y(v),w∗]w∗=wargminL[w,Y∪y(v)]
其中
w
∗
w^*
w∗表示模型参数,
L
mathcal{L}
L是目标推荐系统的原损失函数。所以这是一个两阶段优化问题,目标推荐系统的参数
w
∗
w^*
w∗也需要依赖
y
(
u
)
y_{(u)}
y(u)。
麻烦就麻烦在这,这个 y ( u ) y_{(u)} y(u)一变,这个 w ∗ w^* w∗还得重新训练至收敛。这在现实中不可能实现优化。
所以需要一个本地代理模型
构建代理模型本地构建一个代理模型,首先在训练数据集上训练一个有效的推荐系统模型,然后再进行投毒训练:
l
=
L
+
λ
⋅
G
[
y
^
(
v
)
]
l=mathcal{L}+lambda cdot G[widehat{mathbf{y}}(v)]
l=L+λ⋅G[y
(v)]
The poison model in this stage will use Eq. (6) as loss function and be trained repeatedly w.r.t all model parameters inside it with the back-propagation method.
模型的所有参数都训练。
上式可以带入、展开、省略掉和求导无关的项,即:
l
=
L
+
η
(
∑
u
∈
S
(
y
^
u
i
−
y
^
u
t
)
)
+
∥
y
(
v
)
∥
2
2
l=mathcal{L}+etaleft(sum_{u in S}left(hat{y}_{u i}-hat{y}_{u t}right)right)+|y(v)|_{2}^{2}
l=L+η(u∈S∑(y^ui−y^ut))+∥y(v)∥22
文章里反复提了好几次,本文的方法最后得到的是:“本地模型最后会非常接近 目标模型实现了攻击目标的 理想状况”。 我的理解就是:这个时候本地模型收敛到了一个理想中被攻击的模型应该达到的状态,即模型的参数,既包含了有效的推荐系统,又包含了对target item的“偏爱”。
换句话说作者把本地模型当作目标模型进行白盒攻击,攻击完之后,本地模型就是攻击者最想要的模型,即能用又可以获利。然后从本地模型里采样一些数据样本(fake user:filler items + target item),希望目标模型可以迁移训练一下,向本地模型靠拢。
那就把这个时候fake user的评分高的物品作为filler item。从这个名字就能看出,fake user的rating并不能很好的优化到目标模型。



