知识图谱论文阅读(九)【转】推荐系统遇到知识图谱之MKR模型
文哥的學習筆記: https://www.jianshu.com/p/af5226c7fbbb
知識圖譜特征學習在推薦系統中的應用步驟大致有以下三種方式:
依次訓練的方法主要有:Deep knowledge-aware Network(DKN)
聯合訓練的方法有: Ripple Network
交替訓練主要采用multi-task的思路,主要方法有: Multi-task Learning for KG enhanced Recommendation(MKR)
1、MKR原理介紹
由于推薦系統中的物品和知識圖譜中的實體存在重合,因此可以采用多任務學習的框架,將推薦系統和知識圖譜特征學習視為兩個分離但是相關的任務,進行交替式的學習。
MKR的模型框架如下圖,其中左側是推薦系統任務,右側是知識圖譜特征學習任務。推薦部分的輸入是用戶和物品的特征表示,點擊率的預估值作為輸出。知識圖譜特征學習部分使用的是三元組的頭節點和關系作為輸入,預測的尾節點作為輸出
由于推薦系統中的物品和知識圖譜中的實體存在重合,所以兩個任務并非相互獨立。所以作者在兩個任務中設計了交叉特征共享單元(cross-feature-sharing units)作為兩者的連接紐帶。
交叉特征共享單元是一個可以讓兩個任務交換信息的模塊。由于物品向量和實體向量實際上是對同一個對象的兩種描述,他們之間的信息交叉共享可以讓兩者都獲得來自對方的額外信息,從而彌補了自身的信息稀疏性的不足,其結構如下:
關于這個交叉單元具體實現,大家可以參照代碼進行理解。
最后是損失函數部分,由于是交替訓練的方式,所以在訓練時首先固定推薦系統模塊的參數,訓練知識圖譜特征學習模塊的參數;然后固定知識圖譜特征學習模塊的參數,訓練推薦系統模塊的參數。
推薦系統模塊是點擊率預估模型,損失函數是對數損失加l2正則項;知識圖譜特征學習模塊希望預測得到的tail向量和真實的tail向量相近,因此首先計算二者的內積(內積可近似表示向量之間的余弦相似度),內積經過sigmoid之后取相反數,再加上l2正則項,即得到了知識圖譜特征學習模塊的損失。關于損失的計算,我們在代碼里可以更清楚的看到
本文的代碼地址為:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-MKR-Demo
參考代碼地址為:https://github.com/hwwang55/MKR
數據下載地址為:https://pan.baidu.com/s/1uHkQXK_ozAgBWcMUMzOfZQ 密碼:qw30
在對數據進行預處理后,我們得到了兩個文件:kg_final.txt和rating_final.txt
rating_final.txt數據形式如下,三列分別是user-id,item-id以及label(0是通過負采樣得到的,正負樣本比例為1:1)。
kg_final.txt格式如下,三類分別代表h,r,t(這里entity和item用的是同一套id):
好了,接下來我們重點介紹一下我們的MKR框架的構建。
2. 模型
模型輸入
模型輸入有以下幾個部分: 用戶的id、物品的id、推薦系統部分的lablel、知識圖譜三元組的head、relation、tail的對應id:
def _build_inputs(self):self.user_indices = tf.placeholder(tf.int32,[None],'user_indices')self.item_indices = tf.placeholder(tf.int32,[None],'item_indices')self.labels = tf.placeholder(tf.float32,[None],'labels')self.head_indices = tf.placeholder(tf.int32,[None],'head_indices')self.tail_indices = tf.placeholder(tf.int32,[None],'tail_indices')self.relation_indices = tf.placeholder(tf.int32,[None],'relation_indices')低層網絡構建
低層網絡指下面的部分:
可以看到,user_id、item_id、head_id以及relation_id首先轉換為對應的Embedding,user_id和relation_id經由多層神經網絡向上傳播、而head_id和item_id經過交叉單元進行傳播!
接下來,我們來看一下交叉單元的代碼:
v,e = inputsv = tf.expand_dims(v,dim=2) e = tf.expand_dims(e,dim=1)# [batch_size, dim, dim] c_matrix = tf.matmul(v, e) c_matrix_transpose = tf.transpose(c_matrix, perm=[0, 2, 1])# [batch_size * dim, dim] c_matrix = tf.reshape(c_matrix, [-1, self.dim]) c_matrix_transpose = tf.reshape(c_matrix_transpose, [-1, self.dim])v_output = tf.reshape(tf.matmul(c_matrix,self.weight_vv) + tf.matmul(c_matrix_transpose,self.weight_ev),[-1,self.dim]) + self.bias_ve_output = tf.reshape(tf.matmul(c_matrix, self.weight_ve) + tf.matmul(c_matrix_transpose, self.weight_ee),[-1, self.dim]) + self.bias_ereturn v_output,e_outputitem對應的embedding用v表示,head對應的embedding用e表示,二者初始情況下都是batch * dim大小的。過程如下:
1、v擴展成三維batch * dim * 1,e擴展成三維batch * 1 * dim,隨后二者進行矩陣相乘v * e,我們知道三維矩陣相乘實際上是后兩維進行運算,因此得到c_matrix的大小為 batch * dim * dim
2、對得到的c_matrix進行轉置,得到c_matrix_transpose,大小為batch * dim * dim。這相當于將e擴展成三維batch * dim * 1,v擴展成三維batch * 1 * dim,隨后二者進行矩陣相乘e * v。這是兩種不同的特征交叉方式。
3、對c_matrix和c_matrix_transpose 進行reshape操作,變為(batch * dim ) * dim的二維矩陣
4、定義兩組不同的參數和偏置,分別得到交叉后的v_output和e_output.
高層網絡構建
高層網絡指下面的部分:
對于推薦部分,可以采用內積直接得到CTR的預估值,也可以經過多層神經網絡得到預估值;對于知識圖譜部分,將head和relation對應的向量進行拼接,經過多層神經網絡,得到一個tail對應向量的預估值,并與真實的tail向量計算內積。代碼如下:
定義損失
推薦系統部分的損失是對數損失加l2正則項:
# RS self.base_loss_rs = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=self.labels, logits=self.scores)) self.l2_loss_rs = tf.nn.l2_loss(self.user_embeddings) + tf.nn.l2_loss(self.item_embeddings) for var in self.vars_rs:self.l2_loss_rs += tf.nn.l2_loss(var) self.loss_rs = self.base_loss_rs + self.l2_loss_rs * args.l2_weight知識圖譜特征學習模塊用上一步計算的scores_kge的相反數再加上l2正則項:
# KGE self.base_loss_kge = -self.scores_kge self.l2_loss_kge = tf.nn.l2_loss(self.head_embeddings) + tf.nn.l2_loss(self.tail_embeddings) for var in self.vars_kge:self.l2_loss_kge += tf.nn.l2_loss(var) self.loss_kge = self.base_loss_kge + self.l2_loss_kge * args.l2_weight總結
以上是生活随笔為你收集整理的知识图谱论文阅读(九)【转】推荐系统遇到知识图谱之MKR模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言数据类型_C语言基础数据类型
- 下一篇: 【十】推荐系统遇到知识图谱RippleN