万物皆可Embedding,从word2vec到item2vec、node2vec

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万物皆可Embedding,从word2vec到item2vec、node2vec相关的知识,希望对你有一定的参考价值。

参考技术A [参考 link ]
[参考 link ]
[参考 link ]

话不多说,先上中心思想:

简单来说,embedding就是用一个低维的向量表示一个ID类的物体or对象,可以是一个词,或是一个商品,或是一个电影等等。这个embedding vector的主要性质是:
* 距离相近的向量对应的物体有相近的含义
比如: Embedding(复仇者联盟)和Embedding(钢铁侠)之间的距离就会很接近,但 Embedding(复仇者联盟)和Embedding(乱世佳人)的距离就会远一些。
* 除此之外Embedding甚至还具有数学运算的关系
比如:Embedding(马德里)-Embedding(西班牙)≈ Embedding(巴黎) - Embedding(法国)

言归正传,Embedding能够用低维向量对物体进行编码还能保留其含义的特点非常适合 深度学习 。
在传统机器学习模型构建过程中,我们经常使用one hot encoding对离散特征,特别是id类特征进行编码。
但是,生活中ID类的对象通常是超大数量级的,由于one hot encoding的维度等于物体的总数,比如阿里的商品one hot encoding的维度就至少是千万量级的。这样的编码方式对于商品来说是极端稀疏的。
甚至,就算是使用multi hot encoding对用户浏览历史的编码也会是一个非常稀疏的向量。

因此如果能把物体编码为一个低维稠密向量再喂给DNN,自然是一个高效的基本操作。

对word的vector表达的研究早已有之,但让embedding方法空前流行,我们还是要归功于google的word2vec。
既然我们要训练一个对word的语义表达,那么训练样本显然是一个句子的集合。
假设其中一个长度为T的句子为 , , ..., 。
这时我们假定每个词都跟其相邻的词的关系最密切,换句话说每个词都是由相邻的词决定的( CBOW模型 的动机),或者每个词都决定了相邻的词( Skip-gram模型 的动机)。

如上图,
* CBOW 的输入是 周边的词,预测的输出是 ,
* 而 Skip-gram 则反之,输入的是 ,输出的是 周边的词。

经验上讲Skip-gram的效果好一点,所以本文从Skip-gram模型出发讲解模型细节。

为了产生训练模型的正样本,我们设一个滑动窗口,其长度置为2c+1(目标词前后各选c个词),从句子左边滑倒右边,每滑一次,窗口中的词就形成了我们的一个正样本。

有了训练样本之后我们就可以着手定义优化目标了:
既然每个词 都决定了相邻词 ,
基于极大似然,我们希望所有样本的条件概率 之积最大,
再通过 将极大似然里面的连乘变连加,
即:

接下来的问题是怎么定义
作为一个多分类问题,最简单最直接的方法当然是直接用 函数,
我们又希望用向量 表示每个词 ,用词 点 之间的距离or 向量 之间的夹角 :
考虑到:
我们用 表示词 、 语义的接近程度,

那么我们的 条件概率 的定义就可以很直观的写出:

就像上面的条件概率公式写的一样, 和 分别是词w的输出向量表达和输入向量表达。
那什么是输入向量表达和输出向量表达呢?
我们画一个word2vec的神经网络架构图就明白了。

根据 的定义,我们可以把两个vector的乘积再套上一个softmax的形式转换成上面的神经网络架构。

在训练过程中我们就可以通过梯度下降的方式求解模型参数了。
那么上文所说的
* 输入向量 表达就是input layer到hidden layer的 权重矩阵
* 输出向量 表达就是hidden layer到output layer的 权重矩阵

当然在训练word2vec的过程中还有很多工程技巧,比如:
* 用negative sampling或Hierarchical Softmax减少词汇空间过大带来的计算量
* 对高频词汇进行降采样避免对于这些低信息词汇的无谓计算等

在具体实现的时候最好参考2013/10发表的Google的原文:「1310.4546 : Distributed Representations of Words and Phrases and their Compositionality 」

在word2vec诞生之后, embedding的思想 迅速从NLP领域扩散到几乎所有机器学习的领域。

而广告、推荐、搜索等领域用户数据的 稀疏性 几乎必然要求在构建DNN之前对user和item进行embedding后才能进行有效的训练。
具体来讲,如果item 存在于一个序列中 ,item2vec的方法与word2vec没有任何区别。
而如果我们 摒弃 序列 中item的空间关系,在原来的目标函数基础上,
* 自然是不存在 时间窗口 的概念了:
* 取而代之的是item set中 两两之间的条件概率 ,即:

具体可以参考2016/03发表的item2vec的原文:「1603.04259 : Item2Vec:Neural Item Embedding for Collaborative Filtering 」

但embedding的应用又远不止于此,事实上,由于我们也可以把输出矩阵的列向量当作item embedding,这大大解放了我们可以用复杂网络生成embedding的能力。

[参考 link ]
「Deep Neural Networks for YouTube Recommendations」

在线上serving时
* 不用 部署 整个 模型,
* 而是只存储user vector和item vector,再用最近邻索引进行快速搜索
这无疑是非常实用的embedding工程经验,
也证明了我们可以用复杂网络生成user和item的embedding。

