• Catch the Black Sheep: Unified Framework for Shilling Attack Detection Based on Fraudulent Action Propagation


    Zhang Y., Tan Y., Zhang M., Liu Y., Chua T. and Ma S. Catch the black sheep: unified framework for shilling attack detection based on fraudulent action propagation. In International Joint Conference on Artificial Intelligence (IJCAI), 2015.

    本文提出了一种恶意伪造数据 (限推荐系统, 打分矩阵) 的检测方法. 和以前的防御方法不同, 作者认为该方法不受攻击方法的限制, 具有一般性.

    符号说明

    • \(u_i \in \mathcal{U}, |\mathcal{U}| = m\), 用户;
    • \(p_j \in \mathcal{P}, |\mathcal{P}| = n\), 产品;
    • \(r_{ij} \in R \in \mathbb{R}^{|\mathcal{U}| \times |\mathcal{|P|}}\), 用户 \(u_i\) 为产品 \(p_j\) 的一个打分情况;
    • \(G = (\mathcal{U}, \mathcal{P}, \mathcal{E})\), 用户和产品所构成的一个二部图;
    • \(\mathcal{U}_s\), 手动筛选的恶意用户.

    主要内容

    一些不法分子可能会通过伪造用户和产品来使得基于恶意干扰后的数据矩阵的推荐系统会偏向某些特定产品. 作者为所有的用户和产品共同建立了一个二部图 \(G\), 每个阶段 \(u\)\(p\) 具有一个概率 \(\mathbb{P}(u_i)\) 或者 \(\mathbb{P}(p_j)\), 表示改用户或者产品为恶意的概率. 图中的部分用户 (\(\mathcal{U}_s\)) 是已知的恶意用户, 作者本文提出的算法可以基于结点间的关系来将这一结果推广出去. 具体如下:

    1. 构建用户 \(u_i\) 和物品 \(p_j\) 的转移概率:

    \[\mathbb{P}(u_i \rightarrow p_j) := t_{u_i p_j}, \: \mathbb{P}(p_j \rightarrow u_i) := t_{p_ju_i}. \: \]

    由此构成矩阵

    \[T_{up} = [t_{u_ip_j}]_{m \times n}, \: T_{pu} = [t_{p_j u_i}]_{n \times m}. \]

    1. 初始化未知的概率, 即除 \(\mathcal{U}_s\) 以外的

    \[P^0_u = [\mathbb{P}(u_1), \cdots, \mathbb{P}(u_m)]^T, \\ P^0_p = [\mathbb{P}(p_1), \cdots, \mathbb{P}(p_n)]^T. \\ \]

    1. 更新

    \[P_p^k = T_{pu} P_u^{k-1}, \: P_u^{k} = T_{up} P_p^{k}. \]

    1. \(\mathbb{P}(u), u \in \mathcal{U}_s\) 部分重置为真实的标签;
    2. 倘若没有收敛, 回到步骤 3, 否则停止.

    转移矩阵的构造

    1. 首先为图 \(G\) 中的边赋予权重 (注意, 只有 \(u_i\)\(p_j\) 打分, 该边才是存在的, 否则可以设 \(w_{ij} = 0\)):

    \[w_{ij} = 1 + |\frac{r_{ij} - \bar{r}_i}{\bar{r}_i}| +|\frac{r_{ij} - \bar{r}_j}{\bar{r}_j}| +|\frac{r_{ij} - \bar{r}}{\bar{r}}|, \]

    其中 \(\bar{r}_i, \bar{r}_j, \bar{r}\) 分别代表

    \[\bar{r}_i := \frac{1}{n_i} \sum_{r_{ij} \not = 0} r_{ij}, \\ \bar{r}_j := \frac{1}{m_j} \sum_{r_{ij} \not = 0} r_{ij}. \\ \]

    注: 具体计算方式文中并没有给出, 但我感觉应该是对应的行列的非零分数的一个平均. 可以注意到, \(w_{ij}\) 中的 1 表示 \(u_i\), \(p_i\) 之间存在关联, 而后面三项反映了所打的分数在用户间, 产品间, 整体间的一个偏离程度, 可以这么说, \(w_{ij}\) 越大, \(u_i\)\(p_j\) 异常的可能性就越大.
    2. 但是, 出于可靠性的考虑 (请回看原文), 作者实际上采用的是如下的定义方式 (双向的平均以作平滑):

    \[w_{ij}' = \frac{w_{ij}}{(\sum_{j'} w_{ij'}) (\sum_{i'} w_{i'j})}. \]

    1. 构建概率

    \[t_{u_ip_j} = \frac{w_{ij}}{\sum_{j'} w_{ij'}}, \\ t_{p_j u_i} = \frac{w_{ij}}{\sum_{i'} w_{i'j}}. \]

    seed users 的选择

    作者只是给出了在 Amazon Movie dataset 上的一个选择方案. 用户会在上面进行评论, 然后其它用户又会给该用户的评论打上 helpfulness 和 unhelpfulness (大概类似点赞点踩的机制), 于是作者收集这些信息, 将那些好评率低于 0.3 的用户选择为 \(\mathcal{U}_s\).

    可以发现, seed 用户的量对于最终的影响还是比较大的, 毕竟这直接影响了可用的信息.

    一些思考

    其实看这篇文章的时候, 我以为是类似马氏链的那种转移概率, 但是如果是这种的话, 更新的方式就有问题了, 反而应该是

    \[P_p^k = T_{up}^{\mathrm{T}} P_u^{k-1}, \: P_u^{k} = T_{pu}^{\mathrm{T}} P_p^{k}. \]

    只是, 此时会带来一个很危险的问题, 即 \(P_p, P_u\) 的部分元素 $ > 1$ 的情况. 实际上, 与该算法紧密联系的论文, 采用的时候更新后归一化的操作. 只是本文采用了一种不同的, 简化的方案. 不妨将这种更新以全概率的方式进行理解, 注意到

    \[\begin{array}{ll} \mathbb{P}(p_j) &=\sum_{k} \mathbb{P}(p_j \rightarrow u_k) \mathbb{P}(u_k) \\ &=\sum_{k} \mathbb{P}(V^{next} = u_k| V^{now} = p_j) \mathbb{P}(y = 1|V^{next}=u_k) \\ &=\sum_{k} \mathbb{P}(y = 1, u_i | p_j) \\ &= \mathbb{P}(y = 1| V^{now} = p_j) \\ \end{array} \]

    这里, 把 \(y=1|u_k\) 表示在结点为 \(u_k\) 的情况下, 伪造的概率. 只是, 这需要我们在倒数第二步假设在已知 \(V^{next}\) 的情况下, \(V^{now}\)\(y\) 是独立的. 细想, 还是有问题啊, 没有合适的概率图.

  • 相关阅读:
    Python2的object和type
    str函数
    关于Python IDLE reload(sys)后无法正常执行命令的原因
    str和unicode类
    https://www.zhihu.com/question/31110175
    Python 头部 #!/usr/bin/python 和 #!/usr/bin/env 的区别
    正则表达式
    StringBuffer类
    String类
    抽象类、接口作为方法返回值和参数
  • 原文地址:https://www.cnblogs.com/MTandHJ/p/16344122.html
Copyright © 2020-2023  润新知