终其一生,我们只不过在寻找自己

0%

【分享整理】美图个性化push的探索之路

这篇文章是帮DataFunTalk社区整理的讲稿,也就是把展示的内容写成文字,挺费时间的,还好是比较感兴趣的话题。最后也学到了一些模型迭代的思路。
这个分享对我启发最大的是召回源完全可以当做特征加到排序里啊!!!我之前实习的时候,只想的是通过模型改变召回源的数量,从而控制下发的比例,真的太傻了5555


导读: Push 作为一种有效的拉起 DAU 和召回用户的策略,近几年来被各类社交 App 广泛应用,随着深度神经网络在语音和图像识别上取得的巨大成功,AlphaGo 战胜人类围棋顶尖高手,以深度网络为基础的人工智能迎来第三次高潮。如何将深度模型应用于个性化 push 场景,从而减少无效 push 对用户的骚扰,是近年来一个关注的热点。本次分享讲从 Embedding,召回,排序,文案,内容池等多个方面介绍如何打造一个良好的 push 场景。



本次分享主要介绍个性化push算法,包括业务背景,embedding召回和排序,不涉及系统架构。

1. 业务背景


Push也就是推送通知,可以通过系统界面直接触达用户,当用户点击就会唤醒APP,是提高APP的日活,留存等指指标重要的环节之一。

2.Embedding 演进

本次从三个算法层面介绍embedding:Word2Vec,Listing Embedding(参考Airbnb)在个性化push的应用,以及近两年流行的图相关的算法GCNs。

2.1Word2Vec

  • Feed也就是展示页的一个item,对于美图秀秀来说就是用户发的一张图,对于电商来说就是一个商品,本文统一称为feed。
  • Embedding就是把任何一个Feed转化为一个向量,服务于后面的召回和排序。Embedding是比较基础的过程,在最开始阶段,我们尝试了最基础的Work2Vec中的Skip-Gram的模型,通过对于用户的点击序列模仿Work2Vec中的一个句子。如图,我们有序列之后,定义窗口大小,通过中心词,就会得到Train Sample。如图:定义单侧窗口大小为2,就可以得到样本对,把样本对输入模型,就可以返回向量。在实验中,我们采用了60天的点击序列,输出向量设置为100维。

2.2Airbnb Listing Embedding


Airbnb listing Embedding 是2018年KDD的最佳论文,这里和Word2Vec主要的区别在于损失函数,模型本身和Word2Vec是保持一致的,所以我们先看Word2Vec的损失函数。

损失函数由正负样本两部分组成,正样本对$D_p$来源于用户点击流生成的item pair,负样本对$D_m$通过当前的item+随机采样空间的其他item(这里假设随机采样的样本不是当前item的邻居),Ctx表示上下文。这里需要注意的是在log里,正样本前面有负号,负样本没有负号。


但是,之前的构造只用了用户的点击数据,实际上用户还有点赞、分享等行为数据可以利用。所以,在Airbnb listing Embedding中,加入了Global Context这样一个概念:通过用户历史的点赞、分享对应的feed,与当前的feed构造出全局正样本对,加入到损失函数中。(如公式中的紫色部分)


同理,我们可以通过用户的点击“不喜欢”的行为来构造负样本(如公式中的红色部分)。除此之外,用户的浏览过但是没有点击的feed也可以随机采样之后当做负样本,加入到损失函数中(如公式中的蓝色部分)。

这样,就把Airbnb listing Embedding的策略引入到了美图秀秀的场景里。

2.3Graph Embedding


Graph Embedding是近几年比较流行的Embedding方法,主要策略可以分为三类:Shallow Embedding, Neighborhood autoencoder methods和GCN的方法。但是前两种方法涉及到不可拓展和直推式的缺陷,GCN可以避免以上的缺陷。


