深度学习模型——双塔模型(Two-Tower Model)详解

        双塔模型是一种高效、灵活的深度学习模型结构,广泛用于推荐系统和信息检索等场景中。其核心思想是分别为两个实体(如用户和物品、查询和文档)构建独立的特征表示网络(两座塔),并在共享语义空间中通过相似性计算匹配它们。

下面将详细解释双塔模型的原理、架构和代码实现,从底层原理到每一步的设计和原因。


1. 双塔模型的核心思想

1.1 为什么需要双塔模型?
  1. 高效计算:传统推荐算法需要动态计算用户和所有物品之间的关系,计算量巨大。双塔模型通过预计算物品向量,只需实时计算用户向量和匹配分数。
  2. 独立特征建模:用户和物品(或查询和文档)的特征可以独立处理,便于扩展和并行计算。
  3. 语义匹配:不仅依赖于表面特征,还能捕捉深层语义关系。
1.2 双塔模型的目标

        学习一个共享语义空间,其中用户和物品的向量能够通过相似性度量(如余弦相似度)来反映它们的匹配程度。


2. 双塔模型的架构

双塔模型由以下几部分组成:

  1. 输入层

    • 用户特征塔接收用户特征(如年龄、历史行为等)。
    • 物品特征塔接收物品特征(如类别、标签等)。
  2. 特征表示层

    • 每个塔单独对其输入特征进行编码,生成低维稠密向量(Embedding)。
    • 用户塔和物品塔通常共享类似的网络结构。
  3. 匹配层

    • 在共享的语义空间中,通过相似性计算(如余弦相似度或点积)得到用户与物品的匹配分数。
  4. 损失函数

    • 常用对比损失(Contrastive Loss)或交叉熵损失,优化正样本匹配分数高、负样本匹配分数低的目标。

3. 模型的底层原理

3.1 输入层
  • 用户特征:用户的静态属性(如性别、年龄)和动态行为(如点击的物品历史)。
  • 物品特征:物品的静态属性(如类别、价格)和上下文特征(如时效性)。
示例:
  • 用户特征:[性别=男, 年龄=25, 历史行为= [电影1, 电影2]]
  • 物品特征:[类别=电影, 标签=动作, 热度=高]
3.2 特征表示

将用户和物品特征转化为向量表示(Embedding)。

公式:

        h_{u}=f_{user}(x_{u}),h_{v}=f_{item}(x_{v})

其中:

  • h_{u}​:用户的特征向量。
  • h_{v}​:物品的特征向量。
  • f_{user} , f_{item}​:用户塔和物品塔的神经网络。
3.3 匹配层

在共享空间中计算用户向量和物品向量的相似性,得到匹配分数:

        s(u,v) = \frac{h_{u} * h_{v} }{\left \| h_{u} \right \| * \left \| h_{v} \right \|} * cos(\theta )

3.4 损失函数

常用对比学习损失(Contrastive Loss):

        

  • v^{+}:正样本。
  • v^{-}:负样本集合。

4. 代码实现

以下代码实现双塔模型,并展示每一步的逻辑。

4.1 数据准备

模拟用户和物品特征的数据。

import numpy as np# 用户特征:性别(0=女, 1=男)、年龄(18-60)、历史行为(物品ID)
user_features = np.array([[1, 25, 101],  # 用户1[0, 30, 102],  # 用户2
])# 物品特征:类别(0=电影, 1=书籍)、热度(0-1)
item_features = np.array([[0, 0.8],  # 物品1[1, 0.5],  # 物品2
])# 标签:用户是否喜欢该物品
labels = np.array([1, 0])  # 用户1喜欢物品1, 用户2不喜欢物品2

4.2 构建双塔模型

使用 TensorFlow/Keras 实现用户塔和物品塔。

import tensorflow as tf
from tensorflow.keras.layers import Input, Embedding, Dense, Flatten, Concatenate
from tensorflow.keras.models import Model# 参数设置
embedding_dim = 8  # 嵌入维度# 用户塔
user_input = Input(shape=(3,), name="user_input")  # 用户特征:性别、年龄、历史行为
user_embedding = Dense(embedding_dim, activation="relu")(user_input)  # 用户特征转向量# 物品塔
item_input = Input(shape=(2,), name="item_input")  # 物品特征:类别、热度
item_embedding = Dense(embedding_dim, activation="relu")(item_input)  # 物品特征转向量# 匹配层:余弦相似度
similarity = tf.keras.layers.Dot(axes=-1, normalize=True, name="cosine_similarity")([user_embedding, item_embedding]
)# 构建模型
model = Model(inputs=[user_input, item_input], outputs=similarity)
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])# 打印模型结构
model.summary()

