推荐系统-召回层:user-item双塔架构

双塔模型被广泛应用于推荐系统的召回和粗排阶段,应用过程中也存在一定区别:
(1)负样本构造

召回:正样本是真实正例,负样本通过采样(全局采样、batch内采样等)得到
粗排:要接近精排,样本与精排一致,正负样本都是从用户的真实正负例中选取
召回是从海量候选集中,要把用户可能感兴趣的或完全不相关的item区分开来,所以召回在线上所面对的数据环境,就是鱼龙混杂、良莠不齐,负样本除了曝光未点击的真实负例外,也要包含未曝光的样本,目的就是让训练样本尽量符合线上真实分布,让模型“见见世面“。

(2)线上预测

召回:把item向量导入faiss,建立索引,获取user向量,在faiss中做近邻搜索,得到topn相似item作为召回候选
粗排:item向量不需要导入faiss建立索引,只需要以kv方式存储起来,获取user向量,kv库中检索获取item向量,通过内积得到粗排打分,选取topn送入精排




参考资料:
推荐系统(十八) 大厂实践经验学习:双塔模型
推荐系统(十一) 2021-2022年工业界推荐算法实践经验汇总

### 关于召回模型在推荐系统中的应用及实现 #### 双塔模型概述 双塔模型作为推荐系统中用于粗排/召回阶段的重要工具,在实际应用中表现出显著的优势。该类模型通过建两个独立的子网络来分别处理用户物品特征,最终计算两者之间的相似度得分以决定是否召回特定项目[^1]。 #### DSSM模型的历史地位 DSSM(Deep Structured Semantic Model)被认为是现代塔架的先驱者之一。它最初被设计用来解决搜索引擎中的查询文档匹配问题,后来逐渐扩展到更广泛意义上的推荐任务上[^3]。 #### 特征融合时机的区别 值得注意的是,在整个推荐流程的不同阶段,特征融合发生的时刻有所不同。具体来说,召回过程通常发生在较早的时间点,并在此期间仅利用基础属性完成初步筛选;而在后续更为精细的选择过程中,则会引入更多复杂的上下文信息来进行综合评判[^2]。 #### 训练方式的选择 对于如何有效地训练这样一个两分支结化的神经网络而言,存在多种策略可供选择: - **Pointwise**:这种方法将每一对用户-商品组合视为单独的数据实例进行二分类预测; - **Pairwise**:关注成对比较关系,旨在优化目标函数使得正样本相对于负样例具有更高的评分; - **Listwise**:考虑全局列表顺序,试图直接最小化排名损失从而获得更好的整体效果。 ```python import tensorflow as tf from tensorflow.keras import layers, models class UserTower(models.Model): def __init__(self, input_dim, embedding_dim=128): super(UserTower, self).__init__() self.embedding_layer = layers.Embedding(input_dim=input_dim, output_dim=embedding_dim) def call(self, inputs): embeddings = self.embedding_layer(inputs) pooled_output = tf.reduce_mean(embeddings, axis=1) return pooled_output class ItemTower(models.Model): def __init__(self, input_dim, embedding_dim=128): super(ItemTower, self).__init__() self.embedding_layer = layers.Embedding(input_dim=input_dim, output_dim=embedding_dim) def call(self, inputs): embeddings = self.embedding_layer(inputs) pooled_output = tf.reduce_mean(embeddings, axis=1) return pooled_output def build_model(user_input_shape, item_input_shape, num_classes=1): user_inputs = layers.Input(shape=user_input_shape) item_inputs = layers.Input(shape=item_input_shape) user_tower = UserTower(input_dim=max_user_id + 1)(user_inputs) item_tower = ItemTower(input_dim=max_item_id + 1)(item_inputs) dot_product = tf.reduce_sum(tf.multiply(user_tower, item_tower), axis=-1) outputs = layers.Dense(num_classes, activation='sigmoid')(dot_product) model = tf.keras.models.Model([user_inputs, item_inputs], outputs) return model ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值