KDD 2018 best paper :
「Real-time Personalization using Embeddings for Search Ranking at Airbnb」
也介绍了Airbnb的embedding最佳实践,主要内容涉及Airbnb如何将业务场景与embedding方法结合起来。

论文|万物皆可Vector之语言模型:从N-Gram到NNLMRNNLM

Word2vec的出现改变了OneHot的高维稀疏的困境,自此之后各种xxx2vec如雨后春笋般冒了出来,用来解决各种嵌入式编码,包括后来的各种Embedding方式其实很多本质上都是Word2vec的延伸和优化。在本公众号「搜索与推荐Wiki」上也发布了不少Embedding相关的文章,后续也会持续的发布相关文章,欢迎关注。

万物皆可Embedding系列会结合论文和实践经验进行介绍,前期主要集中在论文中,后期会加入实践经验和案例,目前已更新:

后续会持续更新Embedding相关的文章,欢迎持续关注「搜索与推荐Wiki


1.1、基础知识

a)定义

语言模型(Language model)是自然语言处理的重要技术,自然语言处理中最常见的是文本数据,我们可以把一段自然语言文本看作是一段离散的时间序列,假设一段长度为 T T T的文本中的词依次是 w 1 , w 2 , . . . , w T w_1, w_2, ..., w_T w1,w2,...,wT,语言模型就是计算他的概率:
P ( w 1 , w 2 , . . . , w T ) P(w_1, w_2,..., w_T) P(w1,w2,...,wT)
也就是说语言模型是对语句的概率分布的建模。

语言模型可以分为:统计语言模型和神经网络语言模型。

b)概率表示

假设 S S S 表示一个有意义的句子,eg:今天天气晴朗,适合户外爬山,可以将这个句子表示为: S = w 1 , w 2 , . . . , w n S = w_1, w_2, ..., w_n S=w1,w2,...,wn,换成例子中的句子: w 1 = 今 天 , w 2 = 天 气 , w 3 = 晴 朗 , w 4 = 适 合 , w 5 = 户 外 , w 6 = 爬 山 w_1=今天, w_2=天气, w_3=晴朗, w_4=适合, w_5=户外, w_6=爬山 w1=,w2=,w3=,w4=,w5=,w6=

P ( S ) P(S) P(S) 表示这个句子出现的概率,展开为:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) P(S)=P(w_1, w_2, ..., w_n) P(S)=P(w1,w2,...,wn)
利用条件概率可以转化为:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w n ∣ w 1 , w 2 , . . . , w n − 1 ) P(S) = P(w_1, w_2, ..., w_n) = P(w_1) P(w_2|w_1)P(w_3|w_1,w_2) ... P(w_n|w_1, w_2,...,w_n-1) P(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w1,w2)...P(wnw1,w2,...,wn1)
其中 P ( w 1 ) P(w_1) P(w1) 表示第一个词出现的概率,即「今天」在整个语料库中出现的概率, P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2w1) 表示在给定第一个词的情况下,第二个词出现的概率,即在整个语料库中给定「今天」这个词,「天气」这个词也出现的概率,后边的依次类推。

其中的 P ( w 1 ) P(w_1) P(w1) P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2w1)很容易计算得到,但是 P ( w 3 ∣ w 1 , w 2 ) P(w_3|w_1,w_2) P(w3w1,w2)及以后涉及变量较多,计算的复杂度也会变得更加复杂。

1.2、统计语言模型——N-gram模型

a)马尔可夫假设

为了解决上面的过于复杂难以计算的问题,需要引入马尔可夫假设,马尔科夫假设中很重要的一点是有限视野假设,即每一个状态只与它前面的 n − 1 n-1 n1个状态有关,这被称为 n n n 阶马尔可夫链

b)n-gram

当应用在语言模型中时,就是指每一个词的概率只与前边的 n − 1 n-1 n1 个词有关系,这就被称为 n n n 元语言模型,当 n = 2 n=2 n=2 时,被称为二元模型,此时上述公式展开为:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 ) . . . P ( w n ∣ n 1 ) P(S) = P(w_1, w_2, ..., w_n) = P(w_1) P(w_2|w_1)P(w_3|w_2)...P(w_n|n_1) P(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w2)...P(wnn1)
经过马尔可夫假设的简化,计算 P ( S ) P(S) P(S)的概率也会变得容易很多,当然随着 n n n的增加,相应的计算复杂度也会增加,而 n n n 越大,越逼近数据的真实分布, n n n 通常取值为2、3、4、5。

c)概率估计

通过上面的描述,可以明确的是:

  • 每一个句子都可以拆分成不同的词的全排列
  • 每一个句子都可以通过条件概率公式计算得到一个表示该句子的合理性概率
  • 通过引入马尔可夫假设,简化句子的计算概率

以二元模型为例,如何计算 P ( w i ∣ w i − 1 ) P(w_i|w_i-1) P(wiwi1)?从概率统计中可知:
P ( w i

以上是关于万物皆可Embedding,从word2vec到item2vec、node2vec的主要内容,如果未能解决你的问题,请参考以下文章

论文|万物皆可Vector之Word2vec:2个模型2个优化及实战使用

论文|万物皆可Vector之Word2vec:2个模型2个优化及实战使用

论文|DeepWalk的算法原理代码实现和应用说明

论文|DeepWalk的算法原理代码实现和应用说明

论文|DeepWalk的算法原理代码实现和应用说明

论文|Doc2vec的算法原理代码实现及应用启发