返回介绍

数学基础

统计学习

深度学习

工具

Scala

十一、Pinterest Recommender System [2017]

发布于 2023-07-17 23:38:24 字数 37396 浏览 0 评论 0 收藏 0

  1. 虽然已经有很多关于高级推荐系统及其实际应用的论文发表,但是通常不可能直接构建 state-of-the-art 的推荐系统。最初的产品initial product 必须用一个小的工程团队、有限的计算资源、以及缺乏训练数据来构建,直到推荐系统被启用 bootstrapped 。工业级的推荐系统通常处理包含数十亿个 itemWeb-scale 数据。由于内容是通过用户隐式反馈 implicit user feedback 收集的,因此内容通常标记不佳并且有很大噪音noisy 。因此,很多从业者在构建初始系统时选择使用临时的启发式方法 heuristicstrade-off 。但是,系统的进一步增长grow 会使得系统迅速复杂化,从而难以应对接下来的变化。

    在论文 《Related Pins at Pinterest: The Evolution of a Real-World Recommender System》 中,作者给出了在 Related Pins 背景下以独特的机会在三年的时间范围内观察这些问题。Related Pins 的初始版本是在 2013 年推出的,是 Pinterest 首次进入推荐系统的尝试之一。尽管在改善内容发现 content discovery 取得了成功,但是 Related Pins 最初在工程上受到的关注很少。2014 年,Pinterest 上大约 10%pins saved 是通过 Related Pins 发现discovered 的。2015 年,一个小团队开始迭代并进一步开发 Related Pins。现在,Related Pins 通过多个产品界面product surfaces 推动了超过 40% 的保存save 和曝光 impression ,并且是 Pinterest 上的主要发现机制primary discovery mechanisms 之一。论文通过对 Related Pins 的纵向研究,探索了现实世界中推荐系统的挑战。在描述 Pinterest 系统的逐步演变时,作者提出了应对这些挑战的解决方案、trade-off 的理由、以及学到的关键洞察key insights

    现实世界的推荐系统已经作为音乐推荐 music suggestion、图像搜索 image search 、视频发现video discovery、电影发现 movie discovery 。其中很多论文描述了 final system,然而并没有描述如何逐步增量地incrementally 构建系统。《Hidden technical debt in machine learning systems》 描述了现实世界推荐系统面临的很多挑战,我们提供了在 Related Pins 中这些挑战的具体例子,并提出了独特的解决方案。

    • 对于 Related Pins ,我们首先考虑最简单、性价比最高highest-leverage 的产品,从而达到增量式的里程碑incremental milestones 并证明可行性 viability。我们最初的推荐算法由一个简单的候选生成器candidate generator 以及很多启发式规则 heuristic rules 组成。尽管它仅在三周内建成,但是它利用了 user-curated boards 中的强烈信号strong signal 。我们继续添加更多的候选源candidate sources,因为我们发现了覆盖率 coverage 和召回率recall 之间的gap
    • 随着时间的推移,我们引入了 memorization layer 来提高热门的结果popular resultsMemboost 在工程复杂度和计算强度方面都是轻量级的,但是它能显著地利用大量的用户反馈user feedback 。我们不得不考虑位置偏差 position bias ,并以反馈回路 feedback loops 的形式处理复杂性complexity ,但是发现付出的代价是值得的。
    • 接下来我们添加了一个机器学习的 ranking 组件,因为我们认为它具有最大的影响潜力。我们从只有九个特征的基础线性模型开始。当我们发现模型和训练方法的缺点时,我们开始尝试使用更高级的方法。

    每个组件最初都是在工程和计算资源上有很多限制的情况下构建的,因此我们优先考虑了最简单和最高效的解决方案。我们展示了有机增长organic growth 如何导致一个复杂的系统,以及我们如何管理这种复杂性。

