【推荐算法】userid是否需要建模

2024-02-07 16:36

本文主要是介绍【推荐算法】userid是否需要建模,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看到一个din的源码,将userid也构建了emb table。

于是调研了一下。即推荐算法需要建模userid吗?

深度学习推荐算法中user-id和item-id是否需要放入模型中作为特征进行训练呢?

深度学习推荐算法中user-id和item-id是否需要放入模型中作为特征进行训练呢? - 知乎

回答1:

  • 大厂会将user id / item id作为特征加入推荐模型,因为他们的数据足够多,算力足够强。
  • 大厂的APP的资深用户的行为足够将他们的user id embedding训练出来。
  • 大厂APP的热门物料会曝光十几万、甚至几十万次,这么多日志足够将这些item id embedding充分训练出来。
  • 如果小厂的推荐模型就不建议使用这些id当embedding了,数据不够,你加进去也学习不出来。

另外这些特征加入模型的位置也非常重要,否则也会被淹没在其他特征中,泯然众人矣。

回答2:

user_id和item_id作为强记忆型特征,是否要放入模型中作为特征进行训练是不能一概而论的。至少需要考虑业务场景的特点、如何放到模型中两个因素。

一般情况下在真实的业务场景中,无论是用户行为还是物品受欢迎程度都呈现长尾分布,少数头部的user和item占据了样本中的绝大多数,他们的id embedding能够得到充分的学习;另一方面,大量的尾部user和item的在样本中出现的频率很低,因而他们的id embedding在模型训练结束后也没有经过几次参数更新,基本上比随机初始化的状态好不了多少。默认情况下,推荐算法都是对中长尾的user和item(比如冷启动用户、新加入的物品)不友好的。

user_id和item_id作为特征直接加入到模型中,基于长尾分布的用户行为日志训练的推荐模型会越来越偏好头部物品,在导致“富者越富”的同时伤害中长尾物品的曝光机会和用户满意度。

通过分析精排模型的特征重要度,我们发现重要度较高的特征主要集中在少量的“记忆性”特征上,而大量的中长尾特征的重要度都很低。“记忆性”特征指的是没有泛化能力的特征,如用户ID、物品ID、用户对物品ID在过去一段时间上的行为统计,在这些特征上无法学到能够迁移到其他物品的知识。常规的模型结构会产生特征重要度的长尾分布,最终带来了模型偏好物品的长尾分布。

总的来说长尾分布越严重的场景越不建议直接加入user_id和item_id作为特征(也不是绝对的,可以加到特殊的模型结构中,参考下文)。当然这里的长尾分布是按照user和item分开看的,确实存在一些业务场景在user这个维度长尾分布很严重,但在item这个维度长尾分布并不突出,这种情况下是可以把item_id作为特征直接丢给模型学习的。

具体来说:

  • 物品池大小适中且基本保持稳定的场景建议加item_id特征;
  • 物品池频繁汰换的场景不建议加item_id特征;
  • 新用户占比很高的场景不建议加user_id特征;
  • 小流量场景不建议加user_id特征;
  • 其他场景大家根据user和item的分布情况自己评估;
  • 搞不清楚的时候可以考虑加item_id,不加user_id。

如何添加user_id、item_id特征?添加在模型结构的什么位置也是有讲究的

  • 物品池大小适中且基本保持稳定的场景item_id可以和其他特征放在一起训练
  • user_id等强区分性特征可以放在单独的塔中学习user bias;不和其他常规特征放在一起。
    • user bias是有些用户天然喜欢给物品打高分,浏览很广泛,有些用户天然很挑剔
  • 在长尾分布较严重的场景,user_id、item_id等强区分性特征embedding可以做特征粒度的dropout后再与其他特征embedding拼接。注意这里说的是“特征粒度的dropout”,不是常规的神经元粒度的dropout,也就是说特征embedding整体有一定的概率被丢弃(mask)或保留。
  • 也可以考虑使用@石塔西提到的“补水塔”结构。
  • 记忆型特征放在一个单独的塔中,泛化性特征放在另外的独立塔中;引入一个基于物品分布的门控机制,让头部的物品主要拟合“记忆特征”,中长尾物品主要拟合“泛化特征”。通过加权求和的方式在各个特征上学习到的表征特征,再去拟合最终的业务目标。参考谷歌的Cross Decoupling Network (CDN) 。

推荐算法user_id在train和serving时应该怎么用?

推荐算法user_id在train和serving时应该怎么用? - 知乎

第一次做推荐,看了几篇论文发现都会用到id类特征,比如在电商推荐领域,可能会用到user_id和item_id,随机初始化该类特征的向量表进行模型训练,那么在线服务时怎么对未出现的user_id进行预测呢?

回答1:

1、比较简单的做法,直接将那些新userid的embedding全部设置0,同样对那些出现次数少的userid也设置0,次数少说明该用户训练不够充分,可以直接设置0。

2、训练的时候对样本中的userid随机采样,将他们的userid都设置成同一个id,让其在模型中训练,serving的时候新用户以及出现次数少的用户的embedding就可以用该id的embedding。

回答2:

对于新id(新用户或新物料的id),一般作法是:

  • 训练时,随机初始化
  • 预测时,以全零向量代替。

多说一句,以上作法不是new user id或new item id的专利,而是Parameter Server的通常作法。比如遇到一个new tag, parameter server也是这样处理这个new tag在train & predict时的embedding的。

这样做是出于简单易行,但并非没有缺点。

为了解决这一问题,业界提出使用meta-learning的方式学习出new user/item id的最优初值。在《互联网大厂推荐算法实战》的8.2.3节对meta-learning在推荐冷启动中的应用有专门的论述。书中提出将meta-learning应用于推荐算法,不能简单照搬,而需要在应用范围、优化目标、生成方式三个方面进行改造。

回答3:

1.把这个user id丢掉,或者0向量填充

2.训练的时候对所有长尾的id共享一个向量作训练,预测出现新的id用这个表示

另外,既然是第一次出现的user id,必然是新用户了,可以对新用户单独做个冷启动模型。

参考:

推荐算法user_id在train和serving时应该怎么用? - 知乎

深度学习推荐算法中user-id和item-id是否需要放入模型中作为特征进行训练呢? - 知乎

电商推荐算法中,用户id和商品id是否需要作为模型特征? - 知乎

这篇关于【推荐算法】userid是否需要建模的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688303

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.