深度学习笔记: 最详尽LinkedIn Feed 排名系统设计

2024-06-07 07:36

本文主要是介绍深度学习笔记: 最详尽LinkedIn Feed 排名系统设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!

LinkedIn Feed 排名

1. 问题陈述

设计一个个性化的LinkedIn Feed,以最大化用户的长期参与度。衡量参与度的一种方法是用户频率,即每个用户的参与次数,但在实践中这非常困难。另一种方法是衡量点击概率或点击率(CTR)。

在LinkedIn这样的社交媒体平台上,“Feed”指的是向用户显示的内容的不断更新的流。

在LinkedIn Feed上,有五种主要的活动类型:

  • 连接
  • 信息
  • 个人资料
  • 观点
  • 特定站点

直观上,不同的活动有非常不同的点击率。这在构建模型和生成训练数据时非常重要。

类别示例
连接成员连接、关注成员/公司、成员加入群组
信息成员或公司分享文章/图片/消息
个人资料成员更新个人资料,例如照片、职位变动等
观点成员点赞或评论文章、图片、职位变动等
特定站点LinkedIn特有的活动,例如成员为成员点赞等

2. 指标设计和要求

指标

离线指标

  • 点击率 (CTR):Feed收到的点击次数除以Feed显示的次数。

    • 公式

      C T R = 点击次数 显示次数 CTR = \frac{\text{点击次数}}{\text{显示次数}} CTR=显示次数点击次数

  • 最大化CTR可以形式化为训练一个有监督的二分类模型。对于离线指标,我们归一化交叉熵和AUC。

  • 归一化交叉熵 (NCE):帮助模型对背景CTR不太敏感。

    • 公式

N C E = − 1 N ∑ i = 1 n ( 1 + y i 2 log ⁡ ( p i ) + 1 − y i 2 log ⁡ ( 1 − p i ) ) − ( p log ⁡ ( p ) + ( 1 − p ) log ⁡ ( 1 − p ) ) NCE = \frac{-\frac{1}{N} \sum\limits_{i=1}^{n} \left( \frac{1 + y_i}{2} \log(p_i) + \frac{1 - y_i}{2} \log(1 - p_i) \right)}{ - \left( p \log(p) + (1 - p) \log(1 - p) \right)} NCE=(plog(p)+(1p)log(1p))N1i=1n(21+yilog(pi)+21yilog(1pi))

N:样本总数。

y i y_i yi:第 ( i ) 个样本的实际标签。如果项目被点击,则 ( y_i ) 为 1,否则为 0。

p i p_i pi:第 ( i ) 个项目被点击的预测概率。

归一化项:

− ( p log ⁡ ( p ) + ( 1 − p ) log ⁡ ( 1 − p ) ) - \left( p \log(p) + (1 - p) \log(1 - p) \right) (plog(p)+(1p)log(1p))

p p p:背景CTR(项目被点击的平均概率)。

这个项是具有平均值 p p p 的伯努利分布的熵。它规范了交叉熵损失,以考虑点击的固有可能性(背景CTR)。

交叉熵归一化:

  • 确保模型的性能不受固有点击率高或低的项目的过度影响。
  • 使模型在不同类型的项目上更加健壮和通用。

AUC:

  • 提供一个全面的指标来评估模型区分点击和未点击项目的能力。
  • 对于点击次数可能远小于未点击次数的不平衡数据集特别有用。

背景CTR指的是在数据集中或特定数据子集中观察到的平均点击率(CTR)。它反映了所有项目在不考虑各个项目特征的情况下的固有点击可能性。例如,如果平台的总体CTR为0.02,这意味着平均有2%的显示项目被点击。

在线指标

  • 对于非平稳数据,离线指标通常不是性能的良好指标。在线指标需要反映模型部署后用户的参与度,即转化率(点击次数与Feed数量的比率)。

要求

