如何用Tensorflow Recommenders(TFRS)实现内容推荐系统?求资源与技术指导
基于TensorFlow Recommenders(TFRS)构建内容推荐系统的方案与资源
一、核心适配思路
TFRS的双塔模型并非只能用于协同过滤,完全可以改造为内容推荐模式——无需用户交互数据,仅依靠目标用户的偏好特征与物品属性特征构建匹配任务:
- 物品塔:以物品的结构化/非结构化属性(如类别、标签、文本描述等)为输入,通过DNN或预训练模型(如处理文本的BERT)生成物品嵌入向量。
- 用户塔:若仅针对单个目标用户,直接将其偏好特征(如喜欢的类别、兴趣标签)作为固定输入生成用户嵌入;若面向多用户(无交互数据),则以每个用户的属性特征作为输入。
- 检索任务改造:不用交互数据做正负样本,而是定义用户偏好与物品属性的匹配目标——比如将用户明确喜欢的物品设为正样本,随机选取其他物品作为负样本;若无历史偏好,可先通过规则生成初始正样本再微调模型。
二、可落地实现步骤
数据预处理
- 物品数据:提取所有特征,分类特征(如
item_category)用StringLookup+Embedding处理,文本特征(如item_description)用TextVectorization转换为向量,数值特征直接归一化后输入。 - 用户数据:提取目标用户的偏好特征,同样做编码处理,若只有单个用户,可将其特征固定为模型输入。
- 物品数据:提取所有特征,分类特征(如
构建双塔模型示例
import tensorflow as tf import tensorflow_recommenders as tfrs # 物品特征处理与嵌入塔 class ItemTower(tf.keras.Model): def __init__(self, cat_feature_vocabs): super().__init__() # 分类特征处理器 self.cat_processors = { feat: tf.keras.Sequential([ tf.keras.layers.StringLookup(vocabulary=vocab, mask_token=None), tf.keras.layers.Embedding(len(vocab)+1, 16) ]) for feat, vocab in cat_feature_vocabs.items() } # 文本特征处理器(以物品描述为例) self.text_processor = tf.keras.Sequential([ tf.keras.layers.TextVectorization(max_tokens=1000), tf.keras.layers.Embedding(1001, 32), tf.keras.layers.GlobalAveragePooling1D() ]) # 特征融合层 self.fusion = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation="relu"), tf.keras.layers.Dense(32) ]) def call(self, inputs): embeddings = [] # 拼接分类特征嵌入 for feat, processor in self.cat_processors.items(): embeddings.append(processor(inputs[feat])) # 添加文本特征嵌入 text_emb = self.text_processor(inputs["item_desc"]) embeddings.append(text_emb) # 融合生成最终物品嵌入 concat_emb = tf.concat(embeddings, axis=1) return self.fusion(concat_emb) # 用户特征处理与嵌入塔 class UserTower(tf.keras.Model): def __init__(self, user_cat_vocabs): super().__init__() self.cat_processors = { feat: tf.keras.Sequential([ tf.keras.layers.StringLookup(vocabulary=vocab, mask_token=None), tf.keras.layers.Embedding(len(vocab)+1, 16) ]) for feat, vocab in user_cat_vocabs.items() } self.fusion = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation="relu"), tf.keras.layers.Dense(32) ]) def call(self, inputs): embeddings = [] for feat, processor in self.cat_processors.items(): embeddings.append(processor(inputs[feat])) concat_emb = tf.concat(embeddings, axis=1) return self.fusion(concat_emb) # 自定义内容推荐模型 class ContentRecommender(tfrs.models.Model): def __init__(self, user_tower, item_tower, item_dataset): super().__init__() self.user_tower = user_tower self.item_tower = item_tower # 定义检索任务,用物品数据集作为候选池 self.retrieval_task = tfrs.tasks.Retrieval( metrics=tfrs.metrics.FactorizedTopK( candidates=item_dataset.batch(128).map(self.item_tower) ) ) def compute_loss(self, features, training=False): user_emb = self.user_tower(features["user_feats"]) pos_item_emb = self.item_tower(features["pos_item_feats"]) # 计算匹配损失 return self.retrieval_task(user_emb, pos_item_emb)
- 训练与推理
- 训练阶段:构造用户特征与正样本物品特征的配对数据,TFRS的Retrieval任务会自动采样负样本完成训练。
- 推理阶段:将目标用户特征输入用户塔得到嵌入,与所有物品的嵌入计算余弦相似度,取TopN作为推荐结果。
三、必备前置知识
- Keras基础:掌握
tf.keras核心层(Embedding、Dense、TextVectorization等)的使用,理解模型构建与训练流程。 - 特征工程:学会处理结构化(分类、数值)和非结构化(文本)特征的编码方法。
- 推荐系统基础:理解基于内容推荐的核心逻辑——用户特征与物品特征的匹配,明确其与协同过滤的差异。
- TFRS核心组件:熟悉
tfrs.tasks.Retrieval、tfrs.metrics.FactorizedTopK的作用,理解双塔模型的匹配逻辑。
四、学习资源
- TFRS官方文档:重点关注模型自定义、特征处理模块,虽然示例以协同过滤为主,但特征工程和模型构建逻辑可直接复用。
- TensorFlow官方教程:深入学习
tf.keras的特征预处理工具(如CategoryEncoding、TextVectorization),这是构建内容推荐的基础。 - 经典书籍:《推荐系统实践》中基于内容推荐的章节,先理解核心逻辑,再结合TFRS完成落地。
内容的提问来源于stack exchange,提问作者Levan Gvalia
相关产品推荐
相关产品推荐

