机器学习(ML)(十四) — 推荐系统探析
排序 - 多目标模型
我们先回顾一下推荐系统的链路,分为召回,粗排、精排、重排。有很多条召回通道,从几亿个物品选出几千个物品,做完召回之后,要从中选出用户最感兴趣的物品,这就要用到粗排和精排,粗排会给召回的物品逐一打分,保留分数最高的几百个物品,然后使用精排模型给粗排选中的几百个物品打分但不做截断,让几百个物品全都带着精排分数进入重排,最后一步是重排,做多样性抽样,并且把相似内容打散,最终由几十个物品被选中展示给用户。
排序的主要依据是用户对物品的兴趣,兴趣可以反映在用户与物品的交互上,对于每个物品,系统会记录下面几个统计量:曝光次数(number of impressions
),就是一个物品被展示给多少用户,展示之后,才会有点击等行为;点击次数(number of clicks
),就是一个物品被多少用户点开;点赞次数(number of likes
)、收藏次数(number of collects
)、转发次数(number of shares
)。点击率 = 点击次数 / 曝光次数、点赞率 = 点赞次数 / 点击次数、收藏率 = 收藏次数 / 点击次数、转发率 = 转发次数 / 点击次数。排序的依据:排序模型通过机器学习预估点击率、点赞量、收藏率、转发率等,做完预估之后,要对这些预估分数做融合(比如加权和),最后按照融合的分数对物品做排序、截断,保留分数最高的物品。
多目标模型:排序模型的输入是各种各样的特征,用户特征主要是用户ID
和用户画像;物品特征主要是物品ID
、物品画像和作者信息;统计特征:包括用户统计特征和物品统计特征,比如用户在过去30
天曝光了多少物品,点击了多少物品,点赞了多少物品,比如物品在过去获得了多少次曝光、点击、点赞等等;场景特征:是随着用户请求传过来的,不如按当前的时间和用户所在的地点。这些信息对推荐很有用,把这些特征做融合(concatenation
),输入神经网咯,神经网络可以是简单的全连接网络,也可以是更复杂的结构,神经网络会输出一个向量,这个向量在输入4
个神经网络,每个神经网络有2-3
个全连接层和输出层的激活函数是Sigmoid
,4
个神经网络分别输出点击率、点赞率、收藏率和转发率的预估值。4
个预估值都是实数,介于0~1
之间,推荐系统排序就主要靠这4个预估值,它们反映出用户对物品的兴趣。如下图所示:
把模型输出的点击率、点赞率、收藏率和转发率,分别记作
实际的训练中会有很多困难:做训练的时候存在类别不平衡的问题,正样本少,负样本多。比如说每100
次曝光,约有10
次点击,90
次无点击。点击的是正样本,没有点击的负样本。要太多的负样本用途不大,白白浪费计算资源。解决方案就是负样本的降采样(down-sampling
),只保留其中一小部分负样本,让正负样本数量保持平衡,降低训练的计算代价。给定用户特征、物品特征,用神经网络预估出点击率、点赞率等之后,就要对这些预估分数做校准,做完校准之后才能把这些预估值做排序。为什么要做校准?首先设正样本、负样本的数量为
排序 - MMoE
MMoE
(Multi-gate Mixture-of-Exports
):模型的输入是一个向量,包含用户特征、物品特征、统计特征、场景特征。把向量输入3
个神经网络,每个神经网络结构都相同,都是由很多全连接层组成,但是这3
个神经网络不共享参数,这3
个神经网络各输出一个向量,这3
个向量记作3
个神经网络代表3
个”专家“。把下面的特征向量输入到另一个神经网络,这个神经网络也有多个全连层,神经网络的最后加入一个softmax
激活函数,输出一个3
维的向量。由于是softmax
输出,向量的3
个元素都大于0
,而且相加等于1
,向量的3
个元素记作3
个专家神经网络,之后用这3
个元素做权重,对向量softmax
激活函数,输出一个3
个向量,分别记作
如下图所示,0~1
之间的实数,把右边的一个向量输入另一个神经网络,这个神经网络会输出另一个指标的预估,比如对点赞率的预估,也是介于0~1
之间的实数。这里假设多目标模型只有点击率、点赞率这两个目标,所以用了10
个目标,就要用10
种权重。
在实践中MMoE
模型有一个问题:softmax
会发生极化现象(polarization
)。上个例子中有2
个softmax
函数,各自输出一个3维向量,每个向量都是概率分布,元素大于0
,相加等于1
。极化现象(polarization
)是softmax
输出值1
个接近1
,其余接近0
。举例左边的softmax
输出值为3
号专家网络,而没有使用其它的专家网络,这也就是没有使用MMoE
,没有让3
个专家网络输出融合,而是简单使用了一个专家;右边的softmax
输出值为2
号专家网络,也没有对3
个专家做融合,而第1号专家网络没有被使用。那么MMoE
就是一个简单的模型,不会对专家做融合,则失去了MMoE
的优势。解决极化现象的方案:如果有softmax
的输出都是1
,其余的接近0
,在训练的过程中,对softmax
输出使用dropout
。softmax
输出的mask
的概率都是10%
,也就是说每个专家被丢弃的概率都是10%
,这会强迫每个任务根据部分专家做预测,如果用dropout
,则不太可能发生极化。MMoE
模型请参考论文:Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts
,极化现象的解决方案请参考:Recommending What Video to Watch Next: A Multitask Ranking System
。
排序 - 排序模型的结构
融合预估分数:最简单的分数融合方法就是预估值的加权和,记作1
;10
秒,
视频播放建模:视频排序的依据还有播放时长和完播。直接使用回归拟合播放时长效果不好,建议使用YouTube
的时长建模(论文请参考:Deep Neural Networks for YouTube Recommendations
)。
- 对播放时长的预估:这是排序模型使用的特征:用户特征、物品特征、统计特征、场景特征。把它输入多层神经网络,这个神经网络被所有任务共享,在这个神经网络之上有多个全连接层,一个全连接层对应
1
个目标,比如点击、点赞、收藏、播放时长等,这里只关注播放时长的预估,全连接层输出的实数,记作,对 做 sigmoid
变换得到,记作 ,然后让 拟合 ( 是自己定义的,记作 ,其中 是实际观看时长, 越大,则 也越大),为了让 拟合 ,我们使用 与 的交叉熵作为损失函数,记作 。最小化交叉熵损失,记作 ,会让 接近于 ,如果 ,那么 ,也就是说,可以用 作为播放时长的预估,对 做指数变换,输出的 就是对播放时长的预估。 - 对完播的预估:一种方法是回归,例如视频长度为
10
分钟,实际播放是4
分钟,则实际播放率是。做训练的时候,让预估播放率 去拟合 ,记作 ,其中 的大小介于0~1之间,用 和 的交叉熵作为损失函数,在线上用 作为完播率的预估,比如说模型输出 ,意思是预计播放73%。视频的完播率会作为融分公式的一项,影响视频的排序。另一种视频完播的建模方法是二元分类,需要自己定义完播指标,比如完播 80%
,例如视频的长度是10
分钟,那么播放超过8分钟就是正样本,否则作为负样本。训练要做二元分类,播放>=
80%
属于正样本、播放<
80%
属于负样本。做完训练之后,可以在线上预估完播率,例如模型输出,意思是 ,预估的播放率会跟点击率一起作为排序的依据。
不能直接把预估的完播率用到融分公式中,视频越长,完播率越低。使用预估的完播率适用于短视频,而不适用于长视频。线上预估完播率之后,然后对其做调整,记作
排序 - 排序模型的特征
召回和排序的模型中都有用户属性,用户属性都记录在用户画像中,用户ID
是排序中最重要的特征之一,用户ID
本身不携带任何有用的信息,但是模型学习到的Embedding
向量对召回、排序模型有很重要的影响。召回和排序都会对用户做Embedding
,通常用32
为或64
位向量。人口统计学属性包括性别、年龄等,不同年龄、不同性别年龄段的用户兴趣差别很大。用户的账号信息:包括注册时间、活跃度。新用户和老用户、高活和低活用户区别很大。模型需要专门针对新用户、低活用户做优化。再就是用户感兴趣的类目、关键词、品牌。这些信息可以是用户填写的,也可以是算法提取的。这些用户兴趣的信息对排序也是很有用的。与用户画像相对应的是物品画像,物品ID Embedding
在召回、排序中的重要性非常的高,物品的发布时间和物品的年龄也是很重要的特征,GeoHash
(经纬度编码)、所在城市对召回、排序都很有用。物品的内容:包括类目、标题、关键词、品牌等信息。通常对离散的内容做embedding
变成向量。字数、图片数、视频清晰度、标签数这些都是物品自带的属性,反映出物品的质量,物品的点击和交互指标跟这些相关。内容信息量、图片美学是算法打的分数。事先使用人工标注的数据训练CV
和NLP
模型,当物品要发布的时候让模型给物品打分,将内容信息量和图片美学写入物品画像中。这些分数可以作为排序模型的特征,除了用户画像和物品画像,还有用户统计特征,比如会统计用户最近30
天(7
天、1
天、1
小时)的点击率、点赞率、收藏率等等。用各种时间粒度可以反映出用户的实时兴趣、短期兴趣、长期兴趣,除此之外还有分桶统计各种指标,比如图文的点击率和视频的点击率,可以反映出用户对两类的偏好,按照类目分桶;还要物品的统计特征,比如会统计物品最近30
天(7
天、1
天、1
小时)的点击数、点赞数、收藏数等等。这些统计量反映出物品的受欢迎程度。可按照物品的受众做分桶,按照用户性别分桶、按照用户年龄分桶等。最后一类特征是场景特征,它们随着推荐请求传来的,不用从用户画像、物品画像数据库中取得,当前用户定位的GeoHash
、定位的城市属于场景特征,当前的时刻对推荐很有用,一个人在同一天不同时刻的兴趣也不相同,比如是否是周末、是否是节假日,再就是设备信息:包括手机品牌、手机型号、操作系统等,设备信息也是有用的特征。
特征处理:
- 离散特征:离散特征处理很简单,做
Embedding
。离散特征包括:用户ID
、笔记ID
、作者ID
、类目、关键词、城市、手机品牌等。 - 连续特征:连续特征的第一种处理方式是做分桶转变成离散特征。连续特征包括:年龄、文本字数、视频长度等。连续特征的第二种处理方式是做
变换,还可以把点击数、点赞数、收藏数转化为点击率、点赞率、收藏率,并做平滑处理。
两种变换的特征都作为模型的输入,比如3
个数据源,包括用户画像、物品画像、统计数据,3
个数据源都存储在内存数据库之中,在线上服务的时候,排序服务器会从3
个数据源取回所需的数据,然后把读取的数据做处理,作为特征喂给模型,模型就能预估出点击率、点赞率等指标。系统架构是:用户发起请求到主服务器上,主服务器会把请求发到召回服务器上,做完召回之后,召回服务器会把几十路召回的结果做归并,几千个物品ID
返回给主服务器,主服务器会把用户ID
、物品ID
、场景特征发送到排序服务器上,这里有一个用户ID
和几千个物品ID
,物品ID
是召回的结果,用户ID
和场景特征都是从请求中获取的,场景特征包括:时刻、所在的位置、手机的型号和操作系统。接下来,排序服务器会从3
个数据源中取回排序所需的特征,主要是这3
个数据源:用户画像、物品画像、统计数据。取回的特征分别是用户特征、物品特征、统计特征。用户画像数据库压力比较小(每次只读取1
个用户的特征),而物品画像数据库压力特别巨大,粗排要给几千个物品做排序,读取几千个物品的特征,同样的道理,存用户统计数据的数据库压力比较小,存物品统计数据的数据库压力比较大。工程实现的时候,用户画像里面存什么都可以,特征可以很多、很大,尽量不要在物品画像中放很大的向量,否则物品画像会承受很大的压力,用户画像较为静态,物品画像可以说是完全静态的,对于用户画像、物品画像主要考虑读取速度,而不用考虑其时效性。统计数据不能在本地缓存,统计数据是动态变化的,时效性很强。在收集到所需的特征之后,排序服务器对特征打包,传递给TF Serving
,TF
会给物品打分,并把分数返回给排序服务器,排序服务器会用融合的分数、多样性分数和业务规则对物品做排序,把排名最高的几十个物品返回给主服务器,这些就是最终给用户曝光的物品。如下图所示:
排序 - 粗排模型
粗排与精排对比:粗排给几千个物品打分单次推理的代价必须很小,预估的准确性不高;而精排只给几百个物品打分,单次推理的代价很大,预估的准确性更高。精排模型属于前期融合,前期融合的意思是先对所有特征做concatenation
,在输入神经网络,这样的模型线上推理代价大,如果有COLD: Towards the Next Generation of Pre-Ranking System
,
三塔模型顾名思义,就是有3
个塔:用户塔、物品塔、交叉塔。用户塔的输入是用户特征和场景特征;物品塔的输入只有物品特征;交叉塔的输入包括包括统计特征和交叉特征。交叉特征是指将用户特征与物品特征做交叉。三个塔分别输出3
个向量,对3
个向量做concatenation & Cross
得到一个向量,把这个向量分别输入到多个神经网络(全连接层 + sigmoid
),这些神经网络分别输出点击率、点赞率、收藏率、转发率的预估。训练粗排模型的方法就是正常的端到端训练,跟精排完全一样,这个模型看起来与精排模型不大,最主要的区别就是下面的3
个塔,这个模型介于前期融合与后期融合之间,前期融合就是把这些底层的特征做concatenation
,而三塔模型则是把三塔输出的向量做concatenation
。三塔模型结构如下图所示:
- 用户塔:只有一个用户,用户塔只做一次推理,即使用户塔很大,总计算量也不大。
- 物品塔:有
个物品,理论上物品塔需要做 次推理,给所有 个候选物品打分,好在物品的属性相对稳定,短期之内不会发生变化。可以把物品塔输出向量缓存在 Parameter Server
,隔一段时间刷新一次,由于做了缓存,物品塔在线上不用做推理。只有遇到新物品的时候,物品塔才要做推理。粗排给几千个物品打分,物品塔实际上只要做几十次推理,所以物品塔的规模可以比较大。 - 交叉塔:它的输入,使用户、物品的统计特征,还有用户和物品的交叉,每当一个用户发生一个点击行为,他的统计特征就会发生变化,每当一个物品获得曝光和交互,它的点击次数、点击率就会发生变化。由于交叉塔的输入会实时发生变化,不应该缓存交叉塔的输出的向量,有
个物品,交叉塔必须做 次推理。所以交叉塔必须足够小,计算够快,通常来说交叉塔只有一层,宽度也比较小。
3
个塔各输出一个向量,3
个向量融合起来做为上层多个头(Head
)的输入。粗排给
给一个用户做推荐,需要他的用户画像和统计特征,每次有Parameter Server
上,只有物品塔的缓存没有命中时,物品塔才要做推理。最坏的情况下,物品塔需要做99%
的物品都能命中缓存,给几千个物品做粗排,物品塔只需要做几十次推理。交叉塔的输入都是动态特征,不能做缓存,必须做3
个塔各输出一个向量,3
个向量做融合,作为上层网络的输入。上层网络必须做