特征工程|四种主流的embedding特征技术
特征工程系列文章目前已经更新:
特征工程|数据的分类、特征工程的定义、意义和应用
特征工程|特征设计、特征可用性评估
特征工程|特征获取、特征规范和特征存储
特征工程|数据清洗、特征生成、特征拼接
特征工程|类别特征的常见处理方式(含代码)
特征工程|连续特征的常见处理方式(含实例)
特征工程|文本特征处理的四大类主流方法
特征工程|特征交叉(Feature Crosses)
在我们的业务场景中会有海量的稀疏类特征,海量意味着数量巨大,稀疏意味着即使在很大的训练数据里,大量特征出现频次也非常低,一个比较典型的稀疏特征就是ID类特征。
起初在推荐系统中是抛弃了这些ID类的特征的,但其实其中也包含了大量的信息。如果在user或者item量不大的情况下,可以直接使用其对应的Onehot特征进行使用,但是如果数据量特别大时,这种方式就显然不合理了(无论是计算量还是数据存储、在线计算服务等),所以就催生了Embedding相关的嵌入式itemid、userid向量表示。
我们常说的embedding特征其实包含两个意思(其实本质是一样的):
1、基于一些模型比如word2vec、graph embedding方法等产出item、user的embedding作为user维度、item维度的一部分特征传入模型使用
2、深度模型产出的中间结果,比如双塔模型,我们最终算法的user 和 item的余弦相似度,但是会依赖中间产出的user、item embedding;又比如Youtube DNN中会依赖用户的行为序列特征,比如点击序列,但是点击序列是没有办法被网络直接使用的,所以就要借助embedding去实现
本文并不打算把Embedding技术的前世今生拿出来去介绍,主要介绍几种典型的embedding技术算法方案。从word2vec到deepwalk,从dssm到youtubeDNN是一个逐渐演变和递进的过程,网络变得更加的复杂,效果也更好,但是在不同的场景中还要选择适合自己业务的算法进行应用。
1. word2vec
Word2vec的出现改变了OneHot的高维稀疏的困境,自此稀疏的ID类特征便开始进行了应用。w2v可谓是embedding届的祖师爷了。
word2vec工具中包含两种模型:CBOW和skip-gram。论文中介绍的比较简单,如下图所示,CBOW是通过上下文的词预测中心词,Skip-gram则是通过输入词预测上下文的词。
CBOW和skip-gram
因为实际中使用skip-gram的比较多,所以这里只介绍一个skip-gram模型的过程,关于CBOW可以参考上面的链接。
Skip-gram
从输入层到隐藏层:
从隐藏层到输出层:
其中:
表示的是输入词
表示输出层第个词实际落在了第个神经元
表示输出层第个词应该落在第个神经元
表示输出层第个词实际落在了第个神经元上归一化后的概率
表示输出层第个词实际落在了第个神经元上未归一化的值
因为输出层共享权重,所以: 表示第个单词的输出向量,其值为输出权重矩阵)表示,如果选择使用skip-gram时,最终产出的word embedding为单词的输入向量()表示,因为更倾向于选择靠近中心词一端的权重矩阵。
详细参考:万物皆可Vector之Word2vec
2. deepwalk
DeepWalk是2014年提出的一种Graph Embedding 算法,是首次将NLP w2v和graph embedding进行结合。论文中提到优秀的社群表示需要有下面的特征:适应性,社群内相似性,低维和连续性。
适应性:网络表示必须能适应网络的变化。网络是一个动态的图,不断地会有新的节点和边添加进来,网络表示需要适应网络的正常演化
社群内相似性:属于同一个社区的节点有着类似的表示,网络中往往会出现一些特征相似的点构成的团状结构,这些节点表示成向量后必须相似
低维:代表每个顶点的向量维数不能过高,过高会有过拟合的风险,对网络中有缺失数据的情况处理能力较差
连续性:低维的向量应该是连续的
Deepwalk算法的核心步骤分为两步:
随机游走采样节点序列
使用Skip-gram model学习表达向量
整个算法的流程为:
Random Walk算法流程图
其中第2步是构建Hierarchical Softmax,第3步对每个节点做次随机游走,第4步打乱网络中的节点,第5步以每个节点为根节点生成长度为t的随机游走,第7步根据生成的随机游走使用Skip-gram模型利用梯度的方法对参数进行更新。
2.1 Random Walks
随机游走算法,其实在文中更精确的是截断式随机游走,也就是长度固定的随机游走。随机游走这一步其实更像是为网络标识的学习来收集训练数据,或者说是进行采样工作。算法的思想其实是很简单的,主要就是对网络中的每个节点作为root随机的找下一个节点进行游走,然后长度为固定好的。然后每个节点可以有好几个Walker,这些都是可以自己设定的参数。
这个算法使其具有了可以高度并行化和适应性的特点,因为每个节点的随机游走都可以并行的同时开始,同时对于网络的部分更新我们也可以只在整个网络更新的小部分进行随机游走。
2.2 Skip-gram
随机游走后需要进行的就是skip-gram算法了,使用random walk生成了大量的训练数据。后面就采用训练word2vec相同的思路来训练就可以了。w2v有两种训练方式,这里使用的是skipgram的方式也就是用一个词来预测它的上下文,这里忽略的词序的信息以及和当前词的距离。
Skip-gram
2.3 Hierarchical Softmax
这个也是w2v中的技术,就是为了解决标签过多在使用softmax时带来的计算量大的问题。这里需要我们生成一个二叉树,叶子节点就是每个类别。假设一共有V个类别,原始softmax的计算量就是,使用二叉树后,从根节点到叶子节点的距离就变成了。
Hierarchical Softmax
2.4 Power-law Distribution
论文中使用的是w2v中的skip-gram模型进行embedding的学习。那么为什么deepwalk随机游走出来的序列可以套用skip-gram呢?
文中提到网络中随机游走的分布规律与NLP中句子序列在语料库中出现的规律有着类似的幂律分布特征。那么既然网络的特性与自然语言处理中的特性十分类似,那么就可以将NLP中词向量的模型用在网络表示中。
幂率分布对比
详细参考:DeepWalk的算法原理、代码实现和应用说明
3. dssm
DSSM模型是2013年微软发布的,其论文全称为:Learning Deep Structured Semantic Models for Web Search using Clickthrough Dara。其发表的本意是用来语义相似度计算。通过对用户的Query历史和Document进行embedding编码,使用余弦相似度计算用户query的embedding和document的相似度,继而达到语义相似度计算的目的。
论文首先介绍了已有的语义分析模型,比如
LSA、PLSA、LDA,但是因为他们采用的都是无监督的学习方法,因此在实际的场景中表现的并不好。
通过用户查询和点击序列进行建模的BLTMs和DPMs,BLTMs不仅要求共享主题分布,而且还给每个主题分配相似的词组;DPMs则使用S2Net算法并结合LTR中的piarwise方法。在实验中他们的效果表现要比LSA、PLSA、LDA效果好。然后虽然BLTMs使用了点击数据进行训练,但其使用的是最大似然方法优化目标,该方法对于排序来讲并不是最优的。DPMs则会产生一个巨大的稀疏矩阵,虽然可以通过删除词汇减小维度,但相应的效果也会减弱
结合深度自编码的方法,虽然表现较传统的LSA效果好,但由于其采用的是无监督的学习方法,模型参数的优化是基于重建文档,而不是区分相关性,因此基于深度自编码的方法在效果上并没有显著优于关键词匹配。
因此作者们提出了深层结构化语义模型(Deep Structured Semantic Model,DSSM)。相比之前的提到几个模型DSSM的主要区别在于:
有监督,使用最大似然函数进行优化
使用word-hashing方法解决大规模且稀疏的词典问题
将用户的Query行为和Document映射到同一语义空间中,通过余弦相似度计算相似性
DSSM模型的结构如下图所示:
DSSM模型结构
从上图可以看出,输入DSSM的是一个高维的向量,经过若干层的神经网络,输出一个低维的向量,分别用来表示user的query意图和document,最后通过余弦相似度计算Q和D的相似度。
每一层的输出可以表示为:
其中:
表示第 层的权重矩阵
表示第 层的偏置,特别的第一层的偏置为0
最终输出的结果为:
这里采用的激活函数为tanh,其表达形式为:
余弦相似度的计算公式为:
其中:
、 分别表示用户查询低维向量和文档低维向量
论文的另一个出色的点在于抛弃了传统的Bag-of-word模型,因为其会带来高维度的向量特征,这里使用word hashing技术来代替词袋模型,word hashing基于n-gram,比如一个单词,使用word hashing技术进行拆分,首先在其两端补充标记符 “#”,假设n=3,则“#good#” 可以表示为:#go、goo、ood、od#。
但采用word hashing技术会带来一个问题就是:词汇冲突,即两个表达含义不同的词拥有相同的n-gram向量表示。但是论文作者也提到了这种概率很小,冲突的概率在0.0044%,如下图所示:
词汇冲突统计
在用户的一次查询中,我们假设用户点击的doc是和query相关的,这样就可以使用有监督的方法进行模型的训练,这里采用的是最大似然函数(maximize the conditional likelihood),其中要学习的参数是权重矩阵和偏置。
这里通过softmax函数计算用户query doc之后被点击的后验概率,表达式如下:
其中:
表示的是平滑因子
表示的整个候选文档库(其中用户在一次查询中点击的结果用表示,未点击的结果用 表示,这里对未点击的进行负采样,比例为1:4)
论文中特意提到采用不同的采样比例对结果影响不大
模型训练采用最大似然函数,优化目标是最小化下列损失函数:
其中
表示神经网络的参数
详细参考:[从DSSM语义匹配到Google的双塔深度模型召回和广告场景中的双塔模型思考](
4. youtube dnn
Youtube2016年发表在RecSys上的论文介绍其自己在推荐系统上的深度学习实践,包括召回和推荐。
其整个推荐系统的架构如下图所示,其中candidate generation为生成候选池的神经网络,主要负责从大量的内容中产出少量的用户感兴趣的候选集合,ranking为排序的神经网络,最终推荐少量用户感兴趣的内容给用户。
系统框架
两阶段推荐方法允许我们从大量视频中进行推荐,同时确保设备上出现的少量视频是个性化的,并且适合用户。此外,这种设计允许混合由其他来源生成的候选源。
深度学习召回模型的网络结构如下图所示:
深度学习召回模型
使用到的特征包括:
观看序列视频的平均embedding、搜索关键词的平均embedding、其他序列embedding
用户的地理位置信息、设备信息(embedding编码之后的)
人口统计学特征(年龄、性别、登录状态等,并将其进行归一化到[0,1])
然后将所有特征进行拼接,得到网络的原始输入特征。
这里需要注意的是,论文中将推荐问题看成了多分类问题来进行模型的训练,如下面公式所示:
其中:
表示
表示上下文
表示时刻看到的视频
表示 的embedding编码
表示 的embedding编码
排序模型的网络结构图如下所示:
排序模型的网络结构
整个结构分为:
特征输入拼接层:序列embedding特征,类别特征的embedding,连续特征的处理之后进行拼接
三层的神经网络:每层神经网络激活函数使用的是ReLU,最优得结构为:
输出层:在训练时,采用得时加权得逻辑回归,在线预测时,采用的是
论文中提出的召回和排序模型结构相比较矩阵分解类召回、树模型排序等取得了不错的效果,这也说明深度学习推荐系统是工业界的主流趋势,我们应该拥抱深度学习推荐系统。
论文中很值得借鉴和思考的点其实在上面的内容中已经介绍到了,主要包括:
经典的三层的网络结构
序列特征的处理方式
连续特征的处理方式
离线模型的评估和模型的优化扩展对比
在线实验ABTest
CTR类模型中label的选取
... ...
更加详细的内容请参考:Youtube深度召回排序
除此之外,还有一些其他的embedding技术算法,参考:论文笔记关注我们不错过每一篇精彩