训练

  • 处理大量数据:理想情况下,模型在分布式环境中进行训练。
  • 在线数据分布变化:每天多次增量地重新训练模型,以应对数据分布的变化。
  • 个性化:支持高度个性化,因为不同用户对Feed的消费方式和风格不同。
  • 数据新鲜度:避免在用户的主页Feed上显示重复的Feed。

推断

  • 可扩展性:处理大量用户活动并支持3亿用户。
  • 延迟:Feed排名需要在50毫秒内返回,整个过程在200毫秒内完成。
  • 数据新鲜度:确保Feed排名知道用户是否已经看到某个特定活动,以避免显示重复的活动。

总结

类型期望目标
指标合理的归一化交叉熵
训练高吞吐量,能够每天多次重新训练
支持高度个性化
推断延迟从100毫秒到200毫秒
提供高水平的数据新鲜度,避免多次显示相同的Feed

3. 模型

特征工程

特征特征工程描述
用户档案:职位、行业、人口统计等低基数:使用独热编码。高基数:使用嵌入。
用户之间的连接强度由用户之间的相似性表示。我们还可以使用嵌入来表示用户,并测量距离向量。
活动年龄根据点击目标的敏感度,将其视为连续特征或分箱值。
活动特征活动类型、标签、媒体等。使用活动嵌入并测量活动与用户之间的相似性。
交叉特征组合多个特征。

用户档案:对人口统计进行独热编码,因为它的基数较低(例如,年龄组)。由于可能存在高基数(许多唯一的职位和行业),对职位和行业进行嵌入。

用户之间的连接强度:例如,如果用户A经常与用户B互动(点赞帖子、评论、消息),则连接强度较高。

活动年龄:例如,活动的年龄(例如帖子或更新)可以表示为自创建以来的天数。如果点击行为对活动的新鲜度敏感,则可以将其视为连续变量。或者,可以将其分箱为“少于一天”,“1-3天”,“4-7天”等,以简化模型。示例:一个帖子创建于2天前。特征工程:1. 将年龄视为连续特征:年龄=2 2. 或者,将年龄分箱:年龄箱=“1-3天”。

活动特征:例如,活动可以包括分享文章、更新个人资料图片或点赞帖子。每种活动类型都可以嵌入到一个向量空间中。如果用户经常参与与“数据科学”相关的文章,可以使用这些嵌入来衡量新数据科学相关活动与用户兴趣的相似性。

交叉特征:交叉特征是多个基本特征的组合,以捕获它们之间的交互。例如,结合“用户行业”和“活动类型”,以查看技术行业的用户是否比其他行业更喜欢信息活动(如文章分享)。

训练数据

在构建任何机器学习模型之前,我们需要收集训练数据。目标是收集不同类型帖子的数据,同时改善用户体验。以下是我们可以收集训练数据的一些方法:

  1. 按时间顺序排名:此方法按时间顺序对每个帖子进行排名。使用这种方法收集点击/未点击数据。这里的权衡是用户对前几个帖子的关注导致的服务偏差。此外,由于不同的活动(如职位变动)相比于LinkedIn上的其他活动很少发生,因此存在数据稀疏问题。
  2. 随机呈现:此方法按随机顺序对帖子进行排名。这可能会导致糟糕的用户体验。它也无法解决稀疏性问题,因为缺乏有关稀有活动的训练数据。
  3. 使用Feed排名算法:这将对前几个Feed进行排名。在顶部Feed中,你可以随机排列。然后,使用点击数据进行数据收集。这种方法提供了一些随机性,有助于模型学习和探索更多活动。

基于此分析,我们将使用算法生成训练数据,以便后续训练机器学习模型。

我们可以通过选择一段数据时间来开始使用数据进行训练:上个月、过去6个月等。在实践中,我们希望在训练时间和模型准确性之间找到平衡。我们还对负面数据进行下采样以处理不平衡数据。

模型选择

