博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

FunRec阅读笔记

FunRec传送门

推荐系统概述

  • 这个部分只是简单过了一遍,没细看

经典召回模型

  • 基于协同过滤的召回
    • UserCF和ItemCF都是很直观很暴力的做法,效果肯定比较差
    • Swing跟ItemCF差别不大,可以看成是考虑了共同用户之间相似度的改进
    • Surprise算法介绍得不多,简单略过
    • 矩阵分解(MF):引入隐语义,用梯度下降去学习出用户、商品和隐语义的关系,比较优雅的做法。
  • 基于向量的召回
    • FM:按照这里的说法,FM是前面矩阵分解法的扩展,相当于除了考虑User Embedding和Item Embedding的内积关系外,还加入一些其他特征,去学习它的Embedding,猜测可以是时间、地点之类的,再拿它们两两内积。引入了更多信息肯定能有更强的表示能力,比如大家晚上会倾向于听“网抑云”。姑且这么理解FM模型。
    • item2Vec:基于经典的word2Vec,原理上跟MF很像,感觉差别仅在于使用的数据源是item之间关系,而不是item和user的关系。item之间的关系我理解为用户同时购买的一批商品,或者处在同一个歌单内的歌曲。
    • YoutubeDNN:原理上跟MF的区别只在于改变了User Embedding的获取方式,由原来单独作为可训练参数改为用用户历史观看记录的Item Embedding(中心词)、历史搜索token和其他用户信息组合获得,组合之后还会过几层DNN,再拿去跟Item Embedding(上下文)求softmax或者最近邻。一些工程上的trick比较散,看了也记不太住,回头上手实际项目可以再回来翻一翻。其中负采样优化经常提到,练习的时候可以重点关注。
    • 双塔模型:基本就是上述内容的标准化。
      • 两个塔分别计算User Embedding和Item Embedding,完事计算相似度。优化方向就是有关系的数据相似度高,没关系的相似度低,很简单粗暴的思路。两个塔计算Embedding的网络就有了设计空间,MF就是它的一个特殊情况,即输入只有一个id特征,网络里面只有一个权重矩阵。
      • 由于将User特征和Item特征分到两个塔里面各自计算Embedding,只在最后计算相似度(内积)的时候有交互,所以损失了一些交叉特征的表示能力。但这是召回过程数据量过大而做出的妥协,只有避免两者的交互才能实现提前计算好Item Embedding然后用最近邻搜索来实现加速,后面精排模块应该会改进这一点。(不过暂时还不理解交叉特征为啥那么重要,以及没有资料提到最近邻搜索一般怎么实现,猜测可以用类似k-d树的分层图搜索)
      • 由于用户的Embedding更新比较频繁,如果不想花大成本实时更新模型的话,就可以像Youtube一样把看过的历史item也塞进用户侧特征。感觉这部分Embedding对应前面w2v说的中心词,item塔的Embedding对应上下文,两者可以用一套东西计算,但如果分开应该表示能力会变强吧。
      • 很多文章提到可以用SENet来优化双塔模型,说是可以动态地学习不同特征的权重,我的理解是希望对不同的输入采用不同的权重,比如User Embedding里说用户是个学生,那就提高一下跟学习相关的特征的权重。
      • 归一化和温度系数是个很有趣的数学现象,后续可以多关注一下子。
  • 图召回
    • BGE:依然是基于用户行为序列的方式,只不过加了一个建图的过程,用户操作序列→建图→随机游走生成训练数据,建图过程本质上是一种数据增强(?)
    • GES:跟前面Airbnb文章里提到的Type Embedding是一样的思路,我不学Item Embedding了,只学标签的Embedding,组合起来得到Item Embedding。
    • EGES:比GES多学个权重而已,也就是现在每个标签要学自己的Embedding,每个Item要学自己各个标签的权重。
    • GraphSAGE:(真正利用了图信息的方法)在计算Embedding的网络中加入一层GNN,每个节点的新Embedding由图中各阶邻居的旧Embedding合并得到。给出的采样方式有点复杂,要一次性采样k阶邻居然后一起聚合。给出的四种聚合函数暂时没细看。与一般GCN方法不同的是,GraphSAGE不是学习节点的Embedding表示,而是学聚合函数,这样就对新节点有更强的泛化性。
    • PinSAGE:在GraphSAGE基础上进行改进。
      • 重要性采样:给节点的采样概率加一个权重,这个权重是根据图的情况事先计算出来的,如果图不变它就是静态的。(所以有没有可能整一个可学习的采样权重?但这样好像拿不到梯度)
      • 聚合:每次只聚合一阶邻居,然后多聚合几层(感觉比一次性k阶的要优雅一点)。
      • mini-batch:图很大,没办法全部一起训,所以每次拿一小块子图出来训就行。
      • 其他一些工业上的trick暂时略过。
  • 序列召回
    • MIND:原本将用户的所有历史观看item的Embedding平均一下得到用户历史兴趣,现在觉得可以进一步利用这部分信息,不再平均而是改成聚类(用胶囊网络实现),聚出来N类就当作用户有N个兴趣(兴趣的Embedding就是类内所有item的平均)。跟上下文item计算的时候,每个兴趣都跟item内积一次,用softmax来平均之后计算loss。实际部署的时候事先不知道item embedding,应该是会得到多个用户Embedding,每个都做一次最近邻搜索,将结果合并。
    • SDM:改进点在于区分长短期兴趣和在序列处理中用到了Multi-Head attention。整体上感觉复杂但没什么新意。
  • 树模型召回:
    • TDM:将item的初始embedding聚类建立成树状,在树形结构上重新学习Embedding,得到结果再次聚类,重新学习,以此循环,最终得到树形结构和对应的Embedding,用这个树形结构来加速搜索过程。没有细看。