11.1 系统介绍

  1. Pinterest 是用于保存saving 和发现 discovering 内容content 的可视化发现工具visual discovery tool 。用户将他们在 Web 上找到的内容另存为 pins,并在 boards 上创建这些 pins 的集合。

    Related Pins 利用这些人类收藏的human-curated 内容基于给定的 query pin 来提供个性化的 pin 推荐。下图给出了 pin 特写视图pin closeup view

    Pinterest 其它几个部分也包含 Related Pins 推荐,包括主页feedhome feed 、访客(身份未验证的访问者)的 pin page 、相关想法related ideasinstant ideas 按钮、电子邮件email、通知 notification、搜索结果 search result 、浏览选项卡Explore tab

  2. Pinterest 上的用户互动user engagement 通过以下操作来定义:

    • 用户通过点击来查看有关 pin 的更多详细信息从而特写closeup 这个 pin
    • 然后,用户可以点击从而访问关联的 Web 链接。如果用户长时间 off-site,那么被视为长按 long click
    • 最后,用户可以将 pin 保存到自己的 board 上。

    我们对推动相关pin 的保存倾向 Related Pins Save Propensity 很感兴趣,它的定义是:保存 Related Pins 推荐的 pin 的数量除以用户看到的 Related Pins 推荐的 pin 的数量。

  3. Pinterest 数据模型data model 中,每个 pin 都是一个带链接link 和描述文本description的图像实例 image instance ,其中图像是通过一个图像签名 signature 来唯一标识的。尽管每个 pin 位于单个 board 上,但是同一个图像可以用于不同 board 上的很多 pin :当 pin 保持到一个新的 board 上时,会创建该 pin 的拷贝。

    pin 信息通常在image signature level 上进行汇总,从而提供了比单个pin 实例相比更丰富的元数据 meta-data (比如pin 粒度的点击量、保存量)。为方便起见,将来对 query pinresult pin 的引用实际上指的是 pin 的集合,该集合中的pin 具有相同image signature

  4. Related Pins 系统包含以下三个主要组件components 。随着时间的推移,这些组件已经被陆续引入到系统中,并且每个组件以各自的方式发生了巨大的演变 。下图给出了我们体系结构的各种快照snapshots ,说明了整个系统以及三个组件的演变 evolution。本文后续部分将更详细地探讨它们的发展。

    • Candidate Generation组件:我们首先将候选集合candidate set(符合Related Pin 推荐的pin 集合)的范围从数十亿缩小到大约 1000 个可能和 query pin 相关relatedpin

      我们已经开发并迭代了几种不同的候选生成器 candidate generators 来做到这一点。

    • Memboost 组件:我们系统的一部分会记住历史上特定queryresultpair 对上的互动。我们描述了在使用历史数据时,如何通过使用点击除以期望点击的方式来解决位置偏见position bias 问题。

      引入记忆会增加带有反馈回路feedback loops 系统的复杂性,但是会显著提高互动 engagement

    • Ranking 组件:我们应用一个机器学习的 ranking modelpin 上,对这些pin 排序从而最大化我们的 Save Propensity 的目标互动指标 target engagement metric 。该模型结合了query 特征、candidate pins 特征、用户画像特征、session 上下文特征、Memboost 信号等特征的组合。

      我们采用了 learning-to-rank 技术,采用历史用户互动user engagement 来训练系统。

11.2 Candidate Generation 的演变

  1. 最初的 Related Pins 系统仅包含一种形式的候选生成 candidate generation:通过抽取经常共现co-occurringpins 来利用 pin-board graph 。这些候选pins 作为推荐直接显示给用户(上图的 (a) )。

    后来我们引入了 Memboostmachine-learned ranking 时,候选生成的问题从 precision 转移到了 recall:生成和 query pin 相关的各种各样diversepins 集合。由于我们发现了覆盖率 coverage 和召回率 recall 方面的差距,这导致我们添加了新的候选源 candidate sources(上图的 (d) )。

11.2.1 Board 共现

  1. 我们主要的候选生成器candidate generator是基于用户收藏的 user-curated boardspinsgraph ,但是随着时间的推移我们改变了这个方法从而产生更相关relevant 的结果并覆盖更多的 query pins

  2. 启发式候选Heuristic Candidates :原始的 Related pins 是在离线 Hadoop Map/Reduce 作业中计算的。我们输入boards 的集合,输出在同一个 board 上共现的 pin pair 对。由于有太多的 pin pair 对,因此对于每个 pin query 我们随机采样这些 pair 对从而为每个pin query 产生大致相同数量的候选。

    随机采样时,共现次数越高的 pin pair 对被采样到的可能性越高,因此相当于选择 top 共现次数的 pin pair 。但是基于采样的方法避免了对 pin pair 的共现计数、以及对计数结果的排序。

    我们还基于粗略rough 的文本和类目category 匹配来添加启发式的相关性得分heuristic relevance score 。这个相关性得分是通过检查示例结果example results 来手动调优 hand-tuned 的。

    我们选择该方法是因为它很简单。由于工程资源有限,该方法是由两名工程师在短短三周内实现的。另外,由于人类收藏human-curated board graph 已经是非常强烈的信号,因此该方法被证明是一种相当有效的方法。

  3. 在线随机游走Online Random Walk:我们发现:

    • board 共现co-occurrence 越高候选item 质量越好,如下图所示。

      然而,原始的方法主要是基于启发式得分heuristic score,它并没有试图最大化 board 共现。

    • 我们还注意到,罕见rarepin (仅出现在少量board 上)没有太多的候选item

    为了解决这些局限性,我们通过在线遍历 board-to-pin graph ,在 serving time 生成候选 item

    现在我们使用一个叫做 Pixie 的随机游走服务random walk service 来生成候选itemPixie 完整的描述不在本文讨论范围之内,但是从广义上讲,Pixiepins & boards 二部图bipartite graph 加载到一台具有大存储容量的机器上。二部图的边代表一个 board 关联了一个 pin 。我们根据一些启发式规则heuristic rules 裁剪该二部图,从而在 board 上删除 high-degree 节点和 low-relevance 节点。Pixiequery pin 开始在二部图上进行多次随机游走(大约 100,000 步),并在游走的每一步都有 reset 概率,最终汇总 pin 的访问次数。这样可以有效地计算出二部图上 query pinPersonalized PageRank

    该系统可以更有效地利用 board 的共现,因为高度相关联highly connectedpins 更可能被随机游走访问到。它还可以增加罕见pins 的候选覆盖率candidate coverage,因为它可以检索距离 query pin 好几个hops 的候选item

    pins 的共现代表了 pin-board-pin 的二阶邻近性,而随机游走方法可以检索 pin-board-pin-board-pin 这类的高阶邻近性从而提高罕见 pins 的候选覆盖率。

