乐趣区

关于人工智能:腾讯万字长文推荐系统-embedding-技术实践总结

起源:https://zhuanlan.zhihu.com/p/…

以后支流的举荐零碎中,embedding 无处不在,从肯定意义上能够说,把 embedding 做好了,整个举荐零碎的一个要害难题就攻克了。因而,本文总结了挪动腾讯网举荐零碎中的 embedding 技术实际,力求达到娱人娱己的目标。

什么是 embedding

embedding 其实就是一种浓密向量的示意模式。在 embedding 大行其道之前 onehot 才是最靓的仔。如果和咱们比拟相熟的 oneHot 比照起来了解,登时会发现 embedding 这个玄里玄乎的概念,实际上 so easy。

直观上看 embedding 相当于是对 oneHot 做了平滑,而 oneHot 相当于是对 embedding 做了 max pooling

比方 RGB(三原色,red,green,blue)任何色彩都能够用一个 RGB 向量来示意,其每一维度都有明确的物理含意(和一个具体的物理量绝对应)。当然 RGB 这个例子比拟非凡,和咱们个别意义的 embedding,还不一样,因为 RGB 的特殊性就在,他的每一维度都是当时规定好的,所以解释性很强。而个别意义的 embedding 则是神经网络倒数第二层的参数权重,只具备整体意义和绝对意义,不具备部分意义和相对含意,这与 embedding 的产生过程无关,任何 embedding 一开始都是一个随机数,而后随着优化算法,一直迭代更新,最初网络收敛进行迭代的时候,网络各个层的参数就绝对固化,失去隐层权重表(此时就相当于失去了咱们想要的 embedding),而后在通过查表能够独自查看每个元素的 embedding。

embedding 倒退大事记

从 1986 年 Hinton,提出 embedding 的概念。到呈现第一个在工业上获得不错后果的模型 —word2vec, 先驱们经验了怯懦的尝试,摸索,在此向大神致敬。

MF 矩阵合成,曾经隐约看到了 embedding 的影子,此时 embedding 还是一种教训感觉的含糊存在,没有人旗帜鲜明的提出这个概念,属于是 embedding 诞生的前夜。

毫不夸大的说 word2vec 是 embedding 界开天辟地的大事件,从这之后所有事物都可 embedding 了,在这之后的任何 embedding 都能看到 word2vec 的影子。随着 item2vec,wide and weep 和 youtube 等各种算法的提出,embedding 也迅速的用到了特色工程,画像构建召回排序等方面。而 faiss 作为业余的向量近邻检索工具则解决了向量召回在工程上的最初一公里的问题。

embedding 作为一种新思维,他的意义蕴含以下几个方面:

  • embedding 示意,把自然语言转化为一串数字,从此自然语言能够计算;
  • embedding 代替 oneHot 极大的升高了特色的维度(天下人苦 oneHot 久矣);
  • embedding 代替协同矩阵,极大地升高了计算复杂度。

item embedding

在挪动腾讯网的举荐零碎中,因为咱们的 item 次要是图文,所以 item 的向量化,理论就是一个文本和图片向量化的过程。文本 embedding 的外围实践还是 word2vec 相干实践的衍生。

基于词向量的固定表征:word2vec、fastText、glove 基于词向量的动静表征:elmo、GPT、bert。

动静词向量相较于动态词向量,更加充分利用了上下文信息,所以能够解决一词多义的问题。在工程实际上其优越性也失去了证实(BERT 在多个 NLP 工作中也体现优异)。

img embedding

因为咱们做的是图文举荐,因而图片作为文章的门面特色,对举荐也很重要,能够通过 resnet 失去图片的向量,还能够通过 image caption 失去对一张图片的中文形容,对于娱乐类的新闻,还能够利用 facenet 辨认出组图中,哪一张蕴含明星,对于动漫类类的新闻能够利用 OCR 辨认出漫画里的文字,对于年龄,性别有显著偏向的场景还能够利用 resnet 扭转图片的格调。

对于 CNN 构造来说,不同层级的神经元学习到了不同类型的图像特色,由底向上特色造成层级构造,对人脸识别工作,训练好网络后,把每层神经元学习到的特色可视化,肉眼看一看每层学到了啥特色,你会看到最底层的神经元学到的是线段等特色,图示的第二个隐层学到的是人脸五官的轮廓,第三层学到的是人脸的轮廓,通过三步造成了特色的层级构造,越是底层的特色越是所有不论什么畛域的图像都会具备的比方边角线弧线等底层根底特色,越往上抽取出的特色越与手头工作相干。正因为此,所以预训练好的网络参数,尤其是底层的网络参数抽取出特色跟具体任务越无关,越具备工作的通用性,所以这是为何个别用底层预训练好的参数初始化新工作网络参数的起因。而高层特色跟工作关联较大,理论能够不必应用,或者采纳 Fine-tuning 用新数据集荡涤掉高层无关的特色抽取器。

user embeding

