【论文阅读】Unifying Knowledge Graph Learning and Recommendation

Unifying Knowledge Graph Learning and Recommendation: Towards a Better Understanding of User Preferences

总体大纲如下图

记录下:9月6号

组合两个模型:TransHTUP
TransH:考虑关系和实体的1对N,N对1,N对N的情况,实现kg的补全增强
TUP:包括偏好引入和超平面映射

  • 偏好归纳组件
    给定user-item对(u,i),组件从latent factors集合P中归纳出一种偏好。
    两种策略:
    Hard Strategy:假设当用户对项目做出决定时,只有一个偏好生效
    soft Strategy:注意力机制融合多个偏好

  • 超平面映射
    和TransH思想类似,user-item对看作h,t,用户对item的偏好看作r,用偏好p代替kg中的r.

    在这里插入图片描述
    在这里插入图片描述

KTUP: 组合上面两个模型
同时提出加强item embedding,perference embedding

	i' = i + e;
	p' = p + r
	w_p' = w_p + w_r

然后进行超平面映射,得到新的打分函数

问题:知识图谱的补全增强体现在哪里?TransH算法进行知识图谱的补全

记录下:9月7号,学习TransH知识图谱补全
参考:
transH算法实现知识图谱补全实验

【论文阅读】Unifying Knowledge Graph Learning and Recommendation_第1张图片
TransH认为:TransE算法在处理自反关系,多对一,一对多,多对多关系时,会使不同的实体拥有相同的嵌入(h+r=t,h+r=t’=>t=t’)
提出了超平面,将头实体和尾实体映射到同一个超平面上,dr是两者在超平面上的平移

知识图谱补全:链接预测
通过TransH建模后,得到了每个实体和关系的嵌入向量,利用嵌入向量,可以进行知识图谱的链接预测
将三元组(head,relation,tail)记为(h,r,t)

链接预测分为三类:
头实体预测:(?,r,t)
关系预测:(h,?,t)
尾实体预测:(h,r,?)
但原理很简单,利用向量的可加性即可实现。以(h,r,?)的预测为例:

假设t’=h+r,则在所有的实体中选择与t’距离最近的向量,即为t的的预测值

问题: w p ′ w_p' wp怎么获得
在这里插入图片描述

jTransUP.py perference归纳代码

# u_e, i_e : batch * dim or batch * item * dim
def getPreferences(self, u_e, i_e, use_st_gumbel=False):
    # use item and user embedding to compute preference distribution
    # pre_probs: batch * rel, or batch * item * rel
    # p = p+r
    # torch.t转置
    # pre_probs是相似度分数,不清楚为啥/2
    pre_probs = torch.matmul(u_e + i_e, torch.t(self.pref_embeddings.weight + self.rel_embeddings.weight)) / 2
    if use_st_gumbel:
        # ST Gumbel采样,获得一个热矢量
        pre_probs = self.st_gumbel_softmax(pre_probs)

    # 注意力参数和相似度得分成正比
    r_e = torch.matmul(pre_probs, self.pref_embeddings.weight + self.rel_embeddings.weight) / 2
    # norm就是w_p',pref_norm_embeddings像是正则化后的pref_embedding
    norm = torch.matmul(pre_probs, self.pref_norm_embeddings.weight + self.norm_embeddings.weight) / 2

    return pre_probs, r_e, norm

pref_norm_embeddings的初始化

pref_norm_weight = torch.FloatTensor(self.rel_total, self.embedding_size)
nn.init.xavier_uniform(pref_norm_weight)
self.pref_norm_embeddings = nn.Embedding(self.rel_total, self.embedding_size)
self.pref_norm_embeddings.weight = nn.Parameter(pref_norm_weight)
normalize_pref_norm_emb = F.normalize(self.pref_norm_embeddings.weight.data, p=2, dim=1)
self.pref_norm_embeddings.weight.data = normalize_pref_norm_emb

根据norm超平面映射

_, r_e, norm = self.getPreferences(u_e, ie_e, use_st_gumbel=self.use_st_gumbel)

proj_u_e = projection_transH_pytorch(u_e, norm)
proj_i_e = projection_transH_pytorch(ie_e, norm)

def projection_transH_pytorch(original, norm):
    return original - torch.sum(original * norm, dim=len(original.size())-1, keepdim=True) * norm

你可能感兴趣的:(知识图谱,论文阅读)