CS224W笔记-第六课:消息传递和点分类
从这篇开始,会采用新的笔记写法来加速整个过程。基本思路是:
- 问题是什么
- 主要解决的思想
- 主要的算法思路+公式
先在这一课尝试一下。看看能不能加快整个课程的学习。按之前的写法,估计到年底都不一定搞的完了。
从第六课开始,224W的教师换成了Michele Catasta。讲的内容会是近年新出现的一些算法和思路。在这一课里,Michele主要关注图中的点分类的问题,即在知道图里部分点的分类标签的情况下,如何给剩下的点进行分类。这通常也被称为一个半监督的机器学习任务。
协同分类(Collective Classification)
对于上面要解决的任务,课程里介绍了协同分类的方法。即利用数据形成的图的结构信息来帮助提升分类的性能。协同分类的理论原理是来自于图研究里所获得的一些结果,主要是3类:
- 同质性(homophily):即常说的“什么样的人进什么样的门”。有类似特性的东西更容易形成关联。
- 影响性(Influence):即常说的“近朱者赤、近墨者黑”。
- 共变影响(Confounding):即共同的邻居会造成不相关的事物看着相关。
由于上述特征的存在,在图结构里,我们不仅仅可以使用每个节点自身的特征完成分类,同时也可以利用图结构里存在的这些特性来增强分类的效果。
需要解决的问题
如何利用网络里普遍存在的关联关系,帮助预测节点的类别。
问题定义:
W
W
W是一个
n
×
n
n × n
n×n的(带权重)邻接矩阵。
Y
=
{
−
1
,
0
,
1
}
n
Y=\{-1, 0, 1\}^n
Y={−1,0,1}n是一个含有
n
n
n元素的标签向量,其中1表示正例,-1表示负例,0表示未知。
目标:预测所有0标签的点为1或-1的概率。
协同分类基本思路
马尔可夫假设:节点
i
i
i的标签
Y
i
Y_i
Yi依赖于它的邻居的标签
P
(
Y
i
∣
i
)
=
P
(
Y
i
∣
N
i
)
P(Y_i|i) = P(Y_i|N_i)
P(Yi∣i)=P(Yi∣Ni)
协同分类的3个节本步骤:
- 本地分类,获取初始的分类标签。这里使用一个分类器,仅用节点的特征来对节点进行分类,而没有使用图的信息。
- 关联分类:获取节点间的关联关系,并训练一个分类器来对根据邻居节点的标签和或特征对本节点进行分类。这里开始用到了图的信息。
- 系统推断:再把关联关系通过网络进行传播。循环地对所有节点运用关联分类,直到邻居间标签的不一致最小化。这里会反复用到图的信息,而且图结构信息会极大地影响最终的预测结果。
协同分类如果完全按照马尔可夫假设去计算精确解,那么就是一个NP-Hard的问题。所以一般都是使用近似的算法来解决。课程里介绍了3种近似解的算法:关联分类器、迭代分类和置信传播。它们都是迭代算法。
关系分类器(Relational Classifier)
算法思路:
- 节点的分类概率 P i P_i Pi是它的所有邻居的分类概率的加权平均。
- 对于有标签的节点,初始化为它们的真实标签。
- 对于没有标签的节点,统一初始化成唯一值。
- 按随机顺序更新所有的无标签节点,直到收敛或最大迭代次数。
其中,对于节点标签的更新的公式是:
P
(
Y
i
=
c
)
=
1
∑
(
i
,
j
)
∈
E
W
(
i
,
j
)
∑
(
i
,
j
)
∈
E
W
(
i
,
j
)
P
(
Y
j
=
c
)
P(Y_i=c)=\dfrac{1}{\sum_{(i,j)\in E}W(i,j)}\sum_{(i,j)\in E}W(i,j)P(Y_j=c)
P(Yi=c)=∑(i,j)∈EW(i,j)1(i,j)∈E∑W(i,j)P(Yj=c)
公式里的
W
(
i
,
j
)
W(i,j)
W(i,j)是节点
i
i
i和
j
j
j之间边的权重。
训练过程:
按照上面的4个步骤迭代运行。
问题:
算法并不保证会收敛,而且没有应用到节点的特征。
迭代分类
算法思路:利用节点自身的特质+邻居的标签来进行分类预测
- 启动阶段
- 把节点 i i i的特征转换成一个向量 α i \alpha_i αi。
- 训练一个分类器来 f ( α i ) f(\alpha_i) f(αi)对对无标签的节点,使用 α i \alpha_i αi作为输入进行分类获得 Y i Y_i Yi。
- 迭代阶段
- 对每个节点,更新 α i \alpha_i αi;
- 再用 f ( α i ) f(\alpha_i) f(αi)计算并更新 Y i Y_i Yi。
- 重复这个过程,直到节点的类别稳定下来或者达到最大迭代次数。
训练过程:根据后面的例子可得
- 在训练集上,训练两个分类器,一个使用节点特征进行分类,一个使用节点特征+邻居标签进行分类。例子里面的邻居标签的编码方法是 ( I c 1 i , I c 2 i , I c n i , O c 1 i , O c 2 i , O c n i ) (I_{c1}^i, I_{c2}^i, I_{cn}^i, O_{c1}^i, O_{c2}^i, O_{cn}^i) (Ic1i,Ic2i,Icni,Oc1i,Oc2i,Ocni),其中, I I I指的入度, O O O代表出度, I c 1 i = ∑ i , j ∈ E v ( j ) ∈ C l a s s 1 I_{c1}^i=\sum_{i,j \in E} v(j) \in Class 1 Ic1i=∑i,j∈Ev(j)∈Class1。即入边里邻居属于类别1的数量和。
- 获得2个分类器后,再按照上面迭代阶段的步骤,对验证/测试集的数据进行迭代分类。
问题:
算法并不保证会收敛。
REV2虚假评论检测算法
迭代分类的一篇论文。原理是评论内容容易造假,但是评论的行为,特别是关联行为难于造假,容易被检测到。
任务设定:
- 输入数据为二部图,一种节点是“用户”,另外一种是“商品”。边的特征 s c o r e ( u , p ) score(u,p) score(u,p)设置为评论的正负性质,正评价设为1,负评价设为-1。
- 输出为一些给出虚假评论的“用户”。
算法思路:
- 给用户一个“公平”(fairness)评分 F ( u ) F(u) F(u),取值区间 [ 0 , 1 ] [0,1] [0,1];
- 给商品一个“品质”(goodness)评分 G ( p ) G(p) G(p),取值区间 [ − 1 , 1 ] [-1,1] [−1,1];
- 给评价一个“可靠“(reliability)评分 R ( u , p ) R(u,p) R(u,p),取值区间 [ 0 , 1 ] [0,1] [0,1]。
迭代计算这三个评分,直到收敛。每轮迭代做如下计算:
- 固定品质和可靠评分,计算公平评分 F ( u ) = ∑ ( u , p ) ∈ O u t ( u ) R ( u , p ) ∣ O u t ( u ) ∣ F(u)=\dfrac{\sum_{(u, p) \in Out(u)} R(u, p)}{|Out(u)|} F(u)=∣Out(u)∣∑(u,p)∈Out(u)R(u,p)
- 固定公平和可靠评分,计算品质评分 G ( p ) = ∑ ( u , p ) ∈ I n ( p ) R ( u , p ) ∗ s c o r e ( u , p ) ∣ I n ( p ) ∣ G(p)=\dfrac{\sum_{(u, p) \in In(p)}R(u,p)*score(u,p)}{|In(p)|} G(p)=∣In(p)∣∑(u,p)∈In(p)R(u,p)∗score(u,p)
- 固定公平和品质评分,计算可靠评分 R ( u , p ) = 1 γ 1 + γ 2 ( γ 1 ∗ F ( u ) + γ 2 ∗ ( 1 − ∣ s c o r e ( u , p ) − G ( p ) ∣ 2 ) ) R(u,p)=\dfrac{1}{\gamma_1+\gamma_2}(\gamma_1 * F(u) + \gamma_2*(1-\dfrac{|score(u,p)-G(p)|}{2})) R(u,p)=γ1+γ21(γ1∗F(u)+γ2∗(1−2∣score(u,p)−G(p)∣))
迭代过程:
- 初始化用户、商品和评价的公平、品质和可靠值都为1;
- 然后每一轮迭代,依次计算 F ( u ) F(u) F(u)、 R ( u , p ) R(u,p) R(u,p)和 G ( p ) G(p) G(p),直到收敛。
优点:
- 理论证明,确定会收敛。
- 不是很明白第二点所说的迭代次数和收敛上限的关系。
- 可线性扩展。
置信传播
算法基本思路:迭代在邻居之间互相进行消息传递,表达对于对方状态的置信度,在全网节点达成一致后,结束迭代。
消息传递的一个小样例:获取全网的节点数量。
- 方法:每个节点向自己的邻居发送自己+自己的后继和前驱节点数量。最终所有节点都知道全图有多少节点。
- 问题:不能出现循环路径,否则无法结束递归。
可循环置信传播算法
基于这个消息传递的思路,产生了可循环置信传播算法。
算法思路:
先定义公式里的定义
- 标签-标签潜力矩阵 ψ \psi ψ:一个节点和它的邻居之间的依赖性。 ψ ( Y i , Y j ) \psi(Y_i, Y_j) ψ(Yi,Yj)表示在节点 j j j的邻居 i i i处于状态 Y i Y_i Yi的条件下,它是状态 Y j Y_j Yj的概率。
- 先验置信 ϕ \phi ϕ: ϕ i ( Y i ) \phi_i(Y_i) ϕi(Yi)是节点 i i i处于状态 Y i Y_i Yi的概率。
- 消息 m i → j ( Y j ) m_{i \to j}(Y_j) mi→j(Yj):是节点 i i i认为节点 j j j处于状体 Y j Y_j Yj的概率。
- L \mathcal{L} L:节点可能处于的所有状态。
算法:
- 所有节点的初始消息都设为1;
- 对每个节点,向其邻居发送消息,消息内容是: m i → j ( Y j ) = α ∑ Y i ∈ L ψ ( Y i , Y j ) ϕ ( Y i ) ∏ k ∈ N i j m k → i ( Y i ) , 其 中 , ∀ Y j ∈ L m_{i \to j}(Y_j)=\alpha\displaystyle\sum_{Y_i \in \mathcal{L}}\psi(Y_i, Y_j)\phi(Y_i)\prod_{\mathcal{k} \in \mathcal{N}_{i\\j}}m_{k \to i}(Y_i), 其中,\forall Y_j \in \mathcal{L} mi→j(Yj)=αYi∈L∑ψ(Yi,Yj)ϕ(Yi)k∈Nij∏mk→i(Yi),其中,∀Yj∈L
- 当迭代到收敛后,最后进行一次消息传递,对每个节点计算它的状态概率: b i ( Y i ) = α ϕ ( Y i ) ∏ j ∈ N i m j → i ( Y i ) , 其 中 , ∀ Y i ∈ L b_i(Y_i)=\alpha\phi(Y_i)\prod_{j\in \mathcal{N_i}}m_{j \to i}(Y_i), 其中,\forall Y_i \in \mathcal{L} bi(Yi)=αϕ(Yi)j∈Ni∏mj→i(Yi),其中,∀Yi∈L
需要注意的是,这里的 Y i Y_i Yi其实就是分类的类别。
问题:
算法对于有环形的图结构会重复计算环里传递的消息,造成结果不正确。
但是在实际的图结构里,这种环形的结构一般都比较的长,且环中间一般都会有更多的链接。所以这种环形结构的影响比较小。
算法优点:
- 容易实现,且容易并行化;
- 通用性好,适用于任意的图结构,且潜力矩阵可以超越点-点的对。而且是可以用反向传播的方式来自动学习的。
缺点:
这个算法还是不保证收敛,特别是对于有环形的图数据。
置信传播算法的应用
课程给了置信算法的论文里的应用:发现竞价网站里的欺诈用户。
论文是:Netprobe: A Fast and Scalable System for Fraud Detection in Online Auction Networks Pandit et al., World Wide Web conference 2007
具体就不写了,其中最核心的就是对于潜在矩阵的定义。这个是上面公式里没有给出的。所以这里就贴一下截图。
只要通过反向传播学习这个矩阵里的一个参数即可。这个矩阵是依赖于业务经验给出的。