我们可以使用概率稀疏线性分类器(逻辑回归)。由于其计算效率高,这是一种流行的方法,适用于稀疏特征。

由于数据量大,我们需要使用分布式训练:Spark中的逻辑回归或交替方向乘子法(ADMM)。

我们也可以在分布式环境中使用深度学习。我们可以从全连接层开始,在最终层应用Sigmoid激活函数。由于CTR通常非常小(小于1%),我们需要重新采样训练数据集以使数据不那么不平衡。重要的是保持验证集和测试集不变,以准确估计模型性能。

逻辑回归可以有效处理稀疏向量,因为它只需要计算非零特征的加权和。

为什么逻辑回归是线性分类器

线性决策边界
特征的线性组合

逻辑回归使用输入特征的线性组合进行预测。这意味着输入特征与结果的对数几率之间的关系是线性的。

决策边界

决策边界是在特征空间中的直线(或更高维空间中的超平面),分隔不同的类别。

Apache Spark:Spark是一种强大的大数据处理和机器学习工具。它支持分布式计算,这意味着它可以通过在机器集群上分发数据和计算来处理大数据集。Spark中的逻辑回归:Spark的MLlib库包括可以分布式运行的逻辑回归实现。这使得在非常大的数据集上进行高效训练成为可能。

交替方向乘子法(ADMM):这是一种用于通过将复杂问题分解为更小的子问题来解决复杂问题的优化算法。每个子问题都可以独立解决,使ADMM适用于分布式计算环境。逻辑回归中的应用:ADMM可以用于并行优化逻辑回归模型参数,提高效率和可扩展性。

保持验证集和测试集不变意味着在对训练数据进行更改(如重新采样以解决类别不平衡)时不应修改这些数据集。以下是对其含义及其重要性的详细解释:

评估

一种方法是将数据分为训练数据和验证数据。另一种方法是重放评估以避免偏差的离线评估。我们使用直到时间 t t t 的数据来训练模型。我们使用时间 t + 1 t+1 t+1 的测试数据,并在推断过程中根据我们的模型重新排序它们的排名。如果在正确位置有准确的点击预测,则记录匹配。总匹配数将视为总点击数。

在评估期间,我们还将评估我们的训练数据集应有多大,以及我们应多频繁地重新训练模型,以及许多其他超参数。

重放评估是一种通过使用历史数据模拟模型在现实世界场景中的表现来评估模型性能的方法。使用过去的数据评估模型,将历史互动视为实时发生。通过使用历史数据模拟实时预测,重放评估提供了模型在生产中的性能的更准确衡量。

位置匹配:意味着模型根据其预测的点击概率最高(或其他特定排名)的项目与用户实际点击的项目相同。

4. 计算与估计

假设

  • 3亿月活跃用户
  • 平均每个用户每次访问看到40个活动。每个用户每月访问10次。
  • 我们有 12 ∗ 1 0 10 12 * 10^{10} 121010 或1200亿次观察/样本。

数据大小

  • 假设点击率约为1%(1个月)。我们收集了10亿个正标签和约1100亿个负标签。这是一个巨大的数据集。
  • 通常,我们可以假设对于每个数据点,我们收集数百个特征。为了简化,每行存储需要500字节。
  • 在一个月内,我们需要1200亿行。总大小: 500 ∗ 120 ∗ 1 0 9 = 60 ∗ 1 0 12 500 * 120 * 10^{9} = 60 * 10^{12} 500120109=601012 字节 = 60 TB。为了节省成本,我们可以在数据湖中保留最近6个月或1年的数据,并将旧数据存档在冷存储中。

规模

  • 支持3亿用户

5. 高级设计

Feed 排序高级设计

  • 特征存储 是特征值存储。在推理过程中,我们需要低延迟(<10ms)访问特征值以进行评分。特征存储的示例包括 MySQL Cluster、Redis 和 DynamoDB。

  • 项目存储 存储用户生成的所有活动。它还存储相应用户的模型。一个目标是保持一致的用户体验,即对任何特定用户使用相同的 Feed 排序方法。项目存储为相应用户提供正确的模型。