为了使新闻和用户能够在雷同的向量空间下做运算,咱们对对用户也做了 embedding,后期次要是从用户画像中筛选出一些在排序模型中重要性较大的特色来做向量化(比方通过特色重要度剖析,发现标签(tag),媒体号(mid),一级分类(cat1),二级分类(cat2),主题(topic)等特色对于用户是否点击某篇文章的影响是最大的)。中期应用了更多特色,模型采纳了 DSSM(确保 user 和 item 在同一向量空间),目前则是利用 bert+lstm 对用户的行为序列进行了建模。

基于 embedding 的召回

失去 item,user 向量后,就能够做各种基于向量的召回了,从 embedding 自身的应用形式上看,大抵能够分成以下几种召回形式。咱们的召回实际少数用的单 embedding,大量用到了多 embedding。

embedding 的根底用法——i2i 召回算法

单纯应用 fasttext+faiss 就能够实现好几路召回算法,比方 iten2vec,media2vec,tag2vec,loc2vec,title2vec。

tag2vec 就是利用词向量去做召回,比方能够用文章的标签向量示意文章的向量,如果一个文章有 4 个 tag(keywords: “ 蒋凡; 离婚; 张大奕; 网红张大奕 ”)咱们的教训是取前 3 个 tag, 做等权重向量相加,成果最好。当然了这不是惟一的做法。对于 embedding 向量的用法有很多种比方,等权重相加,加权相加,取均匀,取最大等。

失去文章向量之后就是典型的 item2item 的计算过程了,利用 faiss 计算每篇文章的类似文章,比方为每一篇文章查问询出 1000 篇候选文章后,按类似度作一个截断,比方 cosin sim<0.6 舍去,对余下的文章,再利用文章的其余特色比方热度,CTR,新鲜度作一个加权,一路最简略的 tag2vec 召回就诞生了。

其余召回和这个套路相似,就是训练 embedding 向量的时候,略有差别。tag2vec 是训练中文词语的向量,而 item2vec 是训练文章 ID(aid)所对应的向量,media2vec 训练的是文章的作者 ID(mid)所对应的向量,loc2vec 是训练地区名称所对应的向量,title2vec 是用 LSTM 训练失去的文章题目向量,doc2vec 是用 bert 计算出的文章正文(或者摘要)的向量。entity2vec 是利用咱们本人构建的常识图谱通过 transE 失去的

u2i 召回算法初步

u2i 召回算法实现了,uese2vec,word2vec 个性化,crosstag,DSSM 个性化等召回算法;user2vec 是拿用户的 tag 向量和文章的 tag 向量求类似度,做的召回;DSSM 个性化是拿用户的 DSSM 向量和文章的 DSSM 向量求类似度,做的召回;crosstag 相当于多个 user2vec, 须要把用户的 tag 按类别进行统计,每个类取 K 个 tag, 共获取 m 组 tag,而后各组别离做 user2vec, 最初汇总失去用户的举荐列表。

u2i 召回算法进阶

uese2vec 是在做召回的初级阶段,做的一些奢侈的尝试,简略暴力见效快,存储压力大。每个 user 都存储一个举荐列表,在产品初期 DAU 不多时,矛盾还不显著,随着 DAU 一直晋升,存储问题日益严重,这迫使咱们想方法改变现状,可行的策略有两条,一个是把离线提前计算再存储转为线上即时计算不存储,另一个是把按人举荐转化为分群举荐。两种办法咱们都做了实际。

分群召回流程大体如下:

分群举荐咱们尝试了簇召回,群画像召回,LSTM 分群,DSSM 分群,bnb 分群,增量聚类,动静规定聚类。

簇召回就是先把所有用户的 tag 向量用聚类算法(如 minibatch-kmeans)聚成若干个簇(比方 500 个,依据肘点法确定),而后保留下簇标签,簇核心,每个用户所属的簇(一个用户能够隶属于一个簇或者多个簇)。失去用户所在的簇后,有两种做法,一种是依据实时点击日志,在簇内做实时 CF,也就是在簇内把点击过的新闻互相推。另一种做法是离线定时计算各个簇核心和候选新闻的类似度,而后和到每个簇的候选集。从试验成果来看簇内做实时 CF 成果要好一些。

群画像召回是先把用户分群,而后把同一个群里的用户画像全副抽取进去,而后交融为一个群画像,相当于把这一群人合成了一个人,而后对于群画像,再应用和单个用户画像相似的个性化召回。

LSTM 分群和簇召回相似,不过用户的向量是通过用户最近点击文章的 m 篇文章的 bert 向量(tag2vec 向量亦可)送入 LSTM 失去用户的向量,剩下的步骤和簇召回相似,该算法有肯定晋升然而计算速度慢,很难铺量。

DSSM 分群,是把用户画像送入 DSSM,失去一个用户 64 维的向量,把文章画像送入 DSSM,失去一个文章的 64 维的向量,剩下的步骤和簇召回相似。该算法有晋升显著,曾经铺量应用。

bnb 分群是借鉴 airbn(爱彼迎)颁布的房源举荐算法,把文章的多个特色的 embedding(tag,topic,cat)拼接成一个向量,相似失去文章的向量。剩下的步骤和簇召回相似,该算法有肯定晋升,不非常显著。