4.3 模型训练

用户—物品 对的数据训练模型。

# 模型训练
model.fit([user_features, item_features],  # 输入labels,                          # 标签epochs=10,batch_size=2
)

4.4 召回与匹配

利用训练好的双塔模型进行召回。

# 测试用户特征
test_user = np.array([[1, 28, 101]])  # 性别=男, 年龄=28, 历史行为=物品101# 测试物品特征
test_items = np.array([[0, 0.9],  # 物品1[1, 0.7],  # 物品2
])# 计算相似度
scores = model.predict([test_user, test_items])
print("测试用户与物品的匹配分数:", scores)

5. 为什么这样设计?

5.1 独立塔的设计
  • 用户和物品特征的分离,使得特征可以独立编码,便于扩展。
  • 用户向量和物品向量可以预先计算,提高实时预测效率。
5.2 共享空间
  • 将用户和物品映射到同一个语义空间,便于直接比较。
5.3 相似性计算
  • 余弦相似度或点积是计算两个向量匹配度的高效方法。
5.4 对比学习
  • 对比损失通过拉近正样本、拉远负样本的方式,优化匹配效果。

6. 双塔模型的优缺点

优点
  1. 高效性:物品向量可以离线预计算,实时性好。
  2. 可扩展性:用户和物品特征分离设计,便于并行处理。
  3. 灵活性:适用于推荐系统、广告召回、语义匹配等多种场景。
缺点
  1. 冷启动问题:对新用户或新物品效果较差。
  2. 交互建模不足:用户和物品之间的深层交互信息可能未被充分利用。

总结

        双塔模型是一种简单而高效的语义匹配模型,通过用户塔和物品塔的独立建模,以及匹配层的相似性计算,实现了用户和物品之间的高效推荐。本文从原理到代码实现,逐步拆解了双塔模型的核心逻辑和设计思想,使其易于理解和应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34982.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

回溯里面的基本概念

1.深度优先遍历和深度优先搜索(DFS) 深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底...,不断递归重复此过程&#xff…

LeetCode 热题100(十五)【动态规划】(3)

15.7最长递增子序列(中等) 题目描述:leetcode链接 300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元…

springboot如何集成工作流审批流,流程设计器集成,业务表单和工作流绑定,详细步骤和实际案例参考(源码)

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…

02_Node.js模块化

02_Node.js模块化 知识点自测 以下代码运行的结果是多少&#xff1f; const arr [10, 20, 30] const result arr.map(val > val 1).reduce((sum, val) > sum val, 0) console.log(result) A&#xff1a;60 B&#xff1a;63 <details><summary>答案</…

vulnhub kioptirx1.2 超详细wp

探测 nmap --min-rate 10000 -p- 192.168.128.134 最小速率10000 nmap -sT -sV -sC -O 192.168.128.134 web打点 无弱口令 暴露cms寻找exp searchsploit LotusCMS -m 16982 [输入id号和参数m可以直接把东西复制到当前目录] 查看txt里面发现 都是xss没有rce github搜索到一个…

vulnhub靶场之【grotesque】三

前言 靶机&#xff1a;grotesque-3 192.168.1.44 攻击 &#xff1a;kali 192.168.1.16 都是虚拟机环境&#xff0c;桥接模式 主机发现 使用arp-scan -l或者netdiscover -r 192.168.1.1/24搜索 信息收集 使用nmap扫描 防止有遗漏&#xff0c;再扫描全端口 网站信息收集 …

大规模模型部署、推理的工具:Xinference

有没有 Xinference之前&#xff0c;如果想要部署应用一个开源模型&#xff0c;可能会面临以下一些情况和挑战&#xff1a; 自行开发推理框架&#xff1a; 需要投入大量的时间和精力来构建一个可靠且高效的推理框架&#xff0c;包括处理模型加载、资源管理、请求调度等复杂的任务…

C语言选择法排序

C语言编程&#xff0c;用选择法对数组中4个整数按由大到小排序 1、代码如下&#xff1a; #include<stdio.h> #include<math.h> #include<string.h>int main() {void sort(int array[],int n);printf("测试开始\n");int nums[] {2,3,4,1};sort(n…