11.2.2 Session 共现

  1. board 共现在生成候选集时提供了良好的召回recall,但是死板 rigid 的、基于 board 的分组具有固有的缺陷inherent disadvantages

    • boards 通常过于宽松broad,因此board 上的任何 pin pair 对可能仅仅是很微弱地相关。对于生命周期很长的 boards 而言尤其如此,因为 board 的主题 topic 会随着用户的兴趣而漂移drift
    • boards 也可能过于狭窄narrow 。例如,威士忌和用威士忌调制的鸡尾酒可能被安排在不同的、但是相邻的 boards 上。

    这两个缺点可以通过结合用户行为的时间维度temporal dimension 来解决:在同一个会话session 期间保存的 pins 通常以某种方式关联。我们建立了一个名为 Pin2Vec 的额外侯选源 candidate source ,从而利用这些 session 共现 co-occurrence 信号。

    Pin2Vec 是在 d 维空间中嵌入 N 个最热门的 pins 的一种学习方法,目标是将同一个 session 中保存的pins 之间的距离最小化。Pin2Vec 神经网络的架构类似于 Word2Vec。学习问题learning problem 被表述为 N 路分类问题,其中输入和输出均为 Npins 之一,如下图所示。

  2. 为了产生训练数据,我们认为同一个用户在特定时间窗口内保存的 pins 是相关的。每个训练样本都是这样的一对 pins

    给定 pin pair 对的其中一个 pin 作为输入,一个 embedding matrixpin ID 映射到 d 维向量,然后一个 softmax layerembedding 向量映射回预测的输出pin ID 。这个 pair 对的另一个 pin 作为预期的输出,然后我们通过最小化网络的交叉熵损失来训练 embedding 。我们还使用负样本采样从而使得训练过程更简单。

    • 模型是通过 TensorFlow 来构建和训练的,结果得到了 Npins 中每个 pindembedding
    • serving 时,当用户queryNpins 中的某个时,我们通过在 embedding 空间中查找 query pin 最近的邻居来生成候选集。
    • 我们发现,session-based 候选集和 board-based 候选集结合起来会大大提高相关性 relevance 。从概念上讲,session-based 方法以紧凑compact 的向量 representation 捕获了大量用户行为。

11.2.3 补充的候选

  1. 在取得上述进展的同时,出于两个原因,我们开始开发新的候选生成技术:

    • 首先,我们想解决冷启动问题:罕见pins 没有很多候选,因为它们没有出现在很多 boards 上。
    • 其次,在添加了 Ranking 模块之后,我们希望在结果的多样性 diversity 带来更多互动 engagement 的情况下扩大我们的候选集。

    出于这些原因,我们开始利用其它的 Pinterest discovery 技术。

  2. 基于搜索的候选search-based candidates:我们利用 Pinteresttext-based search 来生成候选,其中使用 query pin 的注释annotations (来自于 web link 或者描述descriptioin 的单词)作为 query tokens 。每个热门的 search query 都有 Pinterest Search 提供的预计算的 pin 集合来支持。

    这些基于搜索的候选相对于基于board 共现的候选而言相关性较低,但是从探索exploration 的角度来看,这是一个不错的折衷trade-off 方案:基于搜索的候选产生了更多样化diversepin 集合,而且这些 pin 集合仍然和 query pin 具有相关性。

  3. 视觉相似的候选visually similar candidates:我们有两个视觉候选源。

    • 如果某个imagequery image 是几乎重复 near-duplicate 的,那么我们将该image 添加到 Related Pins 推荐结果中。
    • 如果没有和 query image 几乎重复的image,那么我们使用 Visual Search 后端基于 query image embedding 向量的最近邻查找lookup来返回视觉相似的 image

11.2.4 分区的候选

  1. 最后我们要解决内容激活问题content activation problem :罕见的pins 不会作为候选pins 出现,因为它们不会出现在很多 board 上。

    Pinterest 开始专注于国际化时,我们希望向国际用户展示更多的以他们自己语言的结果。大部分内容是来自美国的英语。尽管确实存在本地化内容 local content,但是这些内容不是很热门,也没有链接到热门的 pins ,因此不会被其它侯选源来生成。

    为了解决这个问题,我们为上述许多生成技术生成了按本地化分区 segmented by locale 的附加 additional 候选集。例如,对于 board 共现,我们将 board-pin graph 的输入集合过滤为仅包含本地化 localepins

    这种方法也可以扩展到存在内容激活问题的其它维度,例如特定于性别gender-speci fic 的内容或者新鲜fresh 的内容。

