解耦自监督在序列化推荐中的应用 | KDD论文解读

简介: 让推荐不止懂你的下一刻心思,还更懂你的下下一刻、下下下一刻……

新零售智能引擎事业群出品

一、引言

主流推荐算法的训练过程要求模型根据用户过往行为拟合用户的下一个行为。但只拟合「下一个行为」存在局限:

  • 首先,推荐结果会趋向单一。比如当训练数据中存在大量类似“裙子、裙子、裙子、裙子、裙子、发饰”的序列时,由这个序列构造出来的大部分训练样本的标签都是裙子,这会导致学出来的算法在用户点击裙子后依然会倾向于推荐裙子、而不是推荐发饰之类的搭配类目;
  • 其次,用户经常同时有多个兴趣点、也经常处于好奇等原因产生新的兴趣点。这导致下一个点击未必与序列中过去的点击有关,比如“裙子、裙子、裙子、椅子”的序列,训练时要求模型去根据裙子拟合椅子似乎有点勉强。

image.png

本文提出让模型利用过去行为去拟合「整个未来行为序列」而非单单只是「下一个行为」的辅助训练思路。主要工作内容是结合解纠缠表征学习和自监督对比学习,来解决其中的两个主要挑战:

  • 如何压缩未来序列中相同兴趣点的多次点击,以便提高训练效率、平衡多个占比不均衡的未来兴趣点的权重。
  • 如何辨别并剔除未来序列中与过往行为毫不相干的部分。

二、方法

image.png

为了解决两个挑战,我们的解决方案如下:

  • 如何压缩未来序列中相同兴趣点的多次点击,以便提高训练效率、平衡多个占比不均衡的未来兴趣点的权重:先将未来点击序列中的每一个商品都映射为代表用户该时刻兴趣点的向量,e.g., 50+个商品映射到50+个向量。再对这些向量进行聚类,从而获得用户未来的多个主要兴趣向量,e.g., 50+个向量聚类成8个主要的向量。最后,训练过程要求模型去预测这些未来的兴趣向量,而不是预测未来点击的具体商品,这样我们就只需要拟合8个未来的向量,而不是拟合原本多达50+个的商品。

image.png

  • 如何辨别并剔除未来序列中与过往行为毫不相干的部分:我们额外要求模型预估训练数据中样本的可靠程度,比如,8个未来兴趣向量和8个历史向量的相似程度有多少、每条训练样本是噪声样本的可能性有多少。在训练时,较长时间将主要使用可靠程度较高的样本,比如从8个未来兴趣向量中挑选出最可靠的2~3个,只要求模型拟合这2~3个未来兴趣向量,剩下的5~6个未来兴趣可能和历史行为没太大关联,因此就不要求模型去预测这部分样本了。

image.png

需要注意的是,我们提出来的这个新的训练方式,i.e. 新的sequence-to-sequence loss,是叠加在传统的sequence-to-item loss上的,是两个losses一起同步优化的。因为推荐最终是要推荐商品的,传统的sequence-to-item依旧必不可少,sequence-to-sequence loss只是起到提升表征学习质量的辅助作用。
image.png

三、实验

在兴趣点复杂的公开数据上,离线的推荐指标提升十分显著:
image.png

在对训练集不断加入噪声后,seq2seq loss相比传统seq2item loss更鲁棒:
image.png

在手淘大规模的离线实验上,预测下五个点击的HitRate@50比只用传统sequence-to-item loss提升绝对值0.5%,具体为12.6% vs.12.1%。初版上线的结论是点击率等无明显变化、曝光发现性有些许提升,后续将在我们团队改进后的多向量模型MultCLR和具有消除曝光偏差作用的向量召回损失函数CLRec下继续迭代优化线上效果。

四、结论

我们提出了一种新的训练向量召回系统的训练方式,旨在弥补传统训练目标的短时造成的多样性缺乏及不鲁棒的问题。核心技术贡献是结合解纠缠表征学习和自监督学习。

更多数据挖掘内容查看:《KDD论文精华解读》

相关文章
|
6月前
|
JSON 编译器 Go
Golang深入浅出之-结构体标签(Tags):JSON序列化与反射应用
【4月更文挑战第22天】Go语言结构体标签用于添加元信息,常用于JSON序列化和ORM框架。本文聚焦JSON序列化和反射应用,讨论了如何使用`json`标签处理敏感字段、实现`omitempty`、自定义字段名和嵌套结构体。同时,通过反射访问标签信息,但应注意反射可能带来的性能问题。正确使用结构体标签能提升代码质量和安全性。
292 0
|
存储 JSON JavaScript
【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
110 0
|
JSON 网络协议 测试技术
反序列化介绍和应用实例 | 学习笔记
快速学习反序列化介绍和应用实例
反序列化介绍和应用实例 | 学习笔记
|
存储 Python NoSQL
scrapy_redis中序列化源码及其在程序设计中的应用
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
5549 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
21天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。