让我们检查系统的流程:

  1. 客户端向应用服务器发送 Feed 请求

  2. 应用服务器向 Feed 检索服务发送 Feed 请求

  3. Feed 检索服务从项目存储中选择最相关的 Feed

  4. Feed 检索服务向 Feed 排序服务发送 Feed 排序请求

  5. Feed 排序服务获取最新的机器学习模型,从特征存储中获取正确的特征

  6. Feed 排序服务为每个 Feed 打分并返回给 Feed 检索服务和应用服务器。应用服务器按排名对 Feed 进行排序并返回给客户端

系统流程
  1. 用户访问 LinkedIn 首页并向应用服务器请求 Feed。应用服务器向 Feed 服务发送 Feed 请求。
  2. Feed 服务从模型库获取最新模型,从特征存储中获取正确的特征,并从项目存储中获取所有 Feed。Feed 服务将为模型提供特征以获取预测。
  3. 模型返回按点击率可能性排序的推荐 Feed。

6. 扩展设计

  • 扩展 Feed 服务模块,因为它代表了检索服务和排序服务。这提供了更好的可视化。
  • 扩展应用服务器,并在应用服务器前放置负载均衡器以平衡负载。

7. 总结

  • 我们学习了如何构建机器学习模型来排序 Feed。具有自定义损失函数的二元分类模型可以使模型对背景点击率不太敏感。
  • 我们学习了如何创建生成机器学习模型训练数据的流程。
  • 我们学习了如何通过扩展应用服务器和 Feed 服务来扩展训练和推理。

附录

逻辑回归数值示例

假设一个简单的逻辑回归模型,具有以下权重( θ \theta θ)和输入特征( x x x):

  • 权重: θ = [ θ 0 , θ 1 , θ 2 , θ 3 , θ 4 ] \theta = [\theta_0, \theta_1, \theta_2, \theta_3, \theta_4] θ=[θ0,θ1,θ2,θ3,θ4]
  • 特征向量: x = [ 1 , 0 , 0 , 3 , 0 ] x = [1, 0, 0, 3, 0] x=[1,0,0,3,0]

这里, θ 0 \theta_0 θ0 是截距项,其他 θ i \theta_i θi 值是特征的权重。特征向量 x x x 是稀疏的,具有许多零值。

逻辑回归计算

逻辑回归模型计算线性组合 z z z 如下:

z = θ 0 × 1 + θ 1 × x 1 + θ 2 × x 2 + θ 3 × x 3 + θ 4 × x 4 z = \theta_0 \times 1 + \theta_1 \times x_1 + \theta_2 \times x_2 + \theta_3 \times x_3 + \theta_4 \times x_4 z=θ0×1+θ1×x1+θ2×x2+θ3×x3+θ4×x4

将我们的示例中的值代入:

z = θ 0 × 1 + θ 1 × 0 + θ 2 × 0 + θ 3 × 3 + θ 4 × 0 z = \theta_0 \times 1 + \theta_1 \times 0 + \theta_2 \times 0 + \theta_3 \times 3 + \theta_4 \times 0 z=θ0×1+θ1×0+θ2×0+θ3×3+θ4×0

简化计算

因为任何数乘以零都为零,我们可以忽略特征值为零的项:

z = θ 0 × 1 + θ 3 × 3 z = \theta_0 \times 1 + \theta_3 \times 3 z=θ0×1+θ3×3

因此,计算简化为:

z = θ 0 + 3 θ 3 z = \theta_0 + 3\theta_3 z=θ0+3θ3

参考资料:

  • Machine learning System Design from educative

这篇关于深度学习笔记: 最详尽LinkedIn Feed 排名系统设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]