推荐系统走向下一阶段最重要的三个问题

2023-12-21 01:58

本文主要是介绍推荐系统走向下一阶段最重要的三个问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:周国睿,阿里巴巴高级算法专家。

推荐系统和搜索引擎一直是比较火热的技术,因为离商业化比较近。她们是互联网领域两个衣着光鲜的美人,小腰一扭就是钱的味道。这几年凭借着两个红利:1. 互联网行业的经济红利,2. 硬件技术突破触发对深度学习带来的技术红利,推荐系统的效果有了比较明显的提升。

工业界的技术,从传统的人工先验特征设计组合 + 线性模型(如 logistics regression),逐步过渡到了 wide&deep、deepFM、DIN、GRU4REC、DIEN 等等深度学习模型。这些深度学习模型普遍采用 embedding 的技术先将原始输入的离散高维信号投影到一个低秩的 embedding 空间,然后用不同结构的神经网络去拟合输入信号和输出的关系。神经网络的非线性能力可以部分学习不同输入信号之间的非线性关系,把人力从特征设计解放出来,研发一些新的技术。硬件的发展让我们拥有更多的计算资源,可以收集和利用更多的样本。这些条件让高自由度的深度学习模型普遍能取得更好的效果。

为什么之前不说推荐系统有了比较明显进展,而仅仅说效果上有提升呢?因为从技术层面来说,进入深度学习时代后,推荐系统像是各个应用技术领域中比较玩赖的一个。在深度学习时代,我们大部分情况下只是在利用别的领域诞生出的技术,既没有真正从自有领域出发找出特色的问题,进而在尝试解决的过程中提出新的技术,也没有从这个商业价值转化这么直接的场景研发出可以推广到其他领域的技术。从社会服务模式来说,推荐系统并没有形成新的服务形态,推荐系统还仅仅是掌握在平台手中,使用推荐系统的用户和推荐内容提供方都没能很好的参与到推荐系统的建设当中。推荐系统真的懂用户要什么吗?有想过能为推荐系统的内容提供者做点什么吗?

简单的说就是这个领域拿了很多钱,却没办太多事

虽然我对自己从事这个领域的评价,嘴比较臭,但是我想的还是美的。我觉得推荐系统会走入下一阶段,成为一个能为社会提供更好的服务,同时还能源源不断的孕育新技术的好孩子。个人愚见,要步入下一阶段,我们需要研究三个重要问题:

1. 和真实应用场景贴近的统一 benchmark。我们需要一个工业级、可以迭代真实应用场景技术的数据集。

2. 推荐系统的可解释性。在我看来可解释性重要的不是指导研究人员之后怎么迭代方法,而是增加透明性,让使用推荐系统的用户和为推荐系统提供内容的生产者能看得懂推荐系统,能参与进来。

3. 算法对系统数据的 Confounding 问题。可以简单理解为反馈循环(Feedback Loop)问题,简单来说就是算法会决定推荐系统展示给用户内容,从而间接的影响了用户的行为。而用户的行为反馈数据又会决定算法的学习。形成一个循环。

 

数据集

统一可迭代的数据集对一个领域技术发展的推动作用不言而喻。图像领域从 mnist、cifar 到 ImageNet 等等,这些开放的数据集为从业者提供了公平迭代的土壤。每个人有自己的想法都可以去尽力尝试,同时自己的想法有统一的标准可以验证,技术自然百花齐放。反观推荐系统,大家迭代的数据集都不一样,数据集一样处理方式不一样,很难保证我们 report 出来的是一个可行的方法,而不是让这个方法可行的实验 setting。

还有一个比较大的问题是现在开放的数据集规模都和真实工业场景使用的规模相去甚远。推荐系统的真实场景很多问题本就是在真实规模的数据上才特有存在的。学术界和工业界在不同的数据上迭代,这就让产出的方法到真实应用间还存在着巨大的天然鸿沟。我还记得我在找实习的时候和面试官讨论问题,他们经常都会说出一句 “工业界不是这样的,你的这个想法太天真”。现在我自己在工业界,我能认识到学界和工业界的区别,但是我想我们能尽量部分缩小这个鸿沟。至少让更多的人有机会参与到贴近实际应用场景的迭代中来。提供一个工业级的开放数据集,让更多的力量参与进来,总会碰撞出一些新的想法。同时大家提出的方法可对比,也就能一步一步的把技术推向更高。工业界把自己特有的问题通释化,让外界的人参与进来分担压力,自己也就能投入更多精力去攻克那些暂时还不可通释化的问题。可能会比说一句“工业界不是这样的” 好。

