提起Embedding,就不得不提Word2vec,它不仅让词向量在自然语言处理领域再度流行,更为关键的是,自2013年谷歌提出Word2vec以来,Embedding 技术从自然语言处理领域推广到广告、搜索、图像、推荐等深度学习应用领域, 成了深度学习知识框架中不可或缺的技术点。作为经典的Embedding方法,熟悉 Word2vec对于理解之后所有的Embedding相关技术和概念至关重要。
什么是Word2vec?
Word2vec是“word to vector”的简称,顾名思义,Word2vec是一个生成对 “词”的向量表达的模型。word2vec主要包含两个模型,skip-gram模型以及CBOW模型。其中,skip-gram模型用当前词来预测上下文。相当于给你一个词,让你猜前面和后面可能出现什么词。CBOW模型通过上下文来预测当前值。相当于一句话中扣掉一个词,让你猜这个词是什么。
skip-gram模型
跳字模型的概念是在每一次迭代中都取一个词作为中心词汇,尝试去预测它一定范围内的上下文词汇。为此,这个模型定义了一个概率分布求给定一个中心词,某个单词在它上下文中出现的概率。我们选取词汇的向量表示,从而让概率分布值最大化。 拿到一个文本,遍历文本中所有的位置,对于文本中的每个位置,我们都会定义一个围绕中心词汇大小为2m的窗口,这样就得到了一个概率分布,可以根据中心词汇给出其上下文词汇出现的概率。 如上例中,我们已经得到了一个句子:problems turning into banking crises。现在我们记”into“这个词的位置为t,那么"into"这个词用wt表示。”problems“、”turing“、”banking“、“crises"分别表示为wt-2,wt-1,wt+1,wt+2。 ? 那么在已知 “into” 这个词的情况下, ”problems“、”turing“、”banking“、"crises"这四个词出现的条件概率可以表示为P(wt-2|wt),P(wt-1|wt),P(wt+1|wt),P(wt+2|wt)。 ? 现在这个已知的句子就是我们的一个样本,我们要进行第一次迭代,在迭代的过程中,我们的损失函数(或者说目标函数)是这个函数: 该函数又称为似然函数,这里表示在给定中心词的情况下,在2m窗口内的所有其他词出现的概率(T表示词库里所有词的总数)。我们的目标是要通过调节参数,从而最大化这个函数(因为这个函数越大,表示与实际情况越吻合)。(注意:这里假设给定中心词的情况下背景词的生成相互独立) 另外,根据平时的习惯,我们通常喜欢最小化损失函数,而不是最大化损失函数。因此我们对该函数取负对数,且除以T,得到新的损失函数(对数似然函数): 我们现在的任务就是要最小化这个损失函数。从总体的角度明确了我们的训练任务之后,我们再来看我们具体要训练哪些参数 、如何去进行训练,或者更直观点说:我们怎么利用这些单词向量来最小化负的对数似然函数? 闲言少叙,上图: 例句为”勇哥爱跳舞“,中心词取”爱“,步长m取1,也就是范围内的词为“勇哥”和“跳舞”。 第一步 :t表示“爱”这个词在词典中的位置,那么“爱”用wt表示,“勇哥”用wt-1表示,“跳舞”用wt+1表示。 第二步:将“爱”这个词首先表示为one-hot编码,方便进行后续的矩阵操作。 接下来我们构建两个参数矩阵,分别为中心词矩阵和周围词矩阵,这两个矩阵分别是V×D维和D×V维,其中V表示词典的大小,D表示我们要构建的词向量的维度,是一个超参数,我们暂时认为其是固定的,不去管它。 以中心词矩阵为例,其为V×D维的,而我们的词表里一共有V个词,也就是说,该矩阵的每一行都表示一个单词的中心词向量(低维、稠密的),同理,周围词向量矩阵是D×V维的,每一列表示一个单词的周围词向量表示。 第三步:用第二步中的得到的,“爱”的one-hot编码乘以中心词向量矩阵W,得到一个1×D维的向量,这个向量可以认为是该词的中心词向量表示。 第四步:用该中心词向量乘以周围词向量矩阵w*,该步骤可以理解为对于“爱”这个词,我们分别与每一个词作内积,最终得到的1×V向量中的每一个元素,便是该位置的词与“爱”这个词的内积大小。 第五步:对于最终的得到的向量,我们再进一步的做softmax归一化,归一化之后的概率越大,表示该词与“爱”的相关性越大,现在我们的目标就是要使得:“勇哥”这个词的概率较大,我们如何去实现这个目标呢?那就是通过调整参数矩阵w和w*,(这里就可以明白这两个矩阵其实只是辅助矩阵,我们根据损失函数,使用反向传播算法来对参数矩阵进行调节,最终实现损失函数的最小化。 小tip:对于“爱”这个词,我们要迭代两次,第一次是使得“勇哥”这个词的概率尽量大,第二次使得“跳舞”这个词的概率尽量大。然后“爱”这个词迭代完了之后,我们再去遍历这个词表里的所有词,通过一次次的迭代,逐步降低损失函数。 提问:为什么一个词汇要用两种向量表示(中心词向量和背景词向量)? 1:数学上处理更加简单:让每个单词用两个向量表示,这两个表示是相互独立的,所以在做优化的时候,他们不会相互耦合,让数学处理更加简单。 2:实际效果更好:如果每个单词用一个向量来表示,那么中心词预测下一个词是自己本身的概率就会很大,因为我们是向量内积来定义;两个单词之间的相似性。所以用两种向量表示在通过效果上会比一种向量表示更好。 在训练结束后,对于词典中任一索引为i的词,我们都会得到两组词向量,在自然语言处理应用中,一般使用跳字模型的中心词向量作为词的表征向量。
CBOW(连续词袋模型)
连续词袋模型与跳字模型类似,最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。 例如:‘我’,‘爱’,‘红色’,‘这片’,‘土地’,窗口大小为2,就是用‘我’,‘爱’,‘这片’,‘土地’这四个背景词,来预测生成 ‘红色’ 这个中心词的条件概率,即: P(红色|我,爱,这片,土地) ?给定一个长度为T的文本序列,设时间步t的词为W(t),背景窗口大小为m。则连续词袋模型的目标函数(损失函数)是由背景词生成任一中心词的概率。 因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。
在获得输入向量矩阵后,其中每一行对应的权重向量就是通常意义上 的“词向量”。于是这个权重矩阵自然转换成了 Word2vec的查找表(lookup table )例如,输人向量是10000个词组成的one-hot向量,隐层维度 是300维,那么输人层到隐层的权重矩阵为10000x300维。在转换为词向量查找 表后,每行的权重即成了对应词的Embedding向量。
Word2vec的负采样训练方法
虽然上面给出了Word2vec的模型结构和训练方法,但事实上,完全遵循原始的Word2vec多分类结构的训练方法并不可行。假设语料库中的词的数量为 10000,就意味着输出层神经元有10000个,在每次迭代更新隐层到输出层神经元的权重时,都需要计算所有字典中的所有10000个词的预测误差(prediction error) ,在实际训练过程中几乎无法承受这样巨大的计算量。 为了减轻Word2vec的训练负担,往往采用负采样(Negative Sampling )的方法进行训练。相比原来需要计算所有字典中所有词的预测误差,负采样方法只 需要对采样出的几个负样本计算预测误差。在此情况下,Word2vec模型的优化 目标从一个多分类问题退化成了一个近似二分类问题,如下所示。 其中是输出词向量(即正样本),h是隐层向量,V’wj是负样本词向量。由于负样本集合的大小非常有限(在实际应用中通常小于10), 在每轮梯度下降的迭代中,计算复杂度至少可以缩小为原来的1/1000 (假设词表大小为10000)。 实际上,加快 Word2vec训练速度的方法还有Hierarchical softmax (层级 softmax ),但实现较为复杂,且最终效果没有明显优于负采样方法,因此较少采用,感兴趣的读者可以阅读参考文献,其中包含了详细的Hierarchical softmax 的推导过程。
Word2vec在其他领域的应用——Item2vec
在Word2vec诞生之后,Embedding的思想迅速从自然语言处理领域扩散到 几乎所有机器学习领域,推荐系统也不例外。既然Word2vec可以对词“序列” 中的词进行Embedding,那么对于用户购买“序列”中的一个商品,用户观看 “序列” 中的一个电影,也应该存在相应的Embedding方法,这就是Item2vec方法。
Item2vec的基本原理
矩阵分解部分曾介绍过,通过矩阵分解产生了用户隐向量和物品隐向量,如果从Embedding的角度看待矩阵分解模型,则用户隐向量和物品隐向量就是一种用户Embedding向量和物品Embedding向量。由于Word2vec的流行,越来越多的Embedding方法可以被直接用于物品Embedding向量的生成,而用户Embedding向量则更多通过行为历史中的物品Embedding平均或者聚类得到。利用用户向量和物品向量的相似性,可以直接在推荐系统的召回层快速得到候选集合,或在排序层直接用于最终推荐列表的排序。正是基于这样的技术背景, 微软于2016年提出了计算物品Embedding向量的方法Item2vec。 相比Word2vec利用“词序列”生成词Embedding。Item2vec利用的“物品序列”是由特定用户的浏览、购买等行为产生的历史行为记录序列。 假设Item2vec中一个长度为K的用户历史记录为w1,w2,…,wt,类比 Word2vec, Item2vec的优化目标如下所示。 Item2vec与Word2vec唯一的不同在于,Item2vec摒弃了时间窗口的概念,认为序列中任意两个物品都相关, 因此在ltem2vec的目标函数中可以看到,其是两两物品的对数概率的和,而不仅是时间窗口内物品的对数概率之和。 在优化目标定义好之后,Item2vec剩余的训练过程和最终物品Embedding的产生过程都与Word2vec完全一致,最终物品向量的查找表就是Word2vec中词向量的查找表。
广义上的Item2vec
事实上,Embedding对物品进行向量化的方法远不止Item2vec。广义上讲, 任何能够生成物品向量的方法都可以称为Item2vec。典型的例子是曾在百度、 Facebook等公司成功应用的双塔模型。 在广告场景下的双塔模型中,广告侧的模型结构实现的其实就是对物品进行 Embedding的过程。该模型被称为“双塔模型”,因此以下将广告侧的模型结构 称为“物品塔”。那么,“物品塔”起到的作用本质上是接收物品相关的特征向量。 经过物品塔内的多层神经网络结构,最终生成一个多维的稠密向量。从Embedding 的角度看,这个稠密向量其实就是物品的Embedding向量,只不过Embedding 模型从Word2vec变成了更为复杂灵活的“物品塔”模型,输入特征由用户行为 序列生成的one-hot特征向量,变成了可包含更多信息的、全面的物品特征向量。 二者的最终目的都是把物品的原始特征转变为稠密的物品Embedding向量表达, 因此不管其中的模型结构如何,都可以把这类模型称为“广义”上的Item2vec 类模型。
Item2vec方法的特点和局限性
Item2vec作为Word2vec模型的推广,理论上可以利用任何序列型数据生成 物品的Embedding向量,这大大拓展了 Word2vec的应用场景。广义上的Item2vec 模型其实是物品向量化方法的统称,它可以利用不同的深度学习网络结构对物品 特征进行Embedding化。 Item2vec方法也有其局限性,因为只能利用序列型数据,所以Item2vec在处 理互联网场景下大量的网络化数据时往往显得捉襟见肘,这就是Graph Embedding技术出现的动因。
|