前面两种Embedding只用了用户的行为特征,但是没有考虑item的本身特征;另外,在之后的排序模型中,排序模型使用了item的自身属性进行排序。GCN就是把用户行为和item本身的特征联合起来,既能用上图的拓扑结构,又可以把握属性特征,把信息融合起来做Embedding。
在上图中,假设我们要计算A的Embedding,可以通过计算A的一阶近邻BC的信息聚合得到(Aggregate),而BC的信息可以由二阶近邻DEC,EBFG的信息计算卷积(Convolution)计算得到。


具体来说,延展的过程中,主要包括对于高阶信息的汇总Aggregate,以及当前阶和邻阶节点上一阶的卷积之间信息的结合Combine。其中,Combine可以由很多操作,比如拼接,求和等。Aggregate的过程中,需要注意的一点是采用了Importance pooling,这里并不会对每个邻居节点都汇总,而是先计算一个Importance Factor(影响力因子),影响力因子小于阈值的不参与加权,最后根据权重去加权求和。


构件图的不同形态:

  • 二分图形态:两种类型(Feeds,User)内部之间没有边,不同类型之间才有边;
  • 单体图形态:根据用户同一时间段的行为,将Feeds之间关联起来。

到此为止,我们介绍了Embedding所尝试的方法。

3召回模型


召回主要采用了四个方面,全局召回(热榜,热搜,热词),个性化召回(根据用户的行为,兴趣进行召回),属性召回(也就是画像召回,通过机型,性别,年龄等),最后是相关召回(包括相似,关键词召回等)。

3.1个性化召回之YoutubeNet


YoutubeNet是近两年比较流行的算法,他既可以做召回,也可以做排序。通过输入用户的行为序列得到用户和item的向量,然后就可以通过向量相似程度,对每个user相似的topN个item进行个性化召回,实验中相似率提升达到了1.661%。

3.2个性化召回之聚类召回


业务上,push也包含一个任务是实现将“工具类用户”转化成“社交类用户”,从而提高长期的DAU。在聚类召回阶段,可以通过对于用户的工具偏好特征去构建multi-hot的向量,然后进行用户群聚类,对于每个特定的用户群召回对应的榜单。

3.3相关召回之相似召回(主要)


相关召回在美图秀秀中是输出用户近期的item点击流,获取了对应的Embedding之后,可以通过计算Embedding的均值然后找余弦距离最小的候选项;或者直接将每个候选项去找余弦距离最小的候选项,最后进行汇总。
这里值得思考的一个问题是,何时利用好工具行为的特征,是在排序阶段,召回阶段,还是生成Embedding的阶段?经过实验,得到在Embedding阶段使用工具行为特征效果最好。

3.4相关召回之聚类召回


聚类召回主要是为了实现多样性,避免同质化的内容。
通过对item的Embedding进行聚类,相当于每个item多了一个分类标签。通过统计用户对于每个类别的行为记录次数,按照倒叙进行排列。在召回阶段,按照排列好的顺序依次从每一个类别中抽取一个item,如果所有类别都抽了一遍,召回的数量仍然不够多,可以继续再抽一轮,直到候选数目足够。这样就实现了召回源的多样性。

3.5相关召回之文案相关召回


当选取了候选个item之后,发送push仍需要一条文字信息触达用户,这里简称文案。文案一般由编辑生成,会有很多候选项,所以也需要对于文案进行建模召回。主要有一下三个方案:

  • 关键词召回:通过对于历史的文案进行分词,得到每条文案的关键词,然后把用户对于文案的点击映射到对于关键词的点击,这样就能得到用户对于不同关键词的偏好。当我们新需要发送一条文案的时候,可以得到用户对于每条候选文案偏好度,召回偏好大的文案。
  • 热词召回:通过计算全局哪些关键词最受欢迎,召回的过程中直接召回带有热门关键词的文案。
  • 文案相似度召回:通过NLP的模型,比如BERT,生成每一条对应的Embedding,然后召回与用户点击过的文案余弦距离最小的文案。

以上,就是所有的召回部分。

4排序模型

4.1LR 逻辑回归模型