11.3 Memboost 的演变

  1. 最初的 Related Pins 版本已经获得了大量的互动engagement 。作为从大量互动日志中学习的第一步,我们构建了 Memboost 来记住每个query 的最佳 pins 结果。我们选择在尝试全面学习之前实现Memboost,因为它更轻量级 lightweight ,并且我们直觉上相信它会有效。

  2. 我们最初只是想简单地合并每个结果的历史点击率historical click-through rate。但是,日志数据容易受到位置偏见 position bias 的影响:显示在更前面位置的 item 更容易被点击。下图说明了每个平台platform 上不同 rank 的全局点击率的 bias (排名越小则显示越靠前)。为解决这个问题,我们选择了计算 clicks over expected clicks: COEC

  3. COEC:令 $ \text{clicks}(q,r) $ 为result pin rquery pin q 上获得的总点击量。令 $ i_{p,k}(q,r) $ 为平台 $ p $ 、rank $ k $ 上 result pin rquery pin q 上获得的总曝光量。每个曝光贡献了一定比例的期望点击expected clicksresult pin rquery pin q 上的期望点击量为:

    $ \text{Eclicks}(q,r) = \sum_p\sum_k i_{p,k}(q,r)\times \text{ctr}_{p,k} $

    其中 $ \text{ctr}_{p,k} $ 为平台 $ p $ 、rank $ k $ 的全局先验global prior 的点击率。

    这里面的 $ \text{ctr}_{p,k} $ 是根据统计数据计算而来。上面公式的物理意义为:点击 = 曝光 x ctr ,但是对 platformrank 求积分。

    我们将这些定义扩展到其它互动行为(不仅仅是点击),将这些互动行为的权重设为 $ \beta_1,\cdots,\beta_4 $ :

    $ \text{action}(q,r) = \beta_1\times \text{clicks}(q,r)+\beta_2\times \text{longclicks}(q,r)\\ +\beta_3\times \text{closeups}(q,r) + \beta_4\times \text{saves}(q,r)\\ \text{Eaction}(q,r) = \beta_1\times \text{Eclicks}(q,r)+\beta_2\times \text{Elongclicks}(q,r)\\ +\beta_3\times \text{Ecloseups}(q,r) + \beta_4\times \text{Esaves}(q,r)\\ $

    现在 $ \text{action}(q,r)/\text{Eaction}(q,r) $ 为对所有互动行为泛化的 COEC

  4. Memboost score:为了获得一个 zero-centered score,其中正值和负值分别表示结果比期望多互动多少和少互动多少,我们使用 COEC 的对数。

    另外我们还引入平滑来处理低互动或低曝光的 item 。因此,总体的 Memboost score 为:

    $ \text{MB}(q,r) = \log \frac{\text{action}(q,r) + \alpha}{\text{Eaction}(q,r) + \alpha} $

    Memboost score 用于调整现有的 pin score,并根据调整后的 score 来排序得到最终结果:

    $ \text{AdjustScore}(q,r) = \text{Score}(q,r) + \gamma\times \text{MB}(q,r) $

    历史上,Memboost 权重 $ \beta_1,\cdots,\beta_4,\gamma $ 通过 A/B test 来人工调优hand-tuned ,从而最大化互动engagement 。然而,这种做法会给评分函数带来不良的耦合影响:尝试使用新的 ranker 或者改变评分函数可能会产生更大或更小的初始得分 initial scores,从而无意中改变了 Memboost 权重的相对大小。人工调优的权重对于新的条件condition (系统改变、不同的时间段等等)不再是最优的。

    每次改变 $ \text{Score}(q,r) $ 时,都需要重新调优 Memboost 的超参数。

    为了消除这种耦合,我们现在在改变模型时共同训练 Memboost 参数。我们将 Memboost 作为特征, Memboost 的临时变量取值(clicksEclicks 等等)作为特征馈入到基于机器学习的 ranker 中。

  5. Memboost Insertion:有时,已知某些 item 是好的(基于它们的 Memboost scores ),但是由于候选生成器和 ranking sytem 等上游的变化,这些 item 不再出现在候选结果中。

    为了处理这些情况,我们设计了一个 Memboost insertion 算法。该算法将 Memboost score 最高的 top-n item 插入到候选结果中,如果这些item 并未出现在候选结果中。

    Memboost 结果作为一路召回。Memboost 本质上就是记忆性 memorization,它会记住历史上表现好的(query pin q, result pin r) 。由于模型通常综合考虑了 memorizationgenerization ,因此一些历史表现好的 pair 可能会被稀释掉。

  6. Memboost 作为一个整体,通过在系统中添加反馈回路 feedback loops ,显著增加了系统的复杂性。从理论上讲,它可以破坏corrupting 或者稀释diluting 实验结果:例如,实验中的正样本可能被挑选出来并泄漏到控制组和对照组(因为控制组和对照组都收到了反馈回流的 Memboost 数据)。重新评估历史的实验(例如添加了新的模型特征)变得更加困难,因为这些实验的结果可能已经被记住了。

    这些问题存在于任何基于记忆memorization-based 的系统中,但是 Memboost 具有显著的正向效果,因此我们也就接受了这些潜在的不足。

  7. 我们目前正在实验替代 Memboost insertion 的方法。Memboost insertion 会减缓开发速度development velocity ,因为有害harm 结果的实验可能不再显示为负向的 A/B test 结果。而且新的 ranking 方法的试验效果可能被稀释,因为 top 结果可能被Memboost insertion 所主导。 Memboost insertion 也可以无限期地维持候选items ,即使候选生成器不再生成这批候选 items (这批候选 itemsMemboost insertion 产生,并始终在线上生效)。

    一种常见的替代 memorization 方法是将 item id 作为 ranking 特征。但是,这需要一个大的模型(模型规模和被记忆的 item 数量呈线性关系),因此需要大量的训练数据来学习这些参数。这样的大型模型通常需要分布式训练技术。取而代之的是,Memboost 预先聚合了每个result 的互动统计量engagement statistics,这使得我们能够在单台机器上训练主力 ranking 模型。

