日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

知识图谱论文阅读(九)【转】推荐系统遇到知识图谱之MKR模型

發(fā)布時間:2024/7/5 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 知识图谱论文阅读(九)【转】推荐系统遇到知识图谱之MKR模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文哥的學(xué)習(xí)筆記: https://www.jianshu.com/p/af5226c7fbbb

知識圖譜特征學(xué)習(xí)在推薦系統(tǒng)中的應(yīng)用步驟大致有以下三種方式:


依次訓(xùn)練的方法主要有:Deep knowledge-aware Network(DKN)
聯(lián)合訓(xùn)練的方法有: Ripple Network
交替訓(xùn)練主要采用multi-task的思路,主要方法有: Multi-task Learning for KG enhanced Recommendation(MKR)

1、MKR原理介紹

由于推薦系統(tǒng)中的物品和知識圖譜中的實體存在重合,因此可以采用多任務(wù)學(xué)習(xí)的框架,將推薦系統(tǒng)和知識圖譜特征學(xué)習(xí)視為兩個分離但是相關(guān)的任務(wù),進(jìn)行交替式的學(xué)習(xí)。

MKR的模型框架如下圖,其中左側(cè)是推薦系統(tǒng)任務(wù),右側(cè)是知識圖譜特征學(xué)習(xí)任務(wù)。推薦部分的輸入是用戶和物品的特征表示,點(diǎn)擊率的預(yù)估值作為輸出。知識圖譜特征學(xué)習(xí)部分使用的是三元組的頭節(jié)點(diǎn)和關(guān)系作為輸入,預(yù)測的尾節(jié)點(diǎn)作為輸出

由于推薦系統(tǒng)中的物品和知識圖譜中的實體存在重合,所以兩個任務(wù)并非相互獨(dú)立。所以作者在兩個任務(wù)中設(shè)計了交叉特征共享單元(cross-feature-sharing units)作為兩者的連接紐帶。

交叉特征共享單元是一個可以讓兩個任務(wù)交換信息的模塊。由于物品向量和實體向量實際上是對同一個對象的兩種描述,他們之間的信息交叉共享可以讓兩者都獲得來自對方的額外信息,從而彌補(bǔ)了自身的信息稀疏性的不足,其結(jié)構(gòu)如下:


關(guān)于這個交叉單元具體實現(xiàn),大家可以參照代碼進(jìn)行理解。

最后是損失函數(shù)部分,由于是交替訓(xùn)練的方式,所以在訓(xùn)練時首先固定推薦系統(tǒng)模塊的參數(shù),訓(xùn)練知識圖譜特征學(xué)習(xí)模塊的參數(shù);然后固定知識圖譜特征學(xué)習(xí)模塊的參數(shù),訓(xùn)練推薦系統(tǒng)模塊的參數(shù)。

推薦系統(tǒng)模塊是點(diǎn)擊率預(yù)估模型,損失函數(shù)是對數(shù)損失加l2正則項;知識圖譜特征學(xué)習(xí)模塊希望預(yù)測得到的tail向量和真實的tail向量相近,因此首先計算二者的內(nèi)積(內(nèi)積可近似表示向量之間的余弦相似度),內(nèi)積經(jīng)過sigmoid之后取相反數(shù),再加上l2正則項,即得到了知識圖譜特征學(xué)習(xí)模塊的損失。關(guān)于損失的計算,我們在代碼里可以更清楚的看到

本文的代碼地址為:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-MKR-Demo
參考代碼地址為:https://github.com/hwwang55/MKR
數(shù)據(jù)下載地址為:https://pan.baidu.com/s/1uHkQXK_ozAgBWcMUMzOfZQ 密碼:qw30

在對數(shù)據(jù)進(jìn)行預(yù)處理后,我們得到了兩個文件:kg_final.txt和rating_final.txt

rating_final.txt數(shù)據(jù)形式如下,三列分別是user-id,item-id以及l(fā)abel(0是通過負(fù)采樣得到的,正負(fù)樣本比例為1:1)。

kg_final.txt格式如下,三類分別代表h,r,t(這里entity和item用的是同一套id):

好了,接下來我們重點(diǎn)介紹一下我們的MKR框架的構(gòu)建。

2. 模型

模型輸入

模型輸入有以下幾個部分: 用戶的id、物品的id、推薦系統(tǒng)部分的lablel、知識圖譜三元組的head、relation、tail的對應(yīng)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')

低層網(wǎng)絡(luò)構(gòu)建

低層網(wǎng)絡(luò)指下面的部分:

可以看到,user_id、item_id、head_id以及relation_id首先轉(zhuǎn)換為對應(yīng)的Embedding,user_id和relation_id經(jīng)由多層神經(jīng)網(wǎng)絡(luò)向上傳播、而head_id和item_id經(jīng)過交叉單元進(jìn)行傳播!