增量聚类

增量聚类就是对文章或用户聚完类后,很长一段时间聚类核心,放弃不变,用户和类核心的关系能够是变动的,比方一个用户可能明天属于这个簇,今天属于另一个簇。这样的益处是,同一个簇标签的含意长期保持不变,便于排序层更好的学习到这个特色。该算法亦有显著晋升,已铺量应用。

次要步骤如下

利用聚类算法预聚类,以 Kmeans 为例
保留预聚类的聚类核心 C 和类标签 L
对于新增数据点 Xnew, 计算其到各个聚类核心 Ci 的间隔
把新增数据点 Xnew 分到间隔其最近的聚类核心 Ci,所属的类别 Li
在业务低峰期全量更新每个类的聚类核心,以打消增量聚类可能引入的部分偏差,以进步零碎的准确性

动静规定聚类

依据用户的画像,将用户聚成若个类,而后再依据类大小,将类大小小于肯定阈值的类合并到与其最类似的类,通过屡次迭代后聚类过程实现。该算法效率高,CTR 晋升约 3%。

次要步骤如下:

解决用户画像数据,失去每个用户最感兴趣的 K 个趣味点
把这 K 个趣味点依照权重大小,组合成一个趣味标签
如果存在相应的聚类标签则间接退出该类,否则创立一个新的聚类标签
全副数据遍历实现后,统计各个聚类标签下的用户数
如果该类别下的用户数大于阈值,则该聚类标签能够保留,否则该聚类标签须要和其余聚类标签合并
对于须要合并的聚类标签,首先把属于该类别的用户标签回退一步,即失去该聚类标签下用户的 k-1 个趣味点组成的趣味标签,而后反复 3-5 的过程,最好失去一个类大小绝对平衡的聚类后果

embedding 召回算法 – 其余

这个过程次要是用 DNN 类的算法做一些召回,比方 CNN,attention,YouTube 等;CNN 召回次要是用于图文相干召回,心愿把文章的 title,tag,abstract 合成为一个向量做召回;attention 次要是把文章信息和图片信息做了交融。

YouTube 是利用 embedding 特色做举荐的开山之作,因为名声比拟大,咱们还是复用了他的网络结构,只不过在应用的特色上稍有差异。从一个 embedding 主义者的角度看,他的典型特点是把所有的特色(无论离散间断,单值多值)全副转化为 embedding,而后把各种 embedding 拼接在一起,形成一个一字长蛇阵的向量,而后送入 DNN,最初失去文章的向量。在咱们的实际中次要用了 cat1,cat2,mid,topic,kg 等特色的 embedding,来训练。从实际的成果来看,第一版成果不佳,并未达到预期成果,次要是视频举荐和新闻举荐有时效性的差别(一个视频时效性能够很长,因而这个 VID 的 embedding 就能够重复一直地训练,越来越好,而新闻的生命周期则很短,往往是还没来得及曝光就过期了),后续又做了各种优化,成果也一直晋升。

airbnb 次要奉献是在稠密样本的结构上有所翻新,个人感觉 Airbnb 这个操作局部补救了 YouTube 在新闻举荐畛域水土不服的问题。从一个 embedding 主义者的角度看,他的翻新点次要有一下两点,一个是分群 embedding,另一个是用户和 item 混合训练。在挪动腾讯网的动静规定聚类召回算法中就借鉴了 Airbnb 分群训练 embedding 的思维。

在特色工程中,对于离散值,间断值,多值大抵有以下几种 embedding 的办法。事后训练的 embedding 特征向量,训练样本大,参数学习更充沛。end2end 是通过 embedding 层实现从高维稠密向量到低维浓密特征向量的转换,长处是端到端,梯度对立,毛病是参数多,收敛速度慢,如果数据量少,参数很难充沛训练。

不同的深度学习模型中,除了对网络结构的各种优化外,在 embedding 的运算上也进行了各种优化的尝试,集体感觉对网络结构的各种优化实质上也是对 embedding 的运算的优化。

embedding 作为一种技术,尽管很风行,然而他也存在一些缺点,比方增量更新的语义不变性,很难同时蕴含多个特色,长尾数据难以训练等。

针对 embedding 的空间散布影响模型的泛化误差的问题阿里和谷歌先后在 embedding 的示意和构造上进行了各种尝试,其中阿里提出了 residual embedding 的概念,心愿把一个向量用核心向量和残差向量的模式去示意,以达到同一类别向量簇内高度汇集的目标。谷歌则心愿对 embedding 的编码空间进行优化,简略来说就是为更高频更无效的特色调配更多的编码地位,反之则调配更少的编码地位。

embedding 总体来说还是一种很无效的技术,在实际过程中大抵经验了以下演进路线:

作者:minwxwang,腾讯 PCG 利用研究员


已建设深度学习公众号——FightingCV,欢送大家关注!!!

面向小白的顶会论文外围代码学习:https://github.com/xmu-xiaoma…

退出交换群,请增加小助手 wx:FightngCV666,备注:地区 - 学校(公司)- 名称

本文由 mdnice 多平台公布

退出移动版