11.4 Ranking 的演变

  1. 在引入 Ranking 之前,Candidate GenerationMemboost 已经工作了相当长的一段时间。我们假设下一个最大的潜在提升 potential improvement 将来自于我们在系统中添加一个 ranking 组件,并应用 learning-to-rank 技术。

    第一个 learning-to-rank 模型大幅度提升了 Related Pins 的互动engagement ,使得用户保存save 和点击click 结果提升了 30% 以上。

  2. 在我们的application 中,ranker 在特定query $ Q $ 的上下文中对候选 pins 进行重新排序re-order。其中 query $ Q $ 包括 query pin、浏览的用户、以及用户上下文user context 。这些 query 部分和候选 pin $ c $ 各自贡献了一些异质heterogeneous 的、结构化structured 的原始数据,例如注释annotations、类目categories、或者最近的用户活动user activity 。如下表所示,给出了ranking feature extractor 中样本可用的原始数据。

    我们定义了很多特征抽取器feature extractors ,这些特征抽取器输入原始数据并生成单个特征向量 $ \phi(Q,c)\in \mathbb R^D $ 。

    • 某些特征抽取器直接将原始数据拷贝到特征向量中,例如topic 向量和 category 向量。
    • 另一些特征抽取器则计算原始数据的变换,如 Memboost 数据的归一化normalized 或者 re-scaled 的版本。
    • 一些特征抽取器将 one-hot encoding 应用于离散字段 categorical fields,例如性别、国家。
    • 最后,一些特征抽取器计算匹配分match scores,例如 query pincandidate pin 之间的类目向量 category vector 的余弦相似度,或者 query imagecandidate image 之间的 embedding 距离。

    ranking 模型 $ \mathcal F:\mathbb R^{D}\rightarrow \mathbb R $ 输入特征向量并产生最终的 ranking score。这个 ranking 模型是从训练数据中学习的,其中训练数据在后文中描述。

  3. 我们的第一个 ranking 系统仅使用 pin 原始数据。随着我们获得了额外的工程能力来构建必要的基础架构,我们将更多数据(如 Memboost 数据和用户数据)引入到 ranking 系统。我们还引入了从用户最近活动recent activities 中抽取的个性化特征,如用户最近的search query

11.4.1 选择

  1. 在构建 ranking 系统时,我们面临三个重大largely 的正交orthogonal 的决策:

    • 训练数据集收集方法training data collection method
    • 学习目标函数learning objective
    • 模型类型model type

    正交指的是决策之间互不影响。

  2. 训练数据集收集:我们探索了训练数据的两个主要数据源:

    • Memboost scores 作为训练数据。从概念上讲,在没有足够日志数据来进行可靠的 Memboost 估计 estimate 的情况下,ranker 可以学习预测 query-result pair 对的 Memboost scores

      即,对于无法从日志数据计算 Memboost scoresquery-result pair 对,可以通过模型来预测。

    • 单个 Related Pins session: 会话session 定义为单个用户以单个 query pinRelated Pins 进行交互的结果。我们可以将这些交互直接作为训练数据的样本。

  3. 模型目标函数:在 《Learning to rank for information retrieval》 中,learning-to-rank 方法大致可以分为 point-wise 方法、pair-wise 方法、list-wise 方法。这些方法之间的主要区别在于:损失函数是一次考虑一个候选item 、两个候选item 、还是多个候选item

    在我们的工作中,我们探索了 point-wise 方法和 pair-wise 方法,如下表所示。

  4. 模型形式formulation :模型的精确precise 形式 form 决定了模型来描述特征和score 之间复杂关系的能力。下表比较了我们使用的两种模型类型model types

