引言

在推荐系统中,用户历史行为序列是极其重要的信息源。用户最近的点击、点赞、收藏、转发等行为能够有效反映其即时兴趣,无论是在召回、粗排还是精排阶段,合理利用这些行为序列都能显著提升推荐效果。本文将系统介绍用户行为序列建模的几种经典方法:简单平均法、DIN模型(深度兴趣网络)以及SIM模型(基于搜索的用户兴趣建模)。

1. 简单平均法(Last-N Average)

基本思想

Last-N 特征是指用户最近的 nnn 次交互(如点击、点赞等)的物品 ID。对这些物品 ID 进行嵌入(Embedding),得到 nnn 个向量,然后对这些向量取平均,将得到的均值向量作为用户的一种特征表示。该方法计算简单,易于实现,可广泛应用于召回双塔模型、粗排三塔模型以及精排模型中。
在这里插入图片描述

数学表达如下:

设用户最近 nnn 次交互的物品嵌入向量为 v1,v2,…,vn\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_nv1,v2,,vn,则用户特征向量 u\mathbf{u}u 为:

u=1n∑i=1nvi\mathbf{u} = \frac{1}{n} \sum_{i=1}^{n} \mathbf{v}_i u=n1i=1nvi

实践经验

除了使用物品 ID 嵌入外,还可以结合类目等特征进行嵌入拼接,这样通常比仅使用 ID 嵌入效果更好。不过,取平均是一种较为基础的操作,目前更主流的方法是使用注意力机制,尽管这会带来更大的计算开销。
在这里插入图片描述

注:不同公司的系统基础设施水平存在差异,实践中需根据实际情况选择适合的方案。


2. DIN模型:引入注意力机制

动机

简单平均法对所有历史行为一视同仁,忽略了用户兴趣的动态变化。DIN(Deep Interest Network)通过引入注意力机制,对用户历史行为进行加权平均,权重由候选物品与历史行为的相似度决定。

模型结构

对于每个候选物品,计算其与用户 Last-N 个历史行为物品的相似度(记为 aia_iaii=1,…,ni=1,\dots,ni=1,,n),以这些相似度为权重,对历史行为物品的嵌入向量进行加权求和,得到用户兴趣表示。

在这里插入图片描述

数学表达如下:

u=∑i=1nai⋅vi\mathbf{u} = \sum_{i=1}^{n} a_i \cdot \mathbf{v}_i u=i=1naivi

其中 aia_iai 是候选物品与第 iii 个历史物品的相似度,可以通过内积、余弦相似度或更复杂的网络计算。

其实本质上是注意力机制
在这里插入图片描述

适用范围

  • 适用于精排模型。
  • 不适用于双塔或三塔模型,因为注意力机制需要同时看到用户历史行为和候选物品,而双塔模型在用户塔中无法获取候选物品信息。

参考文献:Zhou et al. Deep Interest Network for Click-Through Rate Prediction. In KDD, 2018.


3. SIM模型:处理长期行为序列

动机

DIN 模型的计算复杂度与行为序列长度 nnn 成正比,因此通常只能处理几百个最近的行为,难以利用更长期的用户历史。SIM(Search-based Interest Modeling)模型通过两阶段搜索机制,在保留长期兴趣的同时控制计算量。

主要目的是保留用户的长期兴趣

  • DIN 注意力层的计算量 ∝\propto n(用户行为序列的长度)
  • 只能记录最近几百个物品,否则计算量太大
  • 缺点:关注短期兴趣,遗忘长期兴趣

增加用户行为序列可以显著推荐系统的各项指标,但是让行为序列变长是不划算,

  • 目标:保留用户长期行为序列(n很大),而且计算量不会过大。

  • DIN对LastN向量做加权平均,权重是相似度

  • 如果LastN物品与候选物品差异很大,则权重接近零

  • 快速排除掉与候选物品无关的LastN物品,降低注意力层的计算量

SIM模型

工业界公认SIM模型是有效的

  • 保留用户长期行为记录,n的大小可以是几千
  • 对于每个候选物品,在用户LastN记录中做快速查找,找到k个相似物品,比如k = 100.
  • 把LastN变成TopK,然后输入到注意力层
  • SIM模型减少计算量(从n降低到K)

两阶段机制

第一阶段:搜索(Search)

