UltraGCN: Ultra Simplification of Graph Convolutional Networks for Recommendation
概
对 LightGCN 的改进, 思路还是很有意思的.
符号说明
- \(A\), 邻接矩阵;
- \(D\), degree matrix;
- \(\hat{A} = A + I\);
- \(\hat{D} = D + I\);
- \(\mathcal{N}_v\), 结点 \(v\) 的一阶邻居
Motivation
-
LightGCN:
\[E^{(l+1)} = (\hat{D}^{-1/2} \hat{A} \hat{D}^{-1/2}) E^{(l)}; \]注: 原版的 LightGCN 没有 self-loops, 不过影响不大;
-
对于每个特征, 等价于:
\[e_u^{(l+1)} = \frac{1}{d_u + 1} e_u^{(l)} + \sum_{k \in \mathcal{N}_u} \frac{1}{\sqrt{d_u + 1} \sqrt{d_k + 1}} e_k^{(l)}, \\ e_i^{(l+1)} = \frac{1}{d_i + 1} e_i^{(l)} + \sum_{v \in \mathcal{N}_i} \frac{1}{\sqrt{d_v + 1} \sqrt{d_i + 1}} e_v^{(l)}. \\ \] -
假设我们用 \(e_u^{(l+1)} \cdot e_i^{(l+1)}\) 来表示二者的 score, 它可以表示为:
\[\tag{5} \begin{array}{ll} e_u^{(l+1)} \cdot e_i^{(l+1)} &= \alpha_{ui} (e_u^{(l)} \cdot e_i^{(l)}) +\sum_{k \in \mathcal{N}_u} \alpha_{ik} (e_i^{(l)} \cdot e_k^{(l)}), \\ &+\sum_{v \in \mathcal{N}_i} \alpha_{uv} (e_u^{(l)} \cdot e_v^{(l)}) +\sum_{k \in \mathcal{N}_u, v \in \mathcal{N}_i} \alpha_{kv} (e_k^{(l)} \cdot e_v^{(l)}). \\ \end{array} \]其中
\[\alpha_{ui} = \frac{1}{(d_u + 1)(d_i + 1)}, \\ \alpha_{ik} = \frac{1}{\sqrt{d_u + 1}\sqrt{d_k + 1}(d_i + 1)}, \\ \alpha_{uv} = \frac{1}{\sqrt{d_v + 1}\sqrt{d_i + 1}(d_u + 1)}, \\ \alpha_{kv} = \frac{1}{\sqrt{d_u + 1}\sqrt{d_k + 1}\sqrt{d_v + 1}\sqrt{d_i + 1}}, \\ \] -
通过观察, 作者认为 LightGCN 存在下面三个问题:
- 通过 \(\alpha_{ik}, \alpha_{uv}\) 可以发现, LightGCN 对于 (u, v) 或者 (i, k) 这些同属 user 或 item 的结点的权重不一致. (个人感觉比较牵强, 我感觉没啥问题)
- (5) 难以抓住结点的动态的变化 (虽然有点道理, 但是没见文章解决这一问题啊);
- 随着层数的加深:\[\lim_{l \rightarrow \infty} (\hat{D}^{-1/2}\hat{A}\hat{D}^{-1/2})_{i,j}^l = \frac{\sqrt{(d_i + 1)(d_j + 1)}}{2m + n}. \]其中 \(n\) 是边的数目, \(m\) 是点的数目. 所以 LightGCN 的层数过深会产生严重的 over-smoothing 现象.
本文方法
-
让我们来看下, 当 \(e_u\) 收敛的时候:
\[\tag{9} e_u = \frac{1}{d_u + 1} e_u + \sum_{k \in \mathcal{N}_u} \frac{1}{\sqrt{d_u + 1} \sqrt{d_k + 1}} e_k \\ \Rightarrow e_u = \sum_{i \in \mathcal{N}(u)} \beta_{u,i} e_{i}, \: \beta_{u,i} = \frac{1}{d_u}\sqrt{\frac{d_u + 1}{d_i + 1}}. \]注: 实际上此时 \(E = \tilde{A} E \Rightarrow LE = 0\), \(E\) 为 \(L\) 的特征向量组 (特征值为 0);
-
作者希望添加一个约束, 使得 \(E\) 尽可能满足 (9), 使得 \(E\) 具有接近 infinite layers 的信息:
\[\tag{10} \max_E \sum_{i \in \mathcal{N}} \beta_{u, i} e_u^T e_i, \forall u \in U, \]其中 \(e_u, e_i\) 都是标准化后的, 即 \(\|e_u\| = \|e_i\| = 1\).
-
它大抵等价于如下的损失
\[\mathcal{L}_C = - \sum_{u \in U} \sum_{i \in \mathcal{N}_u} \beta_{u,i} \log (\sigma(e_u^Te_i)), \]这么做的原因是便于优化;
-
进一步地, 为了防止 over-smoothing, 改写成:
\[\mathcal{L}_C =- \sum_{(u, i) \in \mathcal{N}^+} \beta_{u,i} \log (\sigma(e_u^Te_i)) -\sum_{(u, j) \in \mathcal{N}^-} \beta_{u,j} \log (\sigma(-e_u^Te_j)). \] -
这仅是约束而已, 主损失采用 BCE Loss:
\[\mathcal{L}_O =- \sum_{(u, i) \in \mathcal{N}^+} \log (\sigma(e_u^Te_i)) -\sum_{(u, j) \in \mathcal{N}^-} \log (\sigma(-e_u^Te_j)). \] -
于是最后的损失是:
\[\mathcal{L} = \mathcal{L}_O + \lambda \mathcal{L}_C. \]
注: 作者还额外引入了 item-item 的信息, 比较类似, 这里不多赘述了.
代码
[official]