11.4.2 决策演变

  1. 下表给出了我们在 Related Pins Ranking 中探索的训练数据、目标函数以及模型的各种组合。

  2. 第一版V1Memboost 训练数据、相关性pair 标签relevance pair labelspair-wise 损失函数、线性 RankSVM 模型。

    在我们的第一版中,我们选择使用 Memboost 数据,因为我们发现 Memboost 数据是高质量的信号:它是在很长一段时间内数百万用户行为的聚合。

    我们为每个query 显式采样 pair 对 $ (r_1,r_n),(r_n,r_{\text{rand}}) $ ,其中:

    • $ r_1 $ 是针对 query pinMemboost scores 最高pin
    • $ r_n $ 是针对 query pinMemboost scores 最低 pin
    • $ r_{\text{rand}} $ 是从 Pinterest 随机采样的一个热门的 pin ,用于稳定排名(如论文 《Optimizing search engines using clickthrough data》 所示)。

    我们认为,由于候选生成器提供了一定程度的相关性relevance ,因此具有较低 Memboost scorespin 仍然比随机 pin 更相关relevant

    当我们从 Memboost 数据中人工检查 pair 对时,我们发现大约 70% 的时间可以猜测哪个 pinMemboost score 更高。这表明训练数据是相当干净clean 的 。相比之下,从每个user session 中采样的 pair 对的噪声很大,我们无法确定用户保存了两个pin 中的哪一个。

    因此,我们可以使用一个小得多的语料库,并且在几分钟之内在单台机器上训练一个模型。

  3. 第二版V2:转向单个individualRelated Pins sessions

    我们希望使用用户特征和上下文特征,但是使用 Memboost 数据固有地inherently会排除个性化,因为 Memboost 数据是在很多用户上聚合的,从而失去了与单个用户以及 session 上下文的关联。此外,我们发现只有热门的内容才具有足够的交互,从而提供可靠的 Memboost 数据。这些局限性促使我们转向单个 Related Pins sessions

    每个记录loggedsession 均由 query pin、浏览的用户、最近的动作上下文 action contextresult pins 列表a list of result pins来组成。每个 result pin 还具有一个对应的互动标签engagement label(可以为以下之一:仅仅曝光impression、特写closeup、点击click、长点击 long click、保存 save)。

    出于训练的目的,我们裁剪记录loggedpin 集合,按照 rank order 取每个互动的 pin 以及紧紧排在它前面的两个前序的 pins 。我们假设用户可能看到了紧紧排在互动pin 之间的前序pins

    V2 版中,我们继续使用 pair-wise 损失,但是pin relevance pairs 由动作的相对顺序来定义:save > long click > click > closeup > impression only

  4. 第三版 V3:转向一个 RankNet GBDT 模型。

    我们发现,简单的线性模型能够从 ranking 中获得大部分的互动增益engagement gain。但是,线性模型有几个缺点:

    • 首先,它迫使 score 和每个特征的依赖关系为线性的。为了让模型表达更复杂的关系,工程师必须人工添加这些特征的转换(分桶 bucketizing、分区间percentile、数学转换mathematical transformations、归一化normalization)。

    • 其次,线性模型无法添加仅依赖于 query pin 而不依赖于候选 pin 的特征。例如,假设特征 $ \phi_k $ 代表一个类似于 query category = Art 的特征,每个候选 pin 将具有相同的特征(因为 query 是同一个),所以对于ranking 结果毫无影响。

      query-specific 特征必须和候选pin 的特征进行手动交叉,例如添加一个特征来表示 query pin category + candidate pin category 。设计这些交叉特征费时费力。

    为避免这些缺点,我们转向梯度提升决策树gradient-boosted decision trees: GBDT

    除了允许对单个特征进行非线性响应外,决策树还固有地考虑了特征之间的交互,这对应于树的深度。例如,可以对推理reasoning 进行编码,如 “如果 query pin categoryArt ,那么视觉相似性应该是更强的相关性信号 relevance signal” 。通过自动学习特征交互feature interactions,我们消除了执行人工特征交叉的需要manual feature crosses ,加快了开发速度。

  5. 第四版V4:转向 point-wise 分类损失、二元标签binary label、逻辑回归 GBDT 模型。

    尽管我们最初选择了 pair-wise learning,但是我们也已经在 point-wise learning 中取得了良好的结果。由于我们在线实验的主要目标指标target metric 是用户保存 result pin 的倾向 propensity ,因此使用包含 closeupsclicks 的训练样本似乎会适得其反,因为这些动作可能不会影响保存倾向save propensity

    我们发现给样本提供简单的 binary 标签(saved 或者 not saved ),并且重新加权 reweighting 正样本来对抗类别不平衡,这在增加保存倾向方面被证明是有效的。将来,我们仍然可以使用不同的 pair 采样策略来实验 pair-wise ranking loss

11.4.3 Previous-Model Bias

  1. 在我们努力改进 ranking 的过程中,我们遇到了一个重大的挑战。因为互动日志engagement logs 用于训练,所以我们引入了直接反馈环direct feedback loop,如论文 《Hidden technical debt in machine learning systems》 所述:当前部署currently deployed 的模型极大地影响了为将来模型future models 生成的训练样本。

    我们直接观察到了这个反馈环的负面影响negative impact 。当我们训练第一个 ranking model 时,日志反映了用户对仅由候选生成器排序的结果的互动。所学的模型被用于对这批候选进行排序。在接下来的几个月里,训练数据只反映了现有模型中排序较高的 pins 的互动(如下图(a) 所示)。

    当我们尝试使用相同的特征和最近的互动数据来训练一个模型时,我们无法击败已经部署的模型。我们认为反馈环带来了一个问题,即训练时 pin 分布和 serving 时的 pin 分布不再匹配。

    训练时的 pin 分布:由老模型产生;serving 时的 pin 分布:由新模型产生(由新模型排序并截断)。

  2. 为了缓解训练数据中的 previous-model bias,我们为 unbiased data collection 分配了一小部分流量:对于这些请求,我们显示了来自所有候选来源的随机样本,并且没有 ranking 而随机排序。这将训练数据和之前的模型隔离开来(如上图(b) 所示)。

    虽然未排序unrankedresult 质量较低,但是它们为训练新的 ranking model 提供了有价值的数据。为了避免过多降低任何特定用户的体验,每个用户只在一小部分随机query 中获取未排序的 pins 。尽管训练数据的数量被限制在总流量的这一小部分,但是最终得到的模型要比用有偏的数据biased data 训练的模型表现得更好。

    仅用这 1% 的随机流量来训练模型,会不会因为数据量太低而降低模型效果?一种方法是:将这 1% 流量的样本加权(比如加权 10 倍),然后和剩余 99% 流量的样本一起训练。

