KGNN-LS细节

作者: windUtterance | 来源:发表于2020-05-10 23:37 被阅读0次

    论文中的符号含义

    U = {u1, ... , ...} 用户集合

    V = {v1, ... , ...} 项目集合

    Y 用户-项目历史交互矩阵

    G = (\varepsilon ,R) 知识图谱

    \varepsilon  = (e1, ... , ...) 实体集合

    R = {r1, ... , ...} 关系集合

    \varepsilon \V 非项目实体集合

    s_{u} (r) 特定用户的关系评分函数

    A_{u}  在图谱上用户u的相邻矩阵

    D_{u}  A_{u} 的对角矩阵

    E 原始实体特征

    H^l ,l = 0,1,...,L-1 模型中第l层的实体表示

    W^l ,l = 0,1,...,L-1 模型中第l层的转换矩阵

    l_{u}(e),e\in \varepsilon  项目相关性标注函数

    l_{u}^*(e),e\in \varepsilon   最小能量标注函数

    \hat{l}_{u}(v),v\in V  项目u的预测相关性标签

    R(A_{u} ) 在用户u的相邻矩阵上做标签平滑正则化

    论文模型的细节

            第一步是将异构的知识图谱转换为特定用户的权重图谱(从论文字面理解原来的一份知识图谱会被转换为用户份的权重图谱?但是从代码里好像不是这样的。。。),转换后的图谱能够描述用户的喜爱偏好。通过给定的特定用户关系评分函数s_{u}(.) ,知识图谱G会被转换为特定用户的相邻矩阵A_{u} ,其中A_{u}^ {ij}表示实体i和实体j之间的关系对于用户u的重要程度,该值等于0时即为两个实体之间没有关系。

            第二步使用多个前馈层来聚合相邻实体的特征以更新实体特征矩阵。具体来说,层级的前向传播可表示为:H_{l+1}=\sigma (D_{u}^{-1/2}A_{u} D_{u}^{-1/2}H_{l} W_{l} ),l=0,1,...,L-1 。其中D_{u}^{-1/2} 是用来对A_{u} 进行归一化的同时保持H_{l} 稳定的,W_{l} 是特定层的训练权重矩阵,\sigma 是非线性激活函数,L是模型层数。单个的GNN层通过将其自身和图谱上直接邻居进行混合变换来计算一个实体的特征表示。

            最后,项目v和用户u的预测交互概率会通过\hat{y}_{uv} =f(u,v_{u} )来计算得到,其中v_{u} (H_{l} 矩阵的第v行)是项目v的最终特征向量,值得注意的是因为相邻矩阵A_{u} 是针对特定用户的,所以v_{u} 也是针对特定用户的。

            本文全程采用论文中的music数据集为例讲解model.py文件模型构建过程。首先加载模型参数,其中值得一提的是adj_entity和adj_relation,它们是data_loader.py处理得到的知识图谱邻域实体矩阵和邻域关系矩阵,形状均为(9366,8),其中9366是图谱中实体的数量,8是模型采样的邻域大小,换言之是每个实体(这里关系不能去采样关系,否则adj_realtion的第一维大小就是60了)采样相邻的8个实体(关系)。然后构建模型输入:用tf的占位符函数创建user_indices用户索引,item_indices项目索引,和labels标签,它们都是(128,1)的列向量,这里128是batch_size即模型每批次的训练大小。接下来构建模型:用tf初始化三个权重矩阵,分别为user_emb_matrix用户嵌入矩阵,形状为(1872,16),其中1872是用户的总数,16是特征维度;entity_emb_matrix实体嵌入矩阵,形状为(9366,16),其中9366是图谱中的实体数量;relation_emb_matrix关系嵌入矩阵,形状为(60,16),其中60是图谱中的关系种类。然后用tf的embedding_lookup方法从用户嵌入矩阵中拿出训练批次大小的用户嵌入赋值给user_embeddings,再用模型的get_neighbors方法得到n跳的实体列表和关系列表,它们的数据结构是 {[batch_size, 1], [batch_size, n_neighbor], [batch_size, n_neighbor^2], ..., [batch_size, n_neighbor^n_iter]}这样子的,也就是说entites列表存储了当前批次项目的本身、一跳邻域实体、二跳邻域实体......,relations列表存储了一跳邻域关系、二跳邻域关系......。紧接着用聚合器来聚合相邻实体的特征以更新当前批次的项目嵌入矩阵item_embeddings。下一步进行标签平滑正则化。再下来就是将用户特征和项目特征相乘并降维得到预测的交互概率。最后设计目标损失函数:损失函数共三部分:1.基本损失,即labels和预测的交互概率scores之间的loss;2.L2损失:三个权重矩阵的损失和聚合器每次的权重矩阵损失;3.边缘权重的损失:标签平滑对边缘权重进行的正则化造成的损失。将这三个损失相加得到目标损失函数,然后用tf的优化器优化。

    标签平滑正则化:

            在本篇论文的模型中,边缘权重D_{u}^{-1/2}A_{u}D_{u}^{-1/2} 是不断学习得到的,因此就需要监督训练。再进一步来说,就是需要对边权重进行更多的正则化,以辅助实体特征的学习,并帮助更有效地将其推广到未观察到的交互,通俗来讲就是增强模型的泛化能力防止过拟合。

            标签平滑假设的内容是图谱中相邻的实体更可能具有类似的相关性标签。上述假设促使论文作者选择了能量函数EE(l_{u},A_{u})=\frac{1}{2} \sum_{e_{i}\in \varepsilon ,e_{j}\in \varepsilon }A_{u}^{ij}(l_{u}(e_{i})-l_{u}(e_{j}))^2   。其中最小能量标注函数有谐波性质(推导证明可以去原论文中查看过程,再此赘述没有意义),该性质最大的作用是揭示了每个非项目实体的最小能量标记值l_{u}^*是其邻居实体的最小标记能量总和求平均。该事实又进一步引出了标签传播方案,该方案会不断重复下面两个步骤:(1)传播所有实体的标签,传播方式为D_{u}^{-1}A_{u}l_{u}(\varepsilon )\rightarrow l_{u}(\varepsilon ),其中l_{u}(\varepsilon )是所有实体的标签向量 (2)将所有项目实体的标签重置为初始标签:l_{u}(V)\rightarrow Y[u,V]^T ,其中l_{u}(V)是所有项目实体的标签的向量,Y[u,V]=[y_{uv_{1}},y_{uv_{2}},...]是初始标签。重复上述两个步骤将会使最开始随机的项目相关标签l_{u}逼近至稳定的最小能量标签l_{u}^*

            标签传播方案提供了一种到达相关标签函数最小能量值的方法。但是,l_{u}^*并不会为更新权重矩阵A_{u}提供任何有用的信号,因为l_{u}^*中标注的部分l_{u}^*(V)等于它们真实的相关性标签Y[u,V],但与此同时我们却不知道未标注部分也就是非项目实体l_{u}^*(\varepsilon /V)的相关性标签。为了解决这个问题,作者采用将留一法损失降到最低的方案:假设我们拿出一个单独的项目实体v并将其视为未标注,然后我们用其他实体(项目实体和费项目实体)来预测这个拿出来的项目实体的标签。这个预测过程和标签传播方案大同小异,不同点在于项目v的标签是隐藏的需要被计算。按这个方案来看,用户u真实的相关性标签y_{uv}和预测得到的标签\hat{l}_{u}(v)之间的差异当作监督信号来对边缘权重进行正则化:R(A)=\sum_{u}R(A_{u})=\sum_{u} \sum_{v} J(y_{uv},\hat{l}_{u}(v)),其中J是交叉熵损失函数,最后一个理想的边缘权重矩阵A应该再现每个拿出的项目实体的真实标签,同时还满足相关性标签的平滑。

    相关文章

      网友评论

        本文标题:KGNN-LS细节

        本文链接:https://www.haomeiwen.com/subject/hhrenhtx.html