从用户长期行为序列(例如几千个历史物品)中快速检索出与候选物品最相关的 kkk 个物品(例如 k=100k=100k=100)。具体方法有两种:

  • Hard Search:根据候选物品的类目,筛选出同类目的历史物品。实现简单,无需训练。
  • Soft Search:将物品表示为嵌入向量,通过最近邻搜索(如 KNN)找出与候选物品最相似的 kkk 个历史物品。效果更好,但对工程基础设施要求较高。
第二阶段:注意力聚合

将筛选出的 kkk 个物品输入注意力层(类似 DIN),计算加权和作为用户兴趣表示。

时间信息的利用

SIM 模型通常引入时间信息来增强长期行为序列的表征:

  • 记录用户与每个历史物品交互的时刻距今的时间间隔 δ\deltaδ
  • δ\deltaδ 进行离散化(如划分为 1天、7天、30天、1年等区间),并嵌入为向量 d\mathbf{d}d
  • 将物品嵌入 v\mathbf{v}v 与时间嵌入 d\mathbf{d}d 拼接,共同作为历史行为的表征。

x=[v;d]\mathbf{x} = [\mathbf{v}; \mathbf{d}] x=[v;d]

在这里插入图片描述

为什么SIM需要使用时间信息?

  • DIN 仅处理短期行为,时间跨度小,时间因素影响不显著。
  • SIM 处理长期行为,时间越久远的行为重要性通常越低,引入时间信息可以带来显著提升。

结论

  • 长序列(长期兴趣)优于短序列(近期兴趣)。
  • 注意力机制优于简单平均。
  • Soft Search 优于 Hard Search,但取决于工程基础。
  • 使用时间信息对效果有提升。

参考文献:Qi et al. Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Through Rate Prediction. In CIKM, 2020.


总结

用户行为序列建模是推荐系统的核心环节。从简单平均到注意力机制(DIN),再到基于搜索的长期兴趣建模(SIM),每一步演进都在更好地平衡效果与计算效率。实践中,需根据业务需求、数据规模和基础设施条件选择合适的方法,并灵活引入时间等辅助信息以进一步提升模型性能。


Reference

王树森 bilibili推荐系统

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QGIS二次开发01:环境配置-OSGeo4W镜像

写在前面: 本笔记根据多方资料整理而成,旨在为QGIS二次开发提供学习参考。内容仅供交流学习,欢迎共同探讨。 一、关于QGIS QGIS 是一个功能强大的桌面GIS软件本身,为用户提供了图形化界面(GUI)来进行地图制…

对接旅游行业安全需求:旅游安全急救实训室的功能构建与育人目标

随着我国旅游行业的快速发展,游客安全需求日益凸显,安全应急处置能力已成为旅游服务人才的核心竞争力。旅游安全急救实训室作为旅游服务与管理专业中的重要教学场所,其功能构建与育人目标影响人才培养质量与行业安全水平。点击获取方案 一、行…

Typora处理markdown文件【给.md文档加水印】

①文件→偏好设置→外观→打开主题文件夹②在打开的文件夹中放入水印图像③右键点击github.css文件后,点击编辑,进入编辑页面④将代码块中内容粘贴到文件最后 更多效果请自行探索 #write::before {content: "CSDN果子当夜宵:bigxie.blog…

基于单片机的六足机器人控制系统设计

基于单片机的六足机器人控制系统设计摘 要本设计主要是基于单片机的六足机器人控制系统设计,综合分析六足机器人的结构、步态和控制算法,结合云端服务器、WIFI 技术、蓝牙技术、语音识别技术和手势识别技术进行多种控制模式的设计,并提出不同…

RK3568 Trust

文章目录1、环境介绍2、前言3、ARM TrustZone3.1、什么是ARM TrustZone3.2、cpu特权等级3.3、ARM Trusted Firmware4、Rockchip 平台的 Trust4.1、实现机制4.2、启动流程4.3、生命周期4.4、Trust 编译打包流程分析5、总结1、环境介绍 硬件:飞凌ok3568-c开发板 软件…

C语言数据结构——详细讲解《二叉树与堆的基本概念》

C语言数据结构——详细讲解《二叉树与堆的基本概念》前言一、树的基础概念1.1 为什么需要树?1.2 树的定义与结构1.3 树的核心术语1.3 树的核心术语1.4 树的表示方法(孩子兄弟表示法)结构定义为什么用孩子兄弟表示法?1.5 树的实际应…

STAR-CCM+|雷诺数回顾

【1】引言 前序已经学习了K-epsilon湍流模型溯源的基础知识,今天再学习一些更为基础的知识,回顾一下雷诺数ReReRe。 【2】雷诺数定义 雷诺数公式为: ReρvDμRe\frac{\rho vD}{\mu}ReμρvD​ 式中, ρ\rhoρ——流体密度&…