11.4.4 衡量指标

  1. 能够探索这些不同选项的一个重要step 是能够快速迭代。测试变更效果的金标准gold standard 是在线 A/B test 实验,其中我们主要根据 save propensity 来评估 ranking

    所有的变更都要经过在线实验,但是在线 A/B test 通常需要几天或者几周的时间来收集数据。我们认为,通过离线评估来马上测试变更效果从而近似approximate 不同模型的性能是有帮助的。在这个过程中,我们重复使用了很多训练数据生成器来采样每个 Related Pins sessions(即,生成训练集),但是选择了一个紧跟着训练日期的不同日期范围、以及一个和训练采样策略稍微不同的采样策略(即,生成测试集)。对于每个session,我们使用被测模型对用户实际看到的pins (即,label )进行重新打分rescore(即,预测),然后评估预测的 score 和记录的用户行为之间的一致性。

  2. 我们已经尝试了多种度量方法,包括 normalized discounted cumulative gain: NDCGPR AUC

    为了确定这些离线指标在多大程度上预测了在线 A/B test 影响,我们检查了我们过去几次 ranking model 变更的结果。我们检查了通过离线评估预测差异(即新模型和 baseline 模型在测试集评估指标上的差异)的方向和大小,并将其与实际实验结果进行比较。我们发现:PR AUC 指标对于 A/B test 实验中的 closeupsclick-throughs 具有极强的预测性,但是我们很难用离线评估来预测 save 行为。

    目前,我们将离线指标用作健全性检查sanity check 和潜在影响potential impact的粗略估计rough estimation

11.4.5 Serving 架构

  1. Related Pins 在峰值负载下每秒可以处理数万个query。为了处理这种规模,我们利用了几个现有的 Pinterest 系统。

  2. 我们的第一版 pin ranking 是在离线的 Map-Reduce 作业中预计算pre-computed的,并由 Terrapin 提供服务(这是一个不可变的 key-valuelookup service )。这需要大量的 Map-Reduce 作业来为每个 querycandidatejoin 原始数据、计算特征、并对 item 进行打分。

    由于集群的限制,我们一次只能对几百万个 query 进行rank,从而覆盖了 50% 的用户 query 。我们通过一次在不同的segments 上运行 reranking 作业并合并结果来 scale up,但是这种方法本质上inherently 无法在合理reasonable 的时间内提供完全覆盖。

    离线排序也显著降低了开发速度:每个变更模型的实验(特征开发、训练数据变更)都需要离线重新排序reranking 所有的 query,这是一个耗时的过程。

  3. 为此,我们转向在线 ranking serving systempin 的原始数据存储在叫做 RealPin 的分片shardedkey-value store 中,通过image signature 作为key

    为了执行ranking,我们将一个请求request 和计算特征和score 所需的候选pins 列表、其它原始数据组装assemble 在一起:query pin 原始数据(从 RealPin 检索到)、离线的用户原始数据(从 Terrapin 而来)、最近的用户活动(从一个叫做 UserContextServiceservice 而来)。

    • RealPin root server 将请求复制到 RealPin leaves server,将合适的候选子集路由到每个leaf server

    • leaf server 在本地检索 pin 原始数据,并调用我们自定义的特征抽取器custom feature extractorscorer

      注意:leaf server 存储了 pin 的原始数据。

    • leaf server 发送 top 候选以及相应的 scoreroot server,然后由root server 收集并返回全局的 top 候选集。

    我们选择了这种 serving 架构来提高数据局部性 data locality 。基于 Hadoop 的系统在每次query 时都需要传输大量的pin 原始数据。我们还看到,由于 pin 原始数据的传输,其它的 online pin scoring 系统受到网络的限制。通过将计算下推到存储候选pin 原始数据的节点,可以避免大量的数据传输。