SpringBoot的validation参数校验

文章目录 前言一、引入validation 依赖二、validation中的注解说明 &#xff08;1&#xff09;Validated&#xff08;2&#xff09;Valid&#xff08;3&#xff09;NotNull&#xff08;4&#xff09;NotBlank&#xff08;5&#xff09;NotEmpty&#xff08;6&#xff09;Patte…

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…

docker学习笔记(四)--DockerFile

文章目录 一、什么是Dockerfile二、docker build命令三、dockerfile指令3.1 FROM3.2 ENV3.3 WORKDIR3.4 RUN3.5 CMD3.6 ENTRYPOINT3.7 EXPOSE3.8 ARG3.9 ADD3.10 COPY3.11 VOLUME 四、dockerfile示例 一、什么是Dockerfile Dockerfile 是用于构建 Docker 镜像的脚本文件&#…

撰写技术文档的关键步骤和核心要点

编写项目的技术文档是一个重要且细致的任务&#xff0c;它不仅有助于项目的当前开发团队理解系统的结构和工作原理&#xff0c;还为未来的维护和扩展提供了宝贵的参考资料。以下是撰写技术文档时应遵循的几个关键步骤和组成部分&#xff1a; 1. 概述 项目简介&#xff1a;简要…

Ant-Design-Vue 全屏下拉日期框无法显示,能显示后小屏又位置错乱

问题1&#xff1a;在全屏后 日期选择器的下拉框无法显示。 解决&#xff1a;在Ant-Design-Vue的文档中&#xff0c;很多含下拉框的组件都有一个属性 getPopupContainer可以用来指定弹出层的挂载节点。 在该组件上加上 getPopupContainer 属性,给挂载到最外层盒子上。 <temp…

【前端学习路线】(超详细版本)

先附上学习路线图&#xff1a;前端学习路线 第一阶段&#xff1a;前端入门&#xff08;htmlcss&#xff09; 前端最基本的知识&#xff0c;需要先将这些内容融汇贯通&#xff0c;学习后面内容才会不吃力。学习完可以做几个静态页练习一下。 推荐视频学习链接&#xff1a; 黑马程…

Vue生成类似于打卡页面

数据表格 <el-table :data"tableData" border height"calc(100vh - 240px)" :cell-style"cellFun"><el-table-column label"姓名" show-overflow-tooltip prop"name" align"center"/><el-table-co…

JVM学习《垃圾回收算法和垃圾回收器》

目录 1.垃圾回收算法 1.1 标记-清除算法 1.2 复制算法 1.3 标记-整理算法 1.4 分代收集算法 2.垃圾回收器 2.1 熟悉一下垃圾回收的一些名词 2.2 垃圾回收器有哪些&#xff1f; 2.3 Serial收集器 2.4 Parallel Scavenge收集器 2.5 ParNew收集器 2.6 CMS收集器 1.垃圾…

波特图方法

在电路设计中&#xff0c;波特图为最常用的稳定性余量判断方法&#xff0c;波特图的根源是如何来的&#xff0c;却鲜有人知。 本章节串联了奈奎斯特和波特图的渊源&#xff0c;给出了其对应关系和波特图相应的稳定性余量。 理论贯通&#xff0c;不在于精确绘…

【Java】2、集合框架 JCF

目录 CollectionListArrayList扩容机制System.arraycopy() 和 Arrays.copyOf()方法 LinkedList Set MapHashMap *重点&#xff1a; 底层机制&#xff08;源码&#xff09;应用场景 好处&#xff1a; 数组&#xff08;长度不可改&#xff0c;同一类型&#xff0c;增删不便&#…

P5461 赦免战俘

P5461 赦免战俘 #include <iostream> using namespace std; #include <algorithm> #include <vector> #include <cmath> void pardon(auto & matrix,int x,int y,int size){if(size 1) return;int half size / 2;for(int i x;i < x half;i …

GoTrackIt应用指南:共享单车时空轨迹可视化

GoTrackIt平台集成了对 Kepler.gl 可视化工具的部分功能进行了封装&#xff0c;通过引入 KeplerVis 类&#xff0c;显著简化了地理空间数据分析与展示的过程。利用这一类&#xff0c;开发者和数据分析师能够在网页端快速实现复杂地理数据的动态可视化&#xff0c;而无需深入掌握…