陈文石:深度学习在美团点评推荐业务中实战解析

向作者提问
美团技术团队官方账号
查看本场Chat

2018年3月12日,周一晚上8点30分,美团点评算法专家,目前负责点评平台及综合 BG 推荐平台业务的陈文石带来了主题为《深度学习在美团点评推荐业务中实践》的交流。以下是主持人天怡整理的问答实录,记录了作者和读者间问答的精彩时刻。


内容提要:

  • 深度学习网络中,优化器如何选择?
  • Embeding 主要用了哪些方法,以及有用到 graph enbedding 吗?
  • RNN 在召回策略中是如何使用的?
  • Deep 层和 wide 层特征辨别规则是什么?
  • Pull 和 Push 对应的真实场景是什么?
  • 在样本稀少的时候,怎么处理样本不平衡的问题?
  • 如何选择 DSSM 目标函数?

问:深度学习网络中,优化器如何选择?

答:优化器在实验初期大部分情况下使用adam adadelta、rmsprop等自适应梯度优化器,初始学习率可以设置较大的值,速度比 sgd 快了数倍。到了实验后期可以选择 sgd+momentum,学习率手动衰减,衰减时机可以是验证集准确率不再上升时或者固定学习 n 个 epoch 之后,这种方法经常能获得比 adam 更好的效果。

对 RNN 来说,如果 RNN 要处理的序列比较长,或者 RNN 层数比较多,那么步长一般小一些比较好,否则有可能出现结果不收敛,或者 Nan 等问题。具体关于优化器的各种优缺点,可以参考美团点评技术博客上的文章《深度学习在美团点评推荐平台排序中的运用》。


问:Embeding 主要用了哪些方法,以及有用到 graph enbedding 吗?

答: Embedding 的训练用到了两类方法:端到端的和非端到端的。端到端的方法是将 embedding 层作为神经网络的一部分,在进行 bp 更新每一层参数的时候同时更新 embedding,可参考 tensorflow 中的 tf.nn.embedding_lookup 方法;非端到端的方法有 doc2vec、item2vec、word2vec 等,另外 lda 可以给出每一篇文章下主题的分布向量,也可以看作是学习出了文章的 embedding。目前线上使用的 embedding 主要是用端到端的方法训练出来的。

使用 embedding 的方式主要是直接与其他特征 concat 成向量,然后作为后续网络的输入。Graph embedding 暂时还没有使用。


问:RNN 在召回策略中是如何使用的?

答:线下训练的时候,首先输入层对用户访问序列中的 item 进行 one-hot 编码,在输入层之上通过 embedding 层压缩成稠密连续值,在 embedding 层之上我们搭建了若干个 RNN 层,最后是增加若干全连接层到输出层。输出层的 loss 目前采用的是交叉熵。线上预测的时候,将用户历史点击的文章 ID 按照时间排序形成序列,这个序列作为 RNN 模型的输入,输出是用户可能点击的文章的分数,排序后取得分最高的 TOP N 个结果作为召回结果。


问:Deep 层和 wide 层特征辨别规则是什么?

答: Wide 层在处理高纬离散特征(category 特征、命中召回策略特征、经离散化的连续特征等)上有优势,deep 层在处理连续特征上有优势,比如销量,质量分,好评数等。

Wide 与 deep 层的特征,与 LR 模型与 DNN 模型的特征适用场景基本类似,Wide 和 deep 正是用了这两个模型的优点才更强大。


问:Pull 和 Push 对应的真实场景是什么?

答:不同业务场景,适用的架构不一样。Pull 和 push 的本质是解决推荐系统中的性能问题,举两种 push 和 pull 结合的例子。

  1. 基于社交关系的 UGC 推荐。UGC 推荐时我们会将用户关注的人发表的优质 UGC 放到候选集合中,这种场景下最自然的是通过 pull 的方式,但是点评社交网络中一些用户的关注人数达到了几十甚至几百的规模,实时拉取每一个好友的发布列表,并进行合并,会对系统的性能和稳定性带来较大的影响。如果我们采取 push 的方式,用户每发表一篇 UGC,就把该 UGC 放到他的关注者的候选队列中,在推荐时,我们只用拉取一次就可以获得对应的 UGC 候选结合。纯 push 模式虽然加速了 UGC 推荐候选集合的获取速度,但是会对存储空间带来比较大的挑战,尤其是点评一些明星用户的关注者人数达到了几万甚至几十万的规模。因此我们采取 push 和 pull 相结合的方式,如果关注该用户的人数超过了一定的限制采用 pull 的模式,否则采用 push 的模式,在响应时间和存储空间上有比较好的权衡。

  2. 近实时计算。获取推荐候选集合时我们采用了多策略相结合的模式,其中某些策略的计算复杂度较高,例如基于 RNN 和基于 DeepCF 的召回策略。如果这些多策略的结果都是实时计算,就会导致推荐服务的请求响应超时, 因此我们会将这些耗时的召回策略的结果事先计算好,然后 push 到用户的推荐列表中,当用户发出请求时,直接推荐给用户。

  3. Pull的场景。用户的 LBS 请求,就是实时从索引中检索的,因为 Location 的经纬度太多了,很难直接预先存储,直接检索来效率更高。

所以 Pull 和 Push 适用于不同的场景,是对服务性能和存储的一个调节。


问:在样本稀少的时候,怎么处理样本不平衡的问题?

答:这个问题比较经典,也在面试中经常遇到,尤其在金融领域,基本解决的思路如下。

  1. 过采样或者欠采样。抽样处理不平衡数据的最常用方法、基本思想就是通过改变训练数据的分布来消除或减小数据的不平衡。过抽样方法通过增加少数类样本来提高少数类的分类性能,最简单的办法是简单复制少数类样本;欠抽样方法通过减少多数类样本来提高少数类的分类性能,最简单的方法是通过随机去掉一些多数类样本来减小多数类的规模。

  2. 特征筛选。样本数量分布很不平衡时,特征的分布同样会不平衡,需要根据特征特点,选择有分别能力的特征。

  3. 算法层面,改变目标损失函数,不同 label,代价不同。


问:如何选择 DSSM 目标函数?

答:首先说下目标函数是用来衡量模型效果和可用性的,通常分为经验风险(平均损失)和结构风险(模型复杂度)。对于 DSSM 模型而言,我们更关注损失函数,它是经验风险函数的核心部分,也是结构风险函数重要组成部分。

DSSM 模型的目的是将不同结构的匹配对压缩到同一个低维的语义空间中,并且最大限度的保证匹配对的相关性。

为了达到这样的目标,首先需要衡量语义空间中不同向量的相关度。通常可以使用欧氏距离或者余弦相似度来计算,但具体到文本向量,由于是稀疏的,一般使用 cosine 较好,修正了可能存在的度量标准不统一的问题。

在衡量相关性之后,对于一个待匹配的向量,我们将相关性带入 softmax 函数来表示它和其他向量之间存在匹配关系的概率。为了最大化正样本匹配成功的概率,我们选择了对数似然损失函数,通过最小化该损失函数,来估计模型参数,减小预测值与真实值 Y 的不一致程度,增强模型的鲁棒性。


本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。


在此感谢异步社区为本次活动提供的赠书《深度学习》。异步社区是人民邮电出版社旗下 IT 专业图书旗舰社区,也是国内领先的 IT 专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架。

微信扫描登录