当然要开源这样的一个数据集也面临特别的挑战,如何保护用户的隐私?大规模的数据集如何维护?如何让大家有能力使用这样的数据集等等... 虽然困难,但是我最近和一些同事已经在计划推进尝试开放这样的一个数据集。我相信也有很多同行也在规划类似的工作,最后我们总会有一个可以让大家公平有效迭代的土壤

 

可解释性

推荐系统目前做的事情是把内容(如商品、新闻、音乐等)和用户联系起来,让用户更高效的接触对自己有意义的内容。我们用 

 

 来表示某个商品,其中 ,表示一共有N个商品;来表示某个用户,其中 ,表示一共有M个用户。同时用 表达将推荐给产生的价值(可以是点击成交等定量的指标,或者是用户的满意度等定性的指标)。现在推荐系统做的事情是通过预估来决定如何在有限的推荐机会中最大化总体的推荐价值 , 其中代表推荐系统给用户选取的推荐内容集合。

我们的目标其实是让推荐产生的价值更大,但是目前我们的推荐系统局限于通过预估来决定推荐给用户的,仅仅从分配推荐机会的角度来优化推荐价值。

可是这个游戏的参与方不仅仅是推荐系统,还有为系统提供内容的内容生产者以及用户。如果推荐系统仅仅是分配流量,那么它本身能创造的价值有限,为什么不能让内容生产者和用户参与一起创造新的价值,做大这个蛋糕呢。如果内容生产者能提供更优质的内容,是不是总体的推荐价值会变大。

推荐系统目前预估推荐价值很大程度上依赖用户的反馈,如果用户能提供更真实更准确的反馈,是不是能更准确的预估推荐价值 从而提升总体的推荐价值。如果我们在建设推荐系统的技术时仅仅局限于平台自己如何精准的预估,那么总体的推荐价值是有上限的。我们需要的是寻找如何让内容生产者和用户参与到优化推荐系统的桥梁。最近几年,在如何更精准的预估推荐价值上,有不少有效的模型被提出(大部分是深度学习的方法),但是这些模型也越来越黑盒化了。不仅仅是用户和内容提供者不明白推荐系统推荐的逻辑,就连做这些模型的工程师、把控推荐系统平台的人也不了解每一次推荐的逻辑。面对这样一个黑盒的系统,内容提供方和用户不能理解,如何能很好的参与进来呢。

有意思的是即使在这样一个黑盒的推荐系统下,内容提供方和用户其实是有意识或者有欲望想参与建设更好的推荐系统的。不过由于目前系统的黑盒特性,导致大家不知从何入手。举几个例子。从内容生产者来说,我们以电商为例,大家可以看一下淘宝上那些商品的 “标题”

这些商品的标题,是内容生产者(商家)更多为了写给用户看的呢,还是写给推荐系统看的呢?这些标题,在简短的标题中,出现了大量的属性词,可读性并不强。很多时候这些标题可能承载了商家通过标题来影响推荐系统从而获取更多的流量的期望。

从用户角度来说,我们就以豆瓣为例,大家对内容是有很强的评价意识的。只是很多场景,我们可能只能通过用户的点击之类的信号来建模推荐价值 。这个时候我们会研(bao)究(yuan)用户的点击信号是带有大量噪声的。但是用户又能怎样呢?是不是很多时候是我们展现给用户的内容具有误导性呢(想象一下商品推荐场景的美女图片)?

为什么可解释性可能是让内容生产者和用户参与到优化推荐系统的桥梁呢?想象一下,如果我们的推荐系统不仅仅是建模了推荐价值 ,而是我们真正建模了用户的兴趣,且这个兴趣我们能白盒化的给出一些人能理解的解释。推荐系统可以实时的去预估未来用户的兴趣。那么如果这些兴趣不再是一串无法理解的数字(embedding),如果是人类可以理解的兴趣,比如比较简单的文字标签。这样一些人类可以理解的兴趣是不是可以指导内容生产者去生产更满足用户需要的内容呢。而更丰富更满足用户需要的内容自然会将整个系统的推荐价值推到更高。

同时,推荐系统推荐某个商品的逻辑,是不是可以显式的透传给用户,让用户给出对这个推荐逻辑的反馈,而不是仅仅给出对推荐结果的反馈。让我们能更接近感知用户真实的兴趣。这样推荐系统的学习也有可能变得更精准。这两个只是我比较局限的思考给出的两个例子。

基本的逻辑是,让推荐系统变得白盒化,或者有白盒化的能力,让内容生产者和用户的力量一起加入到推荐系统的优化中来。而不是仅仅推荐系统自说自话,让这个系统变得越来越不可琢磨,不可理解,让用户和内容生产者都无从入手。

 

算法对数据 Confounding

先用一张简图介绍一下反馈循环(Feedback Loop):

 

简单来说,算法对数据的 confounding 就是算法会改变了整个系统能观测到的数据分布,而 feedback loop 导致算法永远在一份已经被自己 confunded(混淆)过的数据上进行训练和观测,无法跳出这一循环。甚至有很大的可能会在这个循环中让整个系统逐步收敛,所能观测的数据分布越来越局限,从而引发一些列问题。

举个例子。有一小部分用户 part A,他们的喜好很特别,但是现有算法无法很有效的将 part A 和其他大部分用户 part B 区分开。那么这些用户的数据无法很好的影响算法的训练,导致模型最终决定了推荐系统给 part A 推荐的结果和 part B 推荐的结果一样。part A 的用户不喜欢这些推荐结果,给出了负向的反馈,然而推荐系统的优化目标是整体的准确率或者收益,这部分用户的反馈就被忽视掉,模型继续往 part B 所在的那部分优化。慢慢的 part A 用户和平台的交互可能变得越来越少,最终推荐系统成功的挤走了这部分用户。这个时候,即使有一个算法能给 part A 用户提供好的推荐结果,它也再没有机会为 part A 的用户服务了,也没有机会证明自己。而这一切发生得是很隐蔽的,可能系统都没意识到自己丢失了这部分价值。

从道德上讲,这样对少数派的忽略是不公平的。从商业价值上讲,可能短期看上去仅仅失去占比很少的少数派代表的价值,然而如果我们的系统这样循环下去,其实是在源源不断的失去一小部分价值,累积起来是非常大的损失。算法对数据的 confounding 让系统观测的数据分布逐步收敛,让整个系统的收益边界不断缩小,慢慢陷入无法迭代提升的境地。

可能有同学会觉得这就是一个简单的系统需要 explore 问题。然而推荐系统涉及到商业价值,explore 变得不是这么简单。我们需要:1. 衡量 explore 带来的收益和成本,2. 高效的 explore 方法。这两个问题在学术界都有非常多的研究,但是在一个快速迭代的工业系统中,这两个问题的解决变得相当艰难。这要求我们必须在很短的周期内 explore 产生收益并可以衡量 explore 的效果,不然就得拥抱系统的变化,很多时候可能还得拥抱人事组织的变化 : )

 

总结

如果把优化推荐系统的准确率是一个一阶梯度 learning 方向,可能它吸引了我们过多的精力。优化推荐系统,可以从更多的视角来推动。统一的 benchmark、可解释性(透明化)、算法对数据 confounding 这几个问题的推动可能更像是一种更上层对推荐系统 meta-learning。当然了,推荐系统研究发展的环境和氛围并没有我前面表达的那么悲观,还是有很多人在这个领域提出了很多有趣的想法,在一些很 tough 的问题上持续的努力。最后和大家一起共勉,希望我们能见到更公平、更高效、更满足用户时刻变化需要的推荐系统。

这篇关于推荐系统走向下一阶段最重要的三个问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

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

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

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置