17 推荐系统方案中那些不得不知的坑

news2024/11/10 12:57:21

你好,我是大壮。《易经》中说:“上九:亢龙有悔”。上九是指阳爻在卦中处于最高位,亢龙是指飞向尽头的龙,穷尽至极力终有尽时,力尽则悔,悔不可及。

在前面的 18 讲我们已经讨论了整个推荐算法的演化过程,并经历过实践检验,貌似已经大功告成了。那么,如果我们沿着这条路走下去就一定能一帆风顺么?

答案:当然会有磕磕绊绊。

下面我们就着重讲讲推荐系统实际方案中的那些坑,让你少走弯路。

坑一:到底要对哪个指标负责?

以 58 同城 App 本地服务推荐业务为例,我们需要关注的指标有 CTR、CVR、Call/UV、浏览时长等,那么最应该关注哪个指标呢?

如果我们只关注 CTR,那么低俗内容和标题党就会显现出来;如果只关注浏览时长,那么就会有大量长帖子出现;如果只关注 Call/UV,那么比较短的帖子更占优势。

事实上,这些指标之间属于相互依赖、此消彼长的关系。然而,算法模型多是针对单独的指标进行样本筛选和优化,如果指标不同,结果也就大不相同。

针对这个问题,各大厂的通用做法是把这些互相矛盾的指标通过添加多个超参数连接起来,从而形式一个融合指标。此时,如何取这些超参数又成了一个问题。其实,在实际工作中,大多数的超参数都是拍出来的。

坑二:为什么离线指标很棒,一上线就不行了?

其实这个问题牵扯的东西比较多,这里我主要说两种相对比较常见的原因。

  • 离线训练的数据都是隔天处理,且深度学习模型需要耗费大量的时间和资源对数据进行训练,这就使得上线之后往往模型就过时了,而线上属于实时样本数据。

  • 离线训练的数据是有偏的,而线上实际用于预测的数据是无偏的,比如用户只习惯与某个位置的产品形态进行交互,并不是因为他们喜欢这些物品;再比如用户无法与未曝光的物品进行交互,也并不是因为他们不喜欢这些物品。

除了能够“阴沟里翻船”,还有一些已知的从理论维度尚且没有确定解决方案的问题。

坑三:准确度和丰富度如何两全?

在推荐系统中,准确度决定了平台的收益(“钱”),丰富度决定了用户对平台的“感情”。

俗话说:“谈钱伤感情,谈感情就伤钱”,就像 13 讲讨论的探索与开发问题,通常情况下我们只能牺牲一定的准确度来换取丰富度,从而破解“信息茧房”,以期在短期收益和长期收益中做权衡。

如果一定在两者之间做选择的话?牺牲多少指标收益来保证探索才是合适的,这是一个艰难的抉择,如果牺牲过少,则没有太大意义;牺牲过多,则用户体验在多数情况下是负向。

坑四:如何给推荐的结果一个合理的解释?

推荐系统的交互对象是用户,但是现在的推荐系统对于用户来说就像是一个黑盒,有时会给用户带来“惊吓”。因此,给予用户一个合理的推荐解释很有必要。这不仅可以加速用户决策,起到说服和原谅的效果,还能够建立用户的信任感。

事实上,解释并不是那么容易做出来的,原因总结为两点。

  • 现在的深度学习算法是不可解释的;

  • 解释一件事存在一定概率性和歧义性。比如“他是坏蛋,你是好人”这种描述就比较直白且容易理解,而现实世界往往不是非黑即白,比如“他也许是坏蛋,你可能是好人”。加上受展现的限制,推荐解释要求一定是短句,这就会造成一些解释上的歧义性。比如“开刀的是他父亲”,在没有上下文的情况下很容易让用户误解,父亲到底是医生还是患者呢?

虽说我们无法从根本上解决这个问题,我还是想分享几种解决路径:

  • 通过用户之间的相似性,给出解释是另一个相关用户也喜欢;

  • 利用物品属性之间的相似性,给出解释是看过另一个相同属性的物品(比如导演和主演的电影等)。

虽然推荐系统存在着一些坑,但是对于互联网平台来说它在未来会有更广泛的应用场景,但是推荐算法方面仍然存在着可以深度探究的领域,总结如下:

  • 从懂到更懂用户和物品

其中的挑战主要是多种数据类型,如文本、图像、音频等,而且特征关系复杂,数据内部关系复杂等。通过深度学习范式对丰富的辅助信息和上下文信息的提取,通过大量隐式反馈样本数据,以及更加复杂的模型拟合能力等。

  • 从复杂到更复杂的模型

组合多个深度范式构成深度复合模型针对异构特征进行建模,目前这方面的模型扩展还很有限,特定领域必然会出现更加有效的模型。本专栏模块三、模块四给出了大量的范式组合例子。

  • 时间可以改变一切

