栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

DSSM+DeepFM

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 = None

def forward(self, x):
    user_embedding = self.user_tower(x)
    item_embedding = self.item_tower(x)
    if self.mode == "user":
        return user_embedding
    if 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 None
    input_user = self.embedding(x, self.user_features, squeeze_dim=True)
    # user DNN
    user_embedding = self.user_mlp(input_user)
    user_embedding = F.normalize(user_embedding, p=2, dim=1)
    return user_embedding

def item_tower(self, x):
    if self.mode == "user":
        return None
    input_item = self.embedding(x, self.item_features, squeeze_dim=True)
    # item DNN
    item_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_embedding
    if self.mode == "item":
        return item_embedding

    # 计算相似度
    y = torch.mul(user_embedding, item_embedding).sum(dim=2)
    y = y / self.temperature
    return y

def user_tower(self, x):
    # 用于inference_embedding阶段
    if self.mode == "item":
        return None
    input_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_embedding

def item_tower(self, x):
    if self.mode == "user":
        return None
    pos_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-组队学习

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990588.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号