经典排序模型

  • GBDT+LR:LR是一个最简单的逻辑回归,其局限性在于没有实现特征的交叉。GBDT就是具象化了一个特征交叉的过程,感觉重点应该在于怎么选取交叉的特征(也就是建树的时候选取哪些特征来划节点),毕竟N维的二分类数据交叉后有\(2^N\)维,但很多资料里面并没有提到这一点?
  • 特征交叉
    • FM:在LR基础上,加入所有二阶交叉的特征。完事加一个优化,对于这些特征,我不算具体的\(N^2\)个权重了,我算每个特征的向量,然后用内积来充当这个权重,这样牺牲了表达能力,但是能加速计算,提升泛化能力。
    • PNN:感觉就是FM把特征从一维向量换成矩阵的版本,原来每个特征项是一个标量,现在每个特征项是一个embedding。
    • DCN:它的cross层内积过程就是把特征两两交叉,但是并不保留全部\(n^2\)的数据,而是降维求和剩下n个数据。相当于\(x_0\)的每个元素跟\(x_{l-1}\)整体乘。虽然多加几层之后看起来是高阶特征了,但并没有做过筛选,直觉上不会有什么效果(雾。看了后面xDeepFM好像也是类似的思想,总之感觉是很怪的做法,有机会跑代码看看......
    • W&D这部分模型花式组合很多,有点乱,重点看了DeepFM,模型上就是把一阶、二阶、高阶特征拼起来,很简单,不过还没有细看论文细节。
  • 序列模型
    • DIN:召回里面的双塔模型会把用户兴趣做聚类,而我们现在是排序,就不需要聚类了,直接用候选商品跟历史商品求一个相关性就行了。
    • DIEN:在DIN基础上加上GRU,建模历史行为的序列信息。
    • DISN:
  • 多任务学习
    • ESMM:加把CVR任务拆成CTR和CTCVR相除的结果(当然实际计算并不会去做除法,而是把CVR变成中间变量)。感觉主要作用是增加了可以利用的数据,毕竟Embedding层共享。
    • MMOE:参数共享可能在任务冲突的时候效果不好,于是学多份参数,然后每个任务自己学习各份参数用多大权重,很自然的想法。相当于用一个大模型把所有东西框起来,作用肯定是有,但是感觉没很大意义。
    • PLE:再扩展了一下MMOE,规定某些专家为任务独享,再将这个结构多串几层做成级联的。
posted @ 2022-07-09 14:36  swm_sxt  阅读(224)  评论(0编辑  收藏  举报