11.5 挑战

  1. Changing Anything Changes Everything:根据《Hidden technical debt in machine learning systems》,机器学习系统固有地会纠缠信号tangle signals。输入从来都不是真正独立的,这就产生了 Changing Anything Changes Everything: CACE 原则:系统的一个组件可以针对系统的现有状态进行高度优化。改进另一个组件可能会导致整体性能下降。这是一个 system-level 的局部最优点 local optimum,可能会使得进一步的进展变得困难。我们的通用解决方案是为每个实验联合 train/automate 尽可能多的系统。

    我们提供了一些例子,这些例子说明了在我们的简单推荐系统中出现的这一特殊挑战,以及我们的缓解措施。

    • 例子一:在我们的推荐系统 pipeline 的各个阶段中使用了很多超参数。回想一下,我们使用手动调优hand-tuned的权重对 Memboost 进行调优,并通过耗时耗力的 A/B test 来进行优化。随着系统其它部分的改变,这些很快就过时了。联合训练 Memboost 权重避免了这个问题。同样地,ranking learner 也有需要调优的超参数。

      为了避免导致超参数变得次优 sub-optimal的其它变更,我们实现了一个用于自动调参automated hyperparameter tuning 的并行系统。因此,我们现在可以在每次变更模型时调优超参数。

    • 例子二:对原始数据的 “改进” 可能会损害我们的结果,因为我们的下游模型是基于旧的特征定义进行训练的。即使修复了一个 bug(例如在计算 pin 的类目向量时),我们现有的模型将依赖于有缺陷的特征定义,因此这个 fix 可能会对我们的系统产生负面影响。如果变更来自于另一个团队,这尤其会成为问题。在《Hidden technical debt in machine learning systems》中,这被称作不稳定的数据依赖unstable data dependency

      目前,我们必须使用更新后的原始数据手动重新训练我们的模型,同时将新模型和更新后的原始数据部署到生产环境中(因为在线部署时需要获取样本特征,所以要将原始数据部署到线上)。除了耗时之外,这个解决方案也不太理想,因为它需要我们了解上游的变化。理想情况下,我们将自动对我们的模型进行连续的再训练 continual retraining,从而将上游数据upstream data 的任何变化考虑进来。

    • 例子三:最后,我们经历了 candidate generationranking 之间复杂的相互依赖关系。模型变得和训练数据的特点相协调。例如,变更或引入一个 candidate generator 会导致 ranker 的恶化,因为训练数据的分布不再和 serving 时的 ranking 数据的分布相匹配。这是我们在训练数据收集中看到的一个问题。

      如果引入一个 candidate generator 无法提高性能,那么如何确定这是由于 candidate generator 性能较差、还是由于ranker 并没有针对这个 candidate generator 的候选上训练过?

      我们目前的解决方案是:在用新训练的模型运行实验之前,将candidate generator 得到的候选插入训练集一段时间。

      这种方案一次改变一个变量:先固定 ranking 模型,仅改变 candidate generator ;然后固定 candidate generator ,重新训练 ranking 模型。

      这个问题强调了尽可能简化系统的必要性,因为可能的非预期交互unintended interactions 的数量随着系统组件的数量而迅速增加。

  2. 内容激活:有大量的内容没有互动量,但是这些内容可能是潜在相关potentially relevant 的和高质量 high quality 的。每天都有数百万张新图像上传到 Pinterest。此外还有大量的 dark 内容,这些dark 内容是高质量的,但是很少出现。

    平衡fresh or dark 内容和完善的、高质量的内容,这代表了经典的探索和利用问题 explore vs exploit problem 。这是 Pinterest 的一个开放问题。我们深入探讨了如何针对本地化localization 的情况解决内容激活 content activation 问题。

    由于 Pinterest 是一种日益国际化的产品,因此我们特别努力确保国际用户能够看到他们自己语言的内容。出于两个主要原因,使得Related Pins 本地化很困难:

    • 首先,一开始就没有多少本地化的候选,因为这些本地化内容并没有出现在很多 board 上。
    • 其次,本地化内容的历史互动要少得多,这导致我们的模型对本地化内容的排名更低,即使我们确实有本地化的候选。(即数据稀疏导致的冷启动问题)

    我们尝试了几种方法来解决这些问题,最终能够将本地化 result的占比从 9% 增加到 54% ,如下图所示。

    • Local pin swap:对于我们生成的每个相关relatedpin,我们检查是否存在具有相同图像的本地化替代local alternative 。如果存在,那么我们将result pin 换本地化替代的pin

      结果,我们增加了本地化的pin 曝光、以及本地化的 pin save,而不会改变结果的相关性。

    • Local pin boost:当返回的候选集中存在和浏览者相同语言的 pin (即本地化的pin )时,我们试图人为地将本地化的pin 的排名提升到 result set 中更高的位置。

      事实上证明这并不是特别有效,因为此时的候选集并没有包含很多本地化的 pin,因此该解决方案的覆盖率coverage 较低。

    • Localizing candidate sets:我们修改了 board-based 的候选生成方法,从而在 pin 采样之前对语言进行过滤,并生成针对每种语言的 segmented corpus

      此外,为了增加对这些本地化的 pin 的曝光,我们选择以不同的比例将本地化的候选混合到 result 中。

    这些手段都是基于业务策略的方法,而不是基于模型的方法。基于模型的方法是后验的、数据驱动的,基于策略的方法是先验的、规则驱动的。当冷启动或其它数据稀疏场景时,策略方法要优于模型方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文