在排序模型的初始迭代阶段,使用了最简单的LR模型,LR的模型优点是模型浅,计算简单,解释性强,易于使用。但是缺点也显而易见,LR对于非线性特征拟合程度差;除此之外,交叉特征的生成依赖于大量尝试以及人工经验,所以尝试成本很高。

4.2 xNFM模型


通过对于LR,Wide&Deep,deepFM,NFM,DCN,xNFM,xDeepFM模型的尝试与对比,最后选择的xNFM的模型。xNFM优点是组合了一阶和二阶的特征的优点,性能上也可以达到工业落地的需求。


xNFM不是业界主流的模型,而是在落地中对于NFM的变种。主要区别在于:

  • 模型的输入端为了降低模型参数规模,把id类特征和非id类特征分别进行Embedding,可以大大减少参数规模。
  • 在上层网络,主要区别在于右侧。传统的NFM的弊端是只考虑了一个显性的二阶信息,而忽略了一阶信息(单特征),所有增加了右边的网络用来捕捉单特征的信息。相比于LR,提升效果明显,点击流增加13.89%。

4.3 双塔模型


随着用户量的增加,计算量飙升,笛卡尔积之后会有千亿级别的计算量,使得模型更新周期变长,时效性降低。为了解决这个问题,我们提出了双塔的结构。
双塔的结构特别在,当user和item分别构建一个DNN的全连接的网络。这样设计优化主要体现在工程性能方面,存储量大大降低,预测阶段耗时也降低,从而实现了支持亿级别的用户高效计算。
从最初的双塔之后接入到内积,再到上图的双塔接入NFM,到最后再加入点击序列的信息,三个版本的迭代最终点击率累计提升23.9%。

4.4 三塔模型


在之前也提到,我们有很多召回策略,但是召回源质量参差不齐,所以就需要解决对于召回源的选取。

  • 最初的想法是根据每个召回源的转化对排序结果进行socre reweight,但是弊端也很明显,因为召回源直接并不互斥,同个item会被多个召回源命中,所以reweight的规则也难以定义。
  • 之后,为了个性化,直接把召回源信息加入到模型中。这里为什么不把召回源直接加入到item的特征中,而是单独的构造了一个塔呢?主要工程上的考虑,如果把召回源的信息加到item塔中,必须等item塔计算完成之后才能进行生产预测,会造成串行化,增加了延时。

增加了召回源信息之后,点击率提高了3.06%。

4.5 Field_wise 三塔模型

最后一版就是对于NFM模型的改进,在NFM左边的Bi-Interaction Layer中,Bi是Bi-linear的缩写,这一层其实是一个pooling层操作,它把很多个向量转换成一个向量,形式化如下:

$f_{bi}$的输入是整个的嵌入向量,xi ,xj是特征取值,vi, vj是特征对应的嵌入向量。中间的操作表示对应位置相乘。所以原始的嵌入向量任意两个都进行组合,对应位置相乘结果得到一个新向量;然后把这些新向量相加,就得到了Bi-Interaction的输出。这个输出只有一个向量。

这里参考FM到FFM的改进过程,引入Field的概念。由于BI层不同的类别特征所表达是权重不相同,而BI层捕捉不到这个信息,所以可以对于每个向量相乘前可以加上权重。但是,这样会导致参数过多,而同属于一个field的变量权重应该相近,所以对于BI层进行同类别的权重$w_{i,j}$共享而会使用相同参数的点积来计算:

从而得到了Field_wise 三塔模型。模型上线后最终得到了点击率5.68%的提升。

到此为止,我们分别介绍了Embedding,召回,排序三部分。Embedding作为底层的服务辅助召回和排序;在召回部分,主要介绍召回的各个策略;排序部分主要是模型由LR到Field_wise 三塔模型的迭代过程。
美图个性化 push AI 探索之路的介绍到此结束。

这个分享对我启发最大的是召回源完全可以当做特征加到排序里啊!!!我之前实习的时候,只想的是通过模型改变召回源的数量,从而控制下发的比例,真的太傻了5555

-------------    你的留言  是我更新的动力😊    -------------