总体大纲如下图
记录下:9月6号
组合两个模型:TransH
和TUP
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算法实现知识图谱补全实验
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的的预测值
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