def _build_low_layers(self,args):self.user_emb_matrix = tf.get_variable('user_emb_matrix', [self.n_user, args.dim])self.item_emb_matrix = tf.get_variable('item_emb_matrix', [self.n_item, args.dim])self.entity_emb_matrix = tf.get_variable('entity_emb_matrix', [self.n_entity, args.dim])self.relation_emb_matrix = tf.get_variable('relation_emb_matrix', [self.n_relation, args.dim])# [batch_size, dim]self.user_embeddings = tf.nn.embedding_lookup(self.user_emb_matrix, self.user_indices)self.item_embeddings = tf.nn.embedding_lookup(self.item_emb_matrix, self.item_indices)self.head_embeddings = tf.nn.embedding_lookup(self.entity_emb_matrix, self.head_indices)self.relation_embeddings = tf.nn.embedding_lookup(self.relation_emb_matrix, self.relation_indices)self.tail_embeddings = tf.nn.embedding_lookup(self.entity_emb_matrix, self.tail_indices)for _ in range(args.L):user_mlp = Dense(input_dim=args.dim,output_dim=args.dim) #通過dense網(wǎng)絡(luò)tail_mlp = Dense(input_dim=args.dim,output_dim = args.dim) #通過dense網(wǎng)絡(luò)cc_unit = CrossCompressUnit(args.dim) #這是交叉單元self.user_embeddings = user_mlp(self.user_embeddings)self.item_embeddings,self.head_embeddings = cc_unit([self.item_embeddings,self.head_embeddings])self.tail_embeddings = tail_mlp(self.tail_embeddings)self.vars_rs.extend(user_mlp.vars)self.vars_rs.extend(cc_unit.vars)self.vars_kge.extend(tail_mlp.vars)self.vars_kge.extend(cc_unit.vars)

接下來,我們來看一下交叉單元的代碼:

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_output

item對應(yīng)的embedding用v表示,head對應(yīng)的embedding用e表示,二者初始情況下都是batch * dim大小的。過程如下:
1、v擴(kuò)展成三維batch * dim * 1,e擴(kuò)展成三維batch * 1 * dim,隨后二者進(jìn)行矩陣相乘v * e,我們知道三維矩陣相乘實際上是后兩維進(jìn)行運(yùn)算,因此得到c_matrix的大小為 batch * dim * dim
2、對得到的c_matrix進(jìn)行轉(zhuǎn)置,得到c_matrix_transpose,大小為batch * dim * dim。這相當(dāng)于將e擴(kuò)展成三維batch * dim * 1,v擴(kuò)展成三維batch * 1 * dim,隨后二者進(jìn)行矩陣相乘e * v。這是兩種不同的特征交叉方式。
3、對c_matrix和c_matrix_transpose 進(jìn)行reshape操作,變?yōu)?#xff08;batch * dim ) * dim的二維矩陣
4、定義兩組不同的參數(shù)和偏置,分別得到交叉后的v_output和e_output.

高層網(wǎng)絡(luò)構(gòu)建

高層網(wǎng)絡(luò)指下面的部分:

對于推薦部分,可以采用內(nèi)積直接得到CTR的預(yù)估值,也可以經(jīng)過多層神經(jīng)網(wǎng)絡(luò)得到預(yù)估值;對于知識圖譜部分,將head和relation對應(yīng)的向量進(jìn)行拼接,經(jīng)過多層神經(jīng)網(wǎng)絡(luò),得到一個tail對應(yīng)向量的預(yù)估值,并與真實的tail向量計算內(nèi)積。代碼如下:

def _build_high_layers(self,args):#RSuse_inner_product = Trueif use_inner_product:self.scores = tf.reduce_sum(self.user_embeddings*self.item_embeddings,axis=1)else:self.user_item_concat = tf.concat([self.user_embeddings,self.item_embeddings],axis=1)for _ in range(args.H - 1):rs_mlp = Dense(input_dim = args.dim * 2 , output_dim = args.dim * 2)self.user_item_concat = rs_mlp(self.user_item_concat)self.vars_rs.extend(rs_mlp.vars)rs_pred_mlp = Dense(input_dim=args.dim * 2,output_dim=1)self.scores = tf.squeeze(rs_pred_mlp(self.user_item_concat))self.vars_rs.extend(rs_pred_mlp)self.scores_normalized = tf.nn.sigmoid(self.scores)#KGEself.head_relation_concat = tf.concat([self.head_embeddings,self.relation_embeddings],axis=1)for _ in range(args.H - 1):kge_mlp = Dense(input_dim=args.dim * 2,output_dim = args.dim * 2)self.head_relation_concat = kge_mlp(self.head_relation_concat)self.vars_kge.extend(kge_mlp.vars)kge_pred_mlp = Dense(input_dim=args.dim * 2,output_dim = args.dim)self.tail_pred = kge_pred_mlp(self.head_relation_concat)self.vars_kge.extend(kge_pred_mlp.vars)self.tail_pred = tf.nn.sigmoid(self.tail_pred)self.scores_kge = tf.nn.sigmoid(tf.reduce_sum(self.tail_embeddings * self.tail_pred,axis=1))#self.rmse = tf.reduce_mean(tf.sqrt(tf.reduce_sum(tf.square(self.tail_embeddings - self.tail_pred),axis=1) / args.dim))

定義損失

推薦系統(tǒng)部分的損失是對數(shù)損失加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

知識圖譜特征學(xué)習(xí)模塊用上一步計算的scores_kge的相反數(shù)再加上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

總結(jié)

以上是生活随笔為你收集整理的知识图谱论文阅读(九)【转】推荐系统遇到知识图谱之MKR模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。