本文首发于公众号:code路漫漫,欢迎关注
一篇17年的文章,图推荐里面常见的baseline
Motivation
两种类型的推荐系统
- content based:从用户和物品的特征入手
- 协同过滤:从交互历史入手
本文的idea是把协同过滤技术应用在图上
用户物品的交互历史可以自然而然的表示成二部图上的链接,图上的结点分别是用户和物品。转换为图后,预测评分任务就变为预测结点之间的链接。
Contribution
提出了GC-MC框架(a graph-based auto-encoder framework for matrix completion),在图上卷积,在六个数据集上达到了SOTA的效果
Solution
看上图可以知道,GCN技术的几个问题
- 如何更有效地生成用户和物品的表征
- side information 如何提高model效果
- encoder和decoder的实现细节
下面一一介绍
encoder
使用交互物品的特征
用户和物品的处理方式相同,接下来只介绍生成用户表征的处理方式
encoder可以写成
Z
=
f
(
X
,
A
)
Z=f(X,A)
Z=f(X,A)的形式,将
N
X
D
NXD
NXD维的特征矩阵
X
X
X和图邻接矩阵
A
A
A作为输入,得到
N
X
E
NXE
NXE维的embedding矩阵
Z
Z
Z
前面说的encoder可以生成用户和物品的表示,那么有公式
[
U
,
V
]
=
f
(
X
,
A
)
[U,V] =f(X,A)
[U,V]=f(X,A),其中U是用户的表示,V是物品的表征
考虑到评分类型R可能由多个类型组成,我们对每个类型的评分单独抽取出来做一个矩阵,那么
Z
Z
Z的表示形式变为
[
U
,
V
]
=
f
(
X
,
M
1
,
.
.
.
,
M
r
)
[U,V] = f(X,M_1,...,M_r)
[U,V]=f(X,M1,...,Mr),这里
M
r
M_r
Mr是用户i评分r的交互矩阵,交互过的值为1,没交互过的值为0
这也是论文的一个创新点,之前的encoder直接把用户u的交互矩阵M传进去,而这里先把M按照评分数量拆分成多个0-1矩阵,然后再传入
用户可以被它交互过的物品表示
这里j表示物品j,i是用户i,c是常量,xj是物品j的feature,Wr是特定的评分矩阵
当我们计算出u之后,使用公式2计算用户i的中间输出(也就是dense layer的输出)
h
i
h_i
hi
最后传给公式3就能得到用户的最终表示
u
i
u_i
ui了
公式3是encoder的雏形,这里只用了物品的feature,稍后我们还会看到它的改进形式
引入边信息
side information可以用来增强用户的表示,但是当边信息本身含有的信息量不足的时候,直接将其和用户特征一起输入到网络中会导致模型性能下降
在论文中,side information使用单独的通道处理(separate processing channel)
考虑用户i的表示生成
其中
u
i
=
σ
(
W
h
i
)
u_i = \sigma(Wh_i)
ui=σ(Whi)部分等同于公式3,
x
i
f
x_i^f
xif是用户i本身的特征,
b
b
b代表bias
那么最终的用户表征由两部分组成
- 交互物品的feature
- 本身的feature,这里称为边信息
至此encoder的表示如下:
decoder
decoder的作用是接受用户、物品的表征用于生成重构矩阵,然后把重构矩阵和真实的结果矩阵比较计算Loss,使用梯度下降训练整个model
这里decoder计算方法就是公式4和公式5所述
训练方法
权重分配
这一块论文讲得不是很清楚
之前提到,论文把不同类型的评分拆分成单独的矩阵处理,然而并不是所有用户和物品都拥有相同数量的评分。这会导致某些参数的优化次数非常少
对于encoder的权重计算方法,使用ordinal weight sharing策略
T
s
T_s
Ts是什么论文里没说
对于decoder的权重计算方法,使用basis weight sharing策略
模型的整体框架
Evaluation
数据集
score:
使用边信息的效果
Summarization
本文在encoder和decoder上进行改进
- 对评分矩阵进行拆分
- 使用单独通道处理边信息(只使用交互历史是协同过滤思想,论文中还引入和物品、用户本身的feature,这被称为边信息)
- 使用特殊的权重计算方法
论文的code:https://github.com/riannevdberg/gc-mc