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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DSSM+DeepFM

發布時間:2023/12/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DSSM+DeepFM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、DSSM模型

1.1 DSSM模型架構

雙塔模型結構簡單,一個user塔,另一個item塔,兩邊的DNN機構最后一層(全連接層)隱藏單元個數相同,保證user embedding和item embedding維度相同,后面相似度計算(如cos內積計算),損失函數使用二分類交叉熵損失函數。DSSM模型無法像deepFM一樣使用user和item的交叉特征。

業界推薦系統常用多路召回(如CF召回、語義向量召回等,其中DSSM也是語義向量召回的其中一種),DSSM離線訓練和普通的DNN訓練相同。

代碼

class DSSM(torch.nn.Module):
def init(self, user_features, item_features, user_params, item_params, temperature=1.0):
super().init()
self.user_features = user_features
self.item_features = item_features
self.temperature = temperature
self.user_dims = sum([fea.embed_dim for fea in user_features])
self.item_dims = sum([fea.embed_dim for fea in item_features])

self.embedding = EmbeddingLayer(user_features + item_features)self.user_mlp = MLP(self.user_dims, output_layer=False, **user_params)self.item_mlp = MLP(self.item_dims, output_layer=False, **item_params)self.mode = Nonedef forward(self, x):user_embedding = self.user_tower(x)item_embedding = self.item_tower(x)if self.mode == "user":return user_embeddingif self.mode == "item":return item_embedding# 計算余弦相似度y = torch.mul(user_embedding, item_embedding).sum(dim=1)return torch.sigmoid(y)def user_tower(self, x):if self.mode == "item":return Noneinput_user = self.embedding(x, self.user_features, squeeze_dim=True)# user DNNuser_embedding = self.user_mlp(input_user)user_embedding = F.normalize(user_embedding, p=2, dim=1)return user_embeddingdef item_tower(self, x):if self.mode == "user":return Noneinput_item = self.embedding(x, self.item_features, squeeze_dim=True)# item DNNitem_embedding = self.item_mlp(input_item)item_embedding = F.normalize(item_embedding, p=2, dim=1)return item_embedding

二 Youtube DNN

第一部分 召回網絡:此階段主要目的是從百萬級的視頻中檢索出一小部分的視頻用于之后的排序操作,這部分需要處理的數據量非常大,速度要求快,所有使用的模型和特征都不能太復雜。召回網絡會根據用戶的歷史信息(比如用戶的歷史觀看、搜索等)進行召回,這一階段召回的視頻滿足用戶泛化的興趣,用戶之間的相似度則通過粗略的特征來表示,如用戶觀看視頻的ID,搜索query和用戶畫像。

第二部分 排序網絡:此階段會使用更加豐富和精細的用戶和視頻特征,預測用戶對召回的視頻打分,然后根據分數進行排序,依次展示給用戶。這部分最主要是能夠精準的將視頻推送給用戶,所以需要更加復雜的模型和特征來提升推薦效果。

第三部分 線下評估:評估指標有precision、recall、ranking loss等,最終的效果還是需要線上做A/B測試,關注的指標包括:點擊率、觀看時間等;需要指出的是,線上線下有時候并不能保持一致的結果。

代碼

class YoutubeDNN(torch.nn.Module):
def init(self, user_features, item_features, neg_item_feature, user_params, temperature=1.0):
super().init()
self.user_features = user_features
self.item_features = item_features
self.neg_item_feature = neg_item_feature
self.temperature = temperature
self.user_dims = sum([fea.embed_dim for fea in user_features])
self.embedding = EmbeddingLayer(user_features + item_features)
self.user_mlp = MLP(self.user_dims, output_layer=False, **user_params)
self.mode = None

def forward(self, x):user_embedding = self.user_tower(x)item_embedding = self.item_tower(x)if self.mode == "user":return user_embeddingif self.mode == "item":return item_embedding# 計算相似度y = torch.mul(user_embedding, item_embedding).sum(dim=2)y = y / self.temperaturereturn ydef user_tower(self, x):# 用于inference_embedding階段if self.mode == "item":return Noneinput_user = self.embedding(x, self.user_features, squeeze_dim=True)user_embedding = self.user_mlp(input_user).unsqueeze(1)user_embedding = F.normalize(user_embedding, p=2, dim=2)if self.mode == "user":return user_embedding.squeeze(1)return user_embeddingdef item_tower(self, x):if self.mode == "user":return Nonepos_embedding = self.embedding(x, self.item_features, squeeze_dim=False)pos_embedding = F.normalize(pos_embedding, p=2, dim=2)if self.mode == "item":return pos_embedding.squeeze(1)neg_embeddings = self.embedding(x, self.neg_item_feature, squeeze_dim=False).squeeze(1)neg_embeddings = F.normalize(neg_embeddings, p=2, dim=2)return torch.cat((pos_embedding, neg_embeddings), dim=1)

參考資料
Funrec-組隊學習

總結

以上是生活随笔為你收集整理的DSSM+DeepFM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。