Word2vec算法原理详解

发布于 2025-1-9 12:57
浏览
0收藏

        今天我们要讲解的算法是Word2vec。Word2vec(word to vector)顾名思义,这是一个将单词转换成向量形式的工具。通过转换,可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。

        Word2vec主要分为CBOW(Continuous Bag of Words)又叫连续词袋和Skip-Gram两种模式,今天我们主要讲解的就是CBOW,接下来我们将从头到尾的详细讲解Word2vec算法流程。

        先来讲解一个背景知识:one-hot向量。独热向量是指使用N位0或1来对N个状态进行编码,每个状态都有它独立的表示形式,并且其中只有一位为1,其他位都为0。

        比如我们现在要编码apple\bag\cat\dog\elephant这五个单词,我们用5位向量来进行编码,如下所示:

apple [1 0 0 0 0]

bag [0 1 0 0 0]

cat [0 0 1 0 0]

dog [0 0 0 1 0]

elephant [0 0 0 0 1]

如果我们现在想要编码其他另外的单词,那就需要更多位参与编码,但是这五个单词的编码前5位仍然能够是这样,只不过后面省略号省略的部分都为0罢了。

Word2vec算法原理详解-AI.x社区图片

同时使用独热向量形成的特征矩阵会非常的稀疏,占用的空间非常的大。

        而Word2vec就可以解决这个问题,其核心思想是:上下文语境相似的词,其语义也相似。Word2vec采用的是n元语法模型(n-gram model),即假设一个词只与周围n个词有关,而与文本中的其他词无关。所以Word2vec就是把这n个词作为一个目标词的特征,那么就可以把特征映射到 K 维向量空间,可以为文本数据寻求更加深层次的特征表示 。所以 Word2vec的基本思想是 通过训练将每个词映射成 K 维实数向量(K 一般为模型中的超参数),通过词之间的距离(比如 cosine 相似度、欧氏距离等)来判断它们之间的语义相似度。

        接下来看一看CBOW的结构。分为三层:输入层,隐藏层和输出层。

Word2vec算法原理详解-AI.x社区图片

        这里对传统的神经网络做了以下一些改造:

1. 首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法,而是采用简单的对所有输入词向量求和并取平均的方法。比如输入的是三个4维词向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我们word2vec映射后的词向量就是(5,6,7,8)。由于这里是从多个词向量变成了一个词向量。

2. 第二个改进就是从隐藏层到输出的softmax层这里的计算量个改进。为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。

        说到哈夫曼树,我们都不陌生,它是一种带权路径最短的二叉树,也叫做最优二叉树。如下图,b是哈夫曼树,他的带权路径只有48

Word2vec算法原理详解-AI.x社区图片

        哈夫曼树的构造方法如下图所示:先用权重最小的两个作为最底层叶子结点,然后权重次小的,以此类推。保证权重越大的越早被遍历到,节省时间和空间。同时遍历叶子结点的路径我们也可以用哈夫曼编码表示,例如左节点是0,右节点是1,那么叶子结点c的哈夫曼编码就是110。

Word2vec算法原理详解-AI.x社区图片

        使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为V,现在变成了log2V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

        有了哈夫曼树,就有了哈夫曼编码,我们这整个算法的核心就是:即对于给定的上下文,使得预测词的哈夫曼编码概率最大。如果你现在感到很疑惑,我来举个例子:

        假设我们现在的语境是这一个简单的只有四个单词的document:{I drink coffee everyday}

我们选coffee作为中心词,我们要根据单词"I","drink"和"everyday"来预测一个单词,并且我们希望这个单词是coffee。将"I""drink""everyday"的one-hot向量作为输入层的输入

Word2vec算法原理详解-AI.x社区图片

    最开始输入层的权重w参数是随机生成的,接下来将这三个向量x初始乘以初始权重:w*x=v

Word2vec算法原理详解-AI.x社区图片

    将向量v求和并平均得到隐藏层的输出向量c它:

Word2vec算法原理详解-AI.x社区图片

        从输入层到隐藏层的逻辑过程讲解完毕,接下来讲解隐藏层到输出层。

        我们在这一层用语料库中所有的词根据词频(就是哈夫曼中的权重)构建了哈夫曼树,这样每个词 w 都可以从树的根结点root沿着唯一一条路径被访问到,其路径也就形成了其全局唯一的二进制编码code,如"010011"。而我们从根结点开始走左子树还是右子树的概率是根据逻辑回归二分类算法判断的,逻辑回归算法sigmoid,输入是负无穷到正无穷,输出是0到1之前的概率,sigmoid g函数和其导数如下图所示:

Word2vec算法原理详解-AI.x社区图片

那么我们的输出层的哈夫曼树就可以表示成下图:

Word2vec算法原理详解-AI.x社区图片

        假设目标词是足球,那么足球的哈夫曼编码是1001。这里我们指定负例是1,正例是0,那么我们可以得到上图的第1次,第2次直到第四次的结果,那么足球的概率就是前面所有结点的概率相乘。d是每个结点的哈夫曼编码,那么我们目标词的概率可以写成如下似然函数p,取对数,d=1就是负例,d=0就是正例:

Word2vec算法原理详解-AI.x社区图片

上面就是做了简单的化简,log连乘变成连加,log里面的指数放到log前面。接下来就是求这个似然函数的最大值,求极大值,我们都用梯度上升算法,那么下一步就是分别对变量x和c它求偏导数:

Word2vec算法原理详解-AI.x社区图片

        求导很简单,上面有详细的求导过程,由此我们就得到了参数c它的更新公式,同样再对x求偏导也可以得到x的更新公式。

        不过我们知道隐藏层的x是上下文词向量的和,不是上下文单个单词的词向量,怎么把这个更新量应用到单个单词的词向量上去呢?这里我们采用的是直接将更新量应用到每个词向量上去:

Word2vec算法原理详解-AI.x社区图片

        还有一种提升训练速度的方法就是负采样,我们知道对于训练语言模型来说,softmax层非常难算,毕竟你要预测的是当前位置是哪个词,那么这个类别数就等同于词典规模,因此动辄几万几十万的类别数,算softmax函数当然很费力啦。
        但是,如果我们的目标不在于训练一个精准的语言模型,而只是为了训练得到语言模型的副产物-词向量,那么其实只需要用这里隐含的一个计算代价更小的“子任务”就好啦。想一想,给你10000张写有数字的卡片,让你找出其中的最大值,是不是特别费力?但是如果把里面的最大值事先抽出来,跟五张随机抽取的卡片混到一起,让你选出其中的最大值,是不是就容易多啦?
        负采样就是这个思想,即不直接让模型从整个词表找最可能的词了,而是直接给定这个词(即正例)和几个随机采样的噪声词(即采样出来的负例),只要模型能从这里面找出正确的词就认为完成目标啦。

        那么我们选择哪些作为噪音呢?

        word2vec常用的负采样策略有均匀负采样、按词频率采样等等。比较常用的采样方法是一元分布模型的3/4次幂。该方法中,一个词被采样的概率,取决于这个词在语料中的词频 ,其满足一元分布模型(Unigram Model).

Word2vec算法原理详解-AI.x社区图片

其中V为整个词表大小,   f(wi)为词wi的词频。

至于为什么选择3/4呢?其实是由论文作者的经验所决定的。

假设由三个词,,”我“,”和平“,”觊觎“ 权重分别为 0.9 ,0.01,0.003;经过3/4幂后:

我: 0.9^3/4 = 0.92

和平:0.01^3/4 = 0.03

觊觎:0.003^3/4 = 0.012

对于”觊觎“而言,权重增加了4倍;”和平“增加3倍;”我“只有轻微增加。

可以认为:在保证高频词容易被抽到的大方向下,通过权重3/4次幂的方式,适当提升低频词、罕见词被抽到的概率。如果不这么做,低频词,罕见词很难被抽到,以至于不被更新到对应的Embedding。

        所以我们可以得到如下公式g,w表示正确的预测词,u表示错误的负采样,那么1-预测中心词u的概率还是预测正确的概率,所以我们的目标还是使得g最大化,那么还是求似然函数,并求导:

Word2vec算法原理详解-AI.x社区图片

那么求导还是一样的方式,如下所示,对似然函数求偏导,然后得出更新的步长

Word2vec算法原理详解-AI.x社区图片

Word2vec算法原理详解-AI.x社区图片

本文转载自 人工智能训练营​,作者: 小A学习

收藏
回复
举报
回复
相关推荐