利用新的建模方式捕获用户动态的需求,并且能够融合用户长期和短期需求。另外用户和物品的共同进化也是时间影响的重要方面,因为用户和物品特征可以独立发展并随着时间的推移依赖于共同演化。

  • 多件事一起做

跨域推荐和多任务学习旨在通过使用从其他领域转移的知识来改善一个领域的任务或者通过使用从其他任务辅助另一个任务的学习,可以提供隐式数据增强,以减轻稀疏性问题。

  • 弹性可扩展

不断增长的数据量和模型参数计算量给推荐系统效率水平带来很大的挑战。可扩展主要体现在数据可扩展性和模型可扩展性两个方面。可以把数据分片,并在片段上进行模型学习,或者在数据片段上进行建模,然后将子模型合并计算推荐结果。

如何达到开悟的阶段

经过本专栏的学习,我相信你已经具备了大量的知识深度和理解深度。如果想达到开悟的阶段,则需要经历以下几个阶段:

第一层:势

把势作为第一层并不是说“势”不重要,其实这正好相反。道德经中说:“道生之,德畜之,物形之,势成之”,由此可见势的重要性。

比如 2008 年我在朗讯贝尔实验室实习时,当时做了一个 IMS IM(即时通信)项目,它支持通过 PC/M/App 三端免费接打电话、互发短信/网路消息/语音等,类似后来的微信业务功能(甚至还要多一些)。不过,因为那时智能手机的市场保有量很低,也就是说客户量很小,最终导致项目入不敷出、垮掉了,这就是不符合当时的“势”的一种体现。

第二层:器

作为一名工程师,实操能力是触发一切职业发展可能的基础,也决定了一个人能否成功。

因此,除了借势之外,我们还需要具备一定的具体落地实操的能力,比如如何解决埋点问题?如何使用大数据平台清洗处理数据?如何优化线上代码提升运行效率?如何使用 TensorFlow 或 PyTorch 上一些算法模型等。

第三层:术

“术”即驾驭“器”的能力,这里为了方便理解,我们比方说“器”是保时捷,“术”是驾驶技术。如果驾驶技术不好,就算开保时捷也会掉沟里。

而在本专栏中,“术”指的就是推荐工程架构设计,即不同场景下选择什么推荐算法模型和特征工程等。因为对一名工程师来说,了解不同的技术,知道如何选型是进阶的基础。

第四层:法

“法”是将“道”从理论层面落实到实践层面的关键(即规章制度),具体来说就是规则、流程、步骤。比如推荐系统的工作流程是先对基本数据和反馈数据进行加工,再利用加工结果进行决策。从框架上来看,它需要经过数据采集、数据加工、数据决策、效用评价这 4 个阶段,而本专栏阐述的这套框架就是推荐系统的“法”,因为任何技术只有在合理的框架下才能够延续和发展。

从算法角度来看,算法的原理和推导过程同样也是“法”,它是实现模型的指导方针,这点本专栏在推荐算法的“法”上也有比较充分的介绍。

第五层:道

“道”是核心思想、万物变迁循环中亘古不变的规律,比如推荐算法的演化规律、推荐工程架构在内因和外因作用下的演化规律、推荐系统与业务发展结合的规律等。本专栏阐述重点就是推荐系统之“道”,掌握了“道”就掌握了这门技术的体系,并能够把知识形成思维网络。

综上可见,掌握一门技术分为 5 层境界:随大流、用工具、会技术、懂方法、悟大道。每一层境界都是下一个层的基础,当达到了“道”的境界,也就成了能引领这门技术的人。

然而道德经中说:“反者,道之动”,也就是说矛盾的双方会向其相反的方向转化。

面对未来的情况,也许我们今天的思考不一定是对的,正所谓有悔。比如随着我在 58 同城本地服务推荐场景中的进一步实践,有可能深化甚至推翻之前的认知。

因此,针对现实推荐系统在落地中的不足,我们应该给予理解并思考未来需要解决的问题,沿着进一步开拓推荐领域的方向前进。

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

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

相关文章

C语言中的IO控制流

文章目录 一、什么是C语言中的IO控制流二、open函数 1.使用open函数创建文件2.使用使用open函数打开文件三、文件的权限四、文件的描述符五、read函数六、write函数七、lseek函数八、close函数 一、什么是C语言中的IO控制流 在linux系统中一切皆文件,C语言中的IO控…

【SQL 新手教程 4/20】关系模型 --索引

