数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
十一、Pinterest Recommender System [2017]
虽然已经有很多关于高级推荐系统及其实际应用的论文发表,但是通常不可能直接构建
state-of-the-art
的推荐系统。最初的产品initial product
必须用一个小的工程团队、有限的计算资源、以及缺乏训练数据来构建,直到推荐系统被启用bootstrapped
。工业级的推荐系统通常处理包含数十亿个item
的Web-scale
数据。由于内容是通过用户隐式反馈implicit user feedback
收集的,因此内容通常标记不佳并且有很大噪音noisy
。因此,很多从业者在构建初始系统时选择使用临时的启发式方法heuristics
来trade-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 results
。Memboost
在工程复杂度和计算强度方面都是轻量级的,但是它能显著地利用大量的用户反馈user feedback
。我们不得不考虑位置偏差position bias
,并以反馈回路feedback loops
的形式处理复杂性complexity
,但是发现付出的代价是值得的。 - 接下来我们添加了一个机器学习的
ranking
组件,因为我们认为它具有最大的影响潜力。我们从只有九个特征的基础线性模型开始。当我们发现模型和训练方法的缺点时,我们开始尝试使用更高级的方法。
每个组件最初都是在工程和计算资源上有很多限制的情况下构建的,因此我们优先考虑了最简单和最高效的解决方案。我们展示了有机增长
organic growth
如何导致一个复杂的系统,以及我们如何管理这种复杂性。- 对于
11.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
推荐,包括主页feed
流home feed
、访客(身份未验证的访问者)的pin page
、相关想法related ideas
的instant ideas
按钮、电子邮件email
、通知notification
、搜索结果search result
、浏览选项卡Explore tab
。Pinterest
上的用户互动user engagement
通过以下操作来定义:- 用户通过点击来查看有关
pin
的更多详细信息从而特写closeup
这个pin
。 - 然后,用户可以点击从而访问关联的
Web
链接。如果用户长时间off-site
,那么被视为长按long click
。 - 最后,用户可以将
pin
保存到自己的board
上。
我们对推动相关
pin
的保存倾向Related Pins Save Propensity
很感兴趣,它的定义是:保存Related Pins
推荐的pin
的数量除以用户看到的Related Pins
推荐的pin
的数量。- 用户通过点击来查看有关
在
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 pin
和result pin
的引用实际上指的是pin
的集合,该集合中的pin
具有相同image signature
。Related Pins
系统包含以下三个主要组件components
。随着时间的推移,这些组件已经被陆续引入到系统中,并且每个组件以各自的方式发生了巨大的演变 。下图给出了我们体系结构的各种快照snapshots
,说明了整个系统以及三个组件的演变evolution
。本文后续部分将更详细地探讨它们的发展。Candidate Generation
组件:我们首先将候选集合candidate set
(符合Related Pin
推荐的pin
集合)的范围从数十亿缩小到大约1000
个可能和query pin
相关related
的pin
。我们已经开发并迭代了几种不同的候选生成器
candidate generators
来做到这一点。Memboost
组件:我们系统的一部分会记住历史上特定query
和result
的pair
对上的互动。我们描述了在使用历史数据时,如何通过使用点击除以期望点击的方式来解决位置偏见position bias
问题。引入记忆会增加带有反馈回路
feedback loops
系统的复杂性,但是会显著提高互动engagement
。Ranking
组件:我们应用一个机器学习的ranking model
到pin
上,对这些pin
排序从而最大化我们的Save Propensity
的目标互动指标target engagement metric
。该模型结合了query
特征、candidate pins
特征、用户画像特征、session
上下文特征、Memboost
信号等特征的组合。我们采用了
learning-to-rank
技术,采用历史用户互动user engagement
来训练系统。
11.2 Candidate Generation 的演变
最初的
Related Pins
系统仅包含一种形式的候选生成candidate generation
:通过抽取经常共现co-occurring
的pins
来利用pin-board graph
。这些候选pins
作为推荐直接显示给用户(上图的(a)
)。后来我们引入了
Memboost
和machine-learned ranking
时,候选生成的问题从precision
转移到了recall
:生成和query pin
相关的各种各样diverse
的pins
集合。由于我们发现了覆盖率coverage
和召回率recall
方面的差距,这导致我们添加了新的候选源candidate sources
(上图的(d)
)。
11.2.1 Board 共现
我们主要的候选生成器
candidate generator
是基于用户收藏的user-curated
boards
和pins
的graph
,但是随着时间的推移我们改变了这个方法从而产生更相关relevant
的结果并覆盖更多的query pins
。启发式候选
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
已经是非常强烈的信号,因此该方法被证明是一种相当有效的方法。在线随机游走
Online Random Walk
:我们发现:board
共现co-occurrence
越高候选item
质量越好,如下图所示。然而,原始的方法主要是基于启发式得分
heuristic score
,它并没有试图最大化board
共现。我们还注意到,罕见
rare
的pin
(仅出现在少量board
上)没有太多的候选item
。
为了解决这些局限性,我们通过在线遍历
board-to-pin graph
,在serving time
生成候选item
。现在我们使用一个叫做
Pixie
的随机游走服务random walk service
来生成候选item
。Pixie
完整的描述不在本文讨论范围之内,但是从广义上讲,Pixie
将pins & boards
二部图bipartite graph
加载到一台具有大存储容量的机器上。二部图的边代表一个board
关联了一个pin
。我们根据一些启发式规则heuristic rules
裁剪该二部图,从而在board
上删除high-degree
节点和low-relevance
节点。Pixie
从query pin
开始在二部图上进行多次随机游走(大约100,000
步),并在游走的每一步都有reset
概率,最终汇总pin
的访问次数。这样可以有效地计算出二部图上query pin
的Personalized PageRank
。该系统可以更有效地利用
board
的共现,因为高度相关联highly connected
的pins
更可能被随机游走访问到。它还可以增加罕见pins
的候选覆盖率candidate coverage
,因为它可以检索距离query pin
好几个hops
的候选item
。pins
的共现代表了pin-board-pin
的二阶邻近性,而随机游走方法可以检索pin-board-pin-board-pin
这类的高阶邻近性从而提高罕见pins
的候选覆盖率。
11.2.2 Session 共现
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
路分类问题,其中输入和输出均为N
个pins
之一,如下图所示。为了产生训练数据,我们认为同一个用户在特定时间窗口内保存的
pins
是相关的。每个训练样本都是这样的一对pins
。给定
pin pair
对的其中一个pin
作为输入,一个embedding matrix
将pin ID
映射到d
维向量,然后一个softmax layer
将embedding
向量映射回预测的输出pin ID
。这个pair
对的另一个pin
作为预期的输出,然后我们通过最小化网络的交叉熵损失来训练embedding
。我们还使用负样本采样从而使得训练过程更简单。- 模型是通过
TensorFlow
来构建和训练的,结果得到了N
个pins
中每个pin
的d
维embedding
。 - 在
serving
时,当用户query
了N
个pins
中的某个时,我们通过在embedding
空间中查找query pin
最近的邻居来生成候选集。 - 我们发现,
session-based
候选集和board-based
候选集结合起来会大大提高相关性relevance
。从概念上讲,session-based
方法以紧凑compact
的向量representation
捕获了大量用户行为。
- 模型是通过
11.2.3 补充的候选
在取得上述进展的同时,出于两个原因,我们开始开发新的候选生成技术:
- 首先,我们想解决冷启动问题:罕见
pins
没有很多候选,因为它们没有出现在很多boards
上。 - 其次,在添加了
Ranking
模块之后,我们希望在结果的多样性diversity
带来更多互动engagement
的情况下扩大我们的候选集。
出于这些原因,我们开始利用其它的
Pinterest discovery
技术。- 首先,我们想解决冷启动问题:罕见
基于搜索的候选
search-based candidates
:我们利用Pinterest
的text-based search
来生成候选,其中使用query pin
的注释annotations
(来自于web link
或者描述descriptioin
的单词)作为query tokens
。每个热门的search query
都有Pinterest Search
提供的预计算的pin
集合来支持。这些基于搜索的候选相对于基于
board
共现的候选而言相关性较低,但是从探索exploration
的角度来看,这是一个不错的折衷trade-off
方案:基于搜索的候选产生了更多样化diverse
的pin
集合,而且这些pin
集合仍然和query pin
具有相关性。视觉相似的候选
visually similar candidates
:我们有两个视觉候选源。- 如果某个
image
和query image
是几乎重复near-duplicate
的,那么我们将该image
添加到Related Pins
推荐结果中。 - 如果没有和
query image
几乎重复的image
,那么我们使用Visual Search
后端基于query image embedding
向量的最近邻查找lookup
来返回视觉相似的image
。
- 如果某个
11.2.4 分区的候选
最后我们要解决内容激活问题
content activation problem
:罕见的pins
不会作为候选pins
出现,因为它们不会出现在很多board
上。当
Pinterest
开始专注于国际化时,我们希望向国际用户展示更多的以他们自己语言的结果。大部分内容是来自美国的英语。尽管确实存在本地化内容local content
,但是这些内容不是很热门,也没有链接到热门的pins
,因此不会被其它侯选源来生成。为了解决这个问题,我们为上述许多生成技术生成了按本地化分区
segmented by locale
的附加additional
候选集。例如,对于board
共现,我们将board-pin graph
的输入集合过滤为仅包含本地化locale
的pins
。这种方法也可以扩展到存在内容激活问题的其它维度,例如特定于性别
gender-speci fic
的内容或者新鲜fresh
的内容。
11.3 Memboost 的演变
最初的
Related Pins
版本已经获得了大量的互动engagement
。作为从大量互动日志中学习的第一步,我们构建了Memboost
来记住每个query
的最佳pins
结果。我们选择在尝试全面学习之前实现Memboost
,因为它更轻量级lightweight
,并且我们直觉上相信它会有效。我们最初只是想简单地合并每个结果的历史点击率
historical click-through rate
。但是,日志数据容易受到位置偏见position bias
的影响:显示在更前面位置的item
更容易被点击。下图说明了每个平台platform
上不同rank
的全局点击率的bias
(排名越小则显示越靠前)。为解决这个问题,我们选择了计算clicks over expected clicks: COEC
。
$ \text{Eclicks}(q,r) = \sum_p\sum_k i_{p,k}(q,r)\times \text{ctr}_{p,k} $COEC
:令 $ \text{clicks}(q,r) $ 为result pin r
在query pin q
上获得的总点击量。令 $ i_{p,k}(q,r) $ 为平台 $ p $ 、rank
$ k $ 上result pin r
在query pin q
上获得的总曝光量。每个曝光贡献了一定比例的期望点击expected clicks
。result pin r
在query pin q
上的期望点击量为:其中 $ \text{ctr}_{p,k} $ 为平台 $ p $ 、
rank
$ k $ 的全局先验global prior
的点击率。这里面的 $ \text{ctr}_{p,k} $ 是根据统计数据计算而来。上面公式的物理意义为:点击 = 曝光 x
ctr
,但是对platform
和rank
求积分。我们将这些定义扩展到其它互动行为(不仅仅是点击),将这些互动行为的权重设为 $ \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
。Memboost score
:为了获得一个zero-centered score
,其中正值和负值分别表示结果比期望多互动多少和少互动多少,我们使用COEC
的对数。另外我们还引入平滑来处理低互动或低曝光的
$ \text{MB}(q,r) = \log \frac{\text{action}(q,r) + \alpha}{\text{Eaction}(q,r) + \alpha} $item
。因此,总体的Memboost score
为:
$ \text{AdjustScore}(q,r) = \text{Score}(q,r) + \gamma\times \text{MB}(q,r) $Memboost score
用于调整现有的pin score
,并根据调整后的score
来排序得到最终结果:历史上,
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
的临时变量取值(clicks
、Eclicks
等等)作为特征馈入到基于机器学习的ranker
中。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)
。由于模型通常综合考虑了memorization
和generization
,因此一些历史表现好的pair
可能会被稀释掉。Memboost
作为一个整体,通过在系统中添加反馈回路feedback loops
,显著增加了系统的复杂性。从理论上讲,它可以破坏corrupting
或者稀释diluting
实验结果:例如,实验中的正样本可能被挑选出来并泄漏到控制组和对照组(因为控制组和对照组都收到了反馈回流的Memboost
数据)。重新评估历史的实验(例如添加了新的模型特征)变得更加困难,因为这些实验的结果可能已经被记住了。这些问题存在于任何基于记忆
memorization-based
的系统中,但是Memboost
具有显著的正向效果,因此我们也就接受了这些潜在的不足。我们目前正在实验替代
Memboost insertion
的方法。Memboost insertion
会减缓开发速度development velocity
,因为有害harm
结果的实验可能不再显示为负向的A/B test
结果。而且新的ranking
方法的试验效果可能被稀释,因为top
结果可能被Memboost insertion
所主导。Memboost insertion
也可以无限期地维持候选items
,即使候选生成器不再生成这批候选items
(这批候选items
由Memboost insertion
产生,并始终在线上生效)。一种常见的替代
memorization
方法是将item id
作为ranking
特征。但是,这需要一个大的模型(模型规模和被记忆的item
数量呈线性关系),因此需要大量的训练数据来学习这些参数。这样的大型模型通常需要分布式训练技术。取而代之的是,Memboost
预先聚合了每个result
的互动统计量engagement statistics
,这使得我们能够在单台机器上训练主力ranking
模型。
11.4 Ranking 的演变
在引入
Ranking
之前,Candidate Generation
和Memboost
已经工作了相当长的一段时间。我们假设下一个最大的潜在提升potential improvement
将来自于我们在系统中添加一个ranking
组件,并应用learning-to-rank
技术。第一个
learning-to-rank
模型大幅度提升了Related Pins
的互动engagement
,使得用户保存save
和点击click
结果提升了30%
以上。在我们的
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 pin
和candidate pin
之间的类目向量category vector
的余弦相似度,或者query image
和candidate image
之间的embedding
距离。
ranking
模型 $ \mathcal F:\mathbb R^{D}\rightarrow \mathbb R $ 输入特征向量并产生最终的ranking score
。这个ranking
模型是从训练数据中学习的,其中训练数据在后文中描述。- 某些特征抽取器直接将原始数据拷贝到特征向量中,例如
我们的第一个
ranking
系统仅使用pin
原始数据。随着我们获得了额外的工程能力来构建必要的基础架构,我们将更多数据(如Memboost
数据和用户数据)引入到ranking
系统。我们还引入了从用户最近活动recent activities
中抽取的个性化特征,如用户最近的search query
。
11.4.1 选择
在构建
ranking
系统时,我们面临三个重大largely
的正交orthogonal
的决策:- 训练数据集收集方法
training data collection method
。 - 学习目标函数
learning objective
。 - 模型类型
model type
。
正交指的是决策之间互不影响。
- 训练数据集收集方法
训练数据集收集:我们探索了训练数据的两个主要数据源:
Memboost scores
作为训练数据。从概念上讲,在没有足够日志数据来进行可靠的Memboost
估计estimate
的情况下,ranker
可以学习预测query-result pair
对的Memboost scores
。即,对于无法从日志数据计算
Memboost scores
的query-result pair
对,可以通过模型来预测。单个
Related Pins session
: 会话session
定义为单个用户以单个query pin
和Related Pins
进行交互的结果。我们可以将这些交互直接作为训练数据的样本。
模型目标函数:在
《Learning to rank for information retrieval》
中,learning-to-rank
方法大致可以分为point-wise
方法、pair-wise
方法、list-wise
方法。这些方法之间的主要区别在于:损失函数是一次考虑一个候选item
、两个候选item
、还是多个候选item
。在我们的工作中,我们探索了
point-wise
方法和pair-wise
方法,如下表所示。模型形式
formulation
:模型的精确precise
形式form
决定了模型来描述特征和score
之间复杂关系的能力。下表比较了我们使用的两种模型类型model types
。
11.4.2 决策演变
下表给出了我们在
Related Pins Ranking
中探索的训练数据、目标函数以及模型的各种组合。第一版
V1
:Memboost
训练数据、相关性pair
标签relevance pair labels
、pair-wise
损失函数、线性RankSVM
模型。在我们的第一版中,我们选择使用
Memboost
数据,因为我们发现Memboost
数据是高质量的信号:它是在很长一段时间内数百万用户行为的聚合。我们为每个
query
显式采样pair
对 $ (r_1,r_n),(r_n,r_{\text{rand}}) $ ,其中:- $ r_1 $ 是针对
query pin
的Memboost scores
最高pin
。 - $ r_n $ 是针对
query pin
的Memboost scores
最低pin
。 - $ r_{\text{rand}} $ 是从
Pinterest
随机采样的一个热门的pin
,用于稳定排名(如论文《Optimizing search engines using clickthrough data》
所示)。
我们认为,由于候选生成器提供了一定程度的相关性
relevance
,因此具有较低Memboost scores
的pin
仍然比随机pin
更相关relevant
。当我们从
Memboost
数据中人工检查pair
对时,我们发现大约70%
的时间可以猜测哪个pin
的Memboost score
更高。这表明训练数据是相当干净clean
的 。相比之下,从每个user session
中采样的pair
对的噪声很大,我们无法确定用户保存了两个pin
中的哪一个。因此,我们可以使用一个小得多的语料库,并且在几分钟之内在单台机器上训练一个模型。
- $ r_1 $ 是针对
第二版
V2
:转向单个individual
的Related Pins sessions
。我们希望使用用户特征和上下文特征,但是使用
Memboost
数据固有地inherently
会排除个性化,因为Memboost
数据是在很多用户上聚合的,从而失去了与单个用户以及session
上下文的关联。此外,我们发现只有热门的内容才具有足够的交互,从而提供可靠的Memboost
数据。这些局限性促使我们转向单个Related Pins sessions
。每个记录
logged
的session
均由query pin
、浏览的用户、最近的动作上下文action context
、result pins
列表a list of result pins
来组成。每个result pin
还具有一个对应的互动标签engagement label
(可以为以下之一:仅仅曝光impression
、特写closeup
、点击click
、长点击long click
、保存save
)。出于训练的目的,我们裁剪记录
logged
的pin
集合,按照rank order
取每个互动的pin
以及紧紧排在它前面的两个前序的pins
。我们假设用户可能看到了紧紧排在互动pin
之间的前序pins
。在
V2
版中,我们继续使用pair-wise
损失,但是pin relevance pairs
由动作的相对顺序来定义:save > long click > click > closeup > impression only
。第三版
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 category
为Art
,那么视觉相似性应该是更强的相关性信号relevance signal
” 。通过自动学习特征交互feature interactions
,我们消除了执行人工特征交叉的需要manual feature crosses
,加快了开发速度。第四版
V4
:转向point-wise
分类损失、二元标签binary label
、逻辑回归GBDT
模型。尽管我们最初选择了
pair-wise learning
,但是我们也已经在point-wise learning
中取得了良好的结果。由于我们在线实验的主要目标指标target metric
是用户保存result pin
的倾向propensity
,因此使用包含closeups
和clicks
的训练样本似乎会适得其反,因为这些动作可能不会影响保存倾向save propensity
。我们发现给样本提供简单的
binary
标签(saved
或者not saved
),并且重新加权reweighting
正样本来对抗类别不平衡,这在增加保存倾向方面被证明是有效的。将来,我们仍然可以使用不同的pair
采样策略来实验pair-wise ranking loss
。
11.4.3 Previous-Model Bias
在我们努力改进
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
分布:由新模型产生(由新模型排序并截断)。为了缓解训练数据中的
previous-model bias
,我们为unbiased data collection
分配了一小部分流量:对于这些请求,我们显示了来自所有候选来源的随机样本,并且没有ranking
而随机排序。这将训练数据和之前的模型隔离开来(如上图(b)
所示)。虽然未排序
unranked
的result
质量较低,但是它们为训练新的ranking model
提供了有价值的数据。为了避免过多降低任何特定用户的体验,每个用户只在一小部分随机query
中获取未排序的pins
。尽管训练数据的数量被限制在总流量的这一小部分,但是最终得到的模型要比用有偏的数据biased data
训练的模型表现得更好。仅用这
1%
的随机流量来训练模型,会不会因为数据量太低而降低模型效果?一种方法是:将这1%
流量的样本加权(比如加权10
倍),然后和剩余99%
流量的样本一起训练。
11.4.4 衡量指标
能够探索这些不同选项的一个重要
step
是能够快速迭代。测试变更效果的金标准gold standard
是在线A/B test
实验,其中我们主要根据save propensity
来评估ranking
。所有的变更都要经过在线实验,但是在线
A/B test
通常需要几天或者几周的时间来收集数据。我们认为,通过离线评估来马上测试变更效果从而近似approximate
不同模型的性能是有帮助的。在这个过程中,我们重复使用了很多训练数据生成器来采样每个Related Pins sessions
(即,生成训练集),但是选择了一个紧跟着训练日期的不同日期范围、以及一个和训练采样策略稍微不同的采样策略(即,生成测试集)。对于每个session
,我们使用被测模型对用户实际看到的pins
(即,label
)进行重新打分rescore
(即,预测),然后评估预测的score
和记录的用户行为之间的一致性。我们已经尝试了多种度量方法,包括
normalized discounted cumulative gain: NDCG
、PR AUC
。为了确定这些离线指标在多大程度上预测了在线
A/B test
影响,我们检查了我们过去几次ranking model
变更的结果。我们检查了通过离线评估预测差异(即新模型和baseline
模型在测试集评估指标上的差异)的方向和大小,并将其与实际实验结果进行比较。我们发现:PR AUC
指标对于A/B test
实验中的closeups
和click-throughs
具有极强的预测性,但是我们很难用离线评估来预测save
行为。目前,我们将离线指标用作健全性检查
sanity check
和潜在影响potential impact
的粗略估计rough estimation
。
11.4.5 Serving 架构
Related Pins
在峰值负载下每秒可以处理数万个query
。为了处理这种规模,我们利用了几个现有的Pinterest
系统。我们的第一版
pin ranking
是在离线的Map-Reduce
作业中预计算pre-computed
的,并由Terrapin
提供服务(这是一个不可变的key-value
的lookup service
)。这需要大量的Map-Reduce
作业来为每个query
和candidate
来join
原始数据、计算特征、并对item
进行打分。由于集群的限制,我们一次只能对几百万个
query
进行rank
,从而覆盖了50%
的用户query
。我们通过一次在不同的segments
上运行reranking
作业并合并结果来scale up
,但是这种方法本质上inherently
无法在合理reasonable
的时间内提供完全覆盖。离线排序也显著降低了开发速度:每个变更模型的实验(特征开发、训练数据变更)都需要离线重新排序
reranking
所有的query
,这是一个耗时的过程。为此,我们转向在线
ranking serving system
。pin
的原始数据存储在叫做RealPin
的分片sharded
的key-value store
中,通过image signature
作为key
。为了执行
ranking
,我们将一个请求request
和计算特征和score
所需的候选pins
列表、其它原始数据组装assemble
在一起:query pin
原始数据(从RealPin
检索到)、离线的用户原始数据(从Terrapin
而来)、最近的用户活动(从一个叫做UserContextService
的service
而来)。RealPin root server
将请求复制到RealPin leaves server
,将合适的候选子集路由到每个leaf server
。leaf server
在本地检索pin
原始数据,并调用我们自定义的特征抽取器custom feature extractor
和scorer
。注意:
leaf server
存储了pin
的原始数据。leaf server
发送top
候选以及相应的score
给root server
,然后由root server
收集并返回全局的top
候选集。
我们选择了这种
serving
架构来提高数据局部性data locality
。基于Hadoop
的系统在每次query
时都需要传输大量的pin
原始数据。我们还看到,由于pin
原始数据的传输,其它的online pin scoring
系统受到网络的限制。通过将计算下推到存储候选pin
原始数据的节点,可以避免大量的数据传输。
11.5 挑战
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 generation
和ranking
之间复杂的相互依赖关系。模型变得和训练数据的特点相协调。例如,变更或引入一个candidate generator
会导致ranker
的恶化,因为训练数据的分布不再和serving
时的ranking
数据的分布相匹配。这是我们在训练数据收集中看到的一个问题。如果引入一个
candidate generator
无法提高性能,那么如何确定这是由于candidate generator
性能较差、还是由于ranker
并没有针对这个candidate generator
的候选上训练过?我们目前的解决方案是:在用新训练的模型运行实验之前,将
candidate generator
得到的候选插入训练集一段时间。这种方案一次改变一个变量:先固定
ranking
模型,仅改变candidate generator
;然后固定candidate generator
,重新训练ranking
模型。这个问题强调了尽可能简化系统的必要性,因为可能的非预期交互
unintended interactions
的数量随着系统组件的数量而迅速增加。
内容激活:有大量的内容没有互动量,但是这些内容可能是潜在相关
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
:对于我们生成的每个相关related
的pin
,我们检查是否存在具有相同图像的本地化替代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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论