Java中的死锁

锁的合理使用能够保证共享数据的安全性,但是 使用不当也会可能引起死锁。1. 死锁概念 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求…

基于STM32F103C8T6的智能家居健康环境监测系统

项目开发背景 随着城市化进程加速和居民生活水平提升,人们对家居环境健康与安全的需求日益增强。现代住宅常因装修材料、密闭空间及外部污染导致甲醛超标、PM2.5浓度升高、温湿度失衡等问题,长期暴露此类环境中易引发呼吸道疾病、过敏反应等健康隐患。传…

2025职场进阶:B端产品经理必备的计算机专业技能精要

当前企业级服务市场竞争日益激烈,2025年的B端产品经理不仅需要深厚的行业认知,还必须具备扎实的计算机专业技能,才能设计出真正符合技术趋势与业务需求的企业级产品。而其中,人工智能技术已经成为B端产品不可或缺的组成部分&#…

有效三角形的个数(数组单调性)

目录 一:题目链接 二:题目思路 三:代码实现 一:题目链接 题目的要求是找出当前数组能组成三角形三元组的个数。 二:题目思路 有一种暴力枚举解法,利用三层 for 循环来一一枚举三元组的情况,如…

Rust在医疗系统中的应用:安全、性能与合规性实践(上)

Rust在医疗系统中的应用:安全、性能与合规性实践 摘要 医疗系统对软件安全与性能存在严苛双重需求,既需抵御内存漏洞、数据加密风险等安全威胁(如历史医疗设备因软件问题召回案例所示),又需满足电子健康记录(EHR)系统、医学影像处理等高并发数据场景的性能要求,同时需…

读写锁 shared_mutex 共享互斥量介绍

文章目录读数据对数据没有影响,为什么还需要shared_mutex1. 保证读取数据的“一致性”和“时效性”2. 协调“读”与“写”的竞争关系总结好的,我们来详细介绍 C17 中的 std::shared_mutex(共享互斥量,俗称读写锁)的使用…

Nestjs框架: 基于装饰器与Guards的完成RBAC权限系统设计与实现

概述 在现代权限管理系统中,RBAC(基于角色的访问控制)是广泛采用的一种模型RBAC 核心思想是通过角色来管理用户权限通过角色绑定用户、资源和权限,实现细粒度的访问控制为了实现这一目标,我们需要在数据库中设计合理的…

机器学习如何精准预测高值

一、概念理解“机器学习对于高值的预测保守”,这是建模里很常见的现象,尤其在生态、气候、遥感这类数据分布高度偏斜的场景。通常可以从以下几个角度理解:1. 数据分布与样本稀缺在训练集里,高值样本往往非常少,远低于中…

蜂窝物联网模组:智能门禁产品上的关键部件

随着物联网技术的快速发展,蜂窝物联网模组正逐步成为智能门禁系统的关键通信组件。蜂窝模组凭借其广覆盖、高可靠性和低功耗特性,正从传统门禁系统的补充角色转变为智能门禁的核心通信组件,尤其在智慧社区、商业楼宇和政府机构等场景中展现出…

[光学原理与应用-417]:非线性光学 - 线性光学(不引发频率的变化)与非线性光学(引发频率变化)的异同

一、定义与物理机制:线性响应 vs 非线性响应线性光学定义:光与物质相互作用时,介质的极化强度与入射光电场强度呈线性关系(Pϵ0​χ(1)E),输出光强与输入光强成正比(Iout​∝Iin​)-…

深入探讨AI在三大核心测试场景中的应用

随着人工智能(AI)技术的迅猛发展,软件测试领域正经历深刻变革。传统手动测试和基于规则的自动化测试已难以应对日益复杂的系统架构与海量用户行为。AI测试通过引入机器学习、自然语言处理、计算机视觉等技术,显著提升了测试效率、…

[linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘

🌟 各位看官好,我是egoist2023! 🌍 Linux Linux is not Unix ! 🚀 今天来学习C语言缓冲区和内核缓存区的区别以及缓存类型。 👍 如果觉得这篇文章有帮助,欢迎您一键三连&#xff0c…

一、计算机的数据存储

计算机的世界只有0和1。 1.1 进制 十进制整数->二进制整数:除2倒取余二进制->十进制:权值相加法 结论:1位8进制值 3位二进制值,1位十六进制值 4位二进制值 public class JinZhiDemo {public static void main(String[]…