💗 关系数据库建立在关系模型上⭐ 关系模型本质上就是若干个存储数据的二维表 记录 (Record): 表的每一行称为记录(Record),记录是一个逻辑意义上的数据 字段 (Column):表的每一列称为字段(Colu…

Java | Leetcode Java题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; class Solution {public String getHint(String secret, String guess) {int bulls 0;int[] cntS new int[10];int[] cntG new int[10];for (int i 0; i < secret.length(); i) {if (secret.charAt(i) guess.charAt(i)) {bulls;} e…

C语言条件语句中switch语句的一些用法

目录 1. switch语句写一个简单的switch语句 2. if语句和else语句的对比判断3的倍数情况 3. switch语句中break详解4. switch语句的一项小练习5. switch语句中的default6. switch语句中的顺序问题 1. switch语句 C语言除了if...else...作为条件语句外&#xff0c;还提供了switc…

Java(十)——接口

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

数据库表的行列转换(行转列,列转行)

目录 前言 行转列 创建测试表 score1 插入测试数据 需求与通用SQL写法 列转行 创建测试表 score2 插入测试数据 需求与通用SQL写法 前言 在工作中&#xff0c;多多少少都会遇到一些数据展示的需求&#xff0c;开发一个接口&#xff0c;从数据库中查询数据返回页面展示…

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城&#xff0c;主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览&#xff1b; 后台是…

Langchain核心模块与实战[8]:RAG检索增强生成[loader机制、文本切割方法、长文本信息处理技巧]

Langchain核心模块与实战[8]:RAG(Retrieval Augmented Generation,检索增强生成) RAG(Retrieval-Augmented Generation)技术是一种结合检索和生成功能的自然语言处理(NLP)技术。该技术通过从大型外部数据库中检索与输入问题相关的信息,来辅助生成模型回答问题。其核心…

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点&#xff0c;这个知识点也很抽象&#xff0c;需要我们很好的掌握&#xff0c;而且快速排序的代码也是非常重要&#xff0c;需要我们懂了还不行&#xff0c;必须要手撕代码&#xff0c;学的透彻。 在研究快速排序之前&#xff0c;我们首先…

使用 Arduino 实现 PID 控制器

使用 Arduino 实现 PID 控制器 PID controller implementation using Arduino (microcontrollerslab.com) In this article, you will learn how to design PID controller using Arduino. PID controller can implemented using both analog and digital electronics. But in…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类&#xff08;修饰类除外&#xff09;&#xff1f; 一个 Java 文件中是可以存在多个类的&#xff0c;但是一个 Java 文件中只能存在一个 public 所修饰的类&#xff0c;而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化&#xff0c;势必造成CPU资源的浪费&#xff0c;因此优化执行效率的思路是&#xff1a;UI组件不再自行每帧查询血量&#xff0c;而是让血量自己在发生变化的同时通知UI进…

软件全过程建设资料,交付资料,方案等

在软件开发过程中&#xff0c;文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程&#xff0c;还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用&#xff0c;以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档编写…

【机器学习】深入理解损失函数(Loss Functions)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…

[译] 深入浅出Rust基金会

本篇是对 RustConf 2023中的Rust Foundation: Demystified这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 大家好,我是Sage Griffin,我的代词是they/them。我今天来这里是要谈谈Rust基金会。 要了解基金会实际做什么,我们需要理解美国国内税收…

微软第四季度财报预览:增长动力追踪

微软公司即将在2024年7月30日&#xff08;周二&#xff09;美国市场收盘后发布第四季度财务结果。 微软的收益 - 预期如何 美股券商开户通道 市场预计&#xff0c;微软即将到来的2024年第四季度的收入将年增长14.5%&#xff0c;达到644亿美元&#xff0c;高于2023年第四季度…

【Leetcode】二十、记忆化搜索:零钱兑换

文章目录 1、记忆化搜索2、leetcode509&#xff1a;斐波那契数列3、leetcode322&#xff1a;零钱兑换 1、记忆化搜索 也叫备忘录&#xff0c;即把已经计算过的结果存下来&#xff0c;下次再遇到&#xff0c;就直接取&#xff0c;不用重新计算。目的是以减少重复计算。 以前面提…

【.NET 6 实战--孢子记账--从单体到微服务】--开发环境设置

在这一小节&#xff0c;我们将设置开发环境。 一、安装SDK 咱们的项目使用的是 .NET6&#xff0c;开发前我们需要从官网上下载.NET6 SDK&#xff08;点击下载&#xff09;&#xff0c;这里要注意的是我们需要下载.NET6 SDK&#xff0c;而不是 .NET6 Runtiem 。SDK 包含 Runti…

2021真题-架构师案例(四)

问题1&#xff08;16分&#xff09; 针对该系统功能&#xff0c;赵工建议解释器架构风格&#xff0c;李工建议管道过滤架构风格&#xff0c;王工则建议饮食调用&#xff0c;该系统从灵活性和可扩展性考虑&#xff0c;应采用哪种&#xff1f; 解析&#xff1a; 管道-过滤器&am…

这些有用的免费网站和工具,很多人却都不知道

在信息爆炸的今天&#xff0c;很多用户都不知道有哪些免费好用的网站和工具&#xff0c;今天小编就来和大家分享几款免费又好用的网站或工具&#xff0c;以便大家提升工作效率。 滴答清单&#xff1a;高效时间管理 滴答清单是一款广受欢迎的时间管理工具&#xff0c;它可以帮…