Tensorflow (5) Word2Vec

图解Word2vec – 知乎

原文:The Illustrated Word2vec – Jay Alammar – Visualizing machine learning one concept at a time.

BERT_ 英文 The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning) – Jay Alammar – Visualizing machine learning one concept at a time.

深入浅出Word2Vec原理解析 – 知乎

word2vec模型深度解析 – 知乎

Word2Vec的训练过程详解 – 知乎

Word2Vec-——gensim实战教程 – 知乎

1、基础背景

Tensorflow (5) Word2Vec

在下面的图片中,这两个人中谁更像我?

[En]

Which of the two people is more like me in the picture below?

Tensorflow (5) Word2Vec

在处理向量时,计算相似度分数的常用方法是余弦相似度:

[En]

When dealing with vectors, the common method to calculate the similarity score is cosine similarity:

Tensorflow (5) Word2Vec

任意维度:

Tensorflow (5) Word2Vec

余弦相似性适用于任意数量的维度。这些分数比上次的分数高。

[En]

CoSine similarity applies to any number of dimensions. These scores are better than the last one.

两个中心思想:

1.我们可以将人和事物表示为代数向量(这对机器来说很棒!)。

2.我们可以很容易地计算出相似的向量之间的相互关系。

Tensorflow (5) Word2Vec

2、Word Embeddings

先看单词”king”的词嵌入:

[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]

这是一个包含50个数字的列表。通过观察数值我们看不出什么,但是让我们稍微给它可视化,以便比较其它词向量。我们把所有这些数字放在一行:

Tensorflow (5) Word2Vec

让我们根据单元格的值(接近2时为红色,接近0时为白色,接近-2时为蓝色)对单元格进行颜色编码:

[En]

Let’s color-code cells according to their values (red if they are close to 2, white if they are close to 0, and blue if they are close to-2):

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

有几个要点需要指出:

1.所有这些不同的单词都有一条直的红色列。 它们在这个维度上是相似的(虽然我们不知道每个维度是什么)

2.你可以看到”woman”和”girl”在很多地方是相似的,”man”和”boy”也是一样

3.”boy”和”girl”也有彼此相似的地方,但这些地方却与”woman”或”man”不同。这些是否可以总结出一个模糊的”youth”概念?可能吧。

4.除了最后一个单词,所有单词都是代表人。 我添加了一个对象”water”来显示类别之间的差异。你可以看到蓝色列一直向下并在 “water”的词嵌入之前停下了。

5.”king”和”queen”彼此之间相似,但它们与其它单词都不同。这些是否可以总结出一个模糊的”royalty”概念?

展现嵌入奇妙属性的著名例子是类比。我们可以添加、减去词嵌入并得到有趣的结果。一个著名例子是公式:”king”-“man”+”woman”:

Tensorflow (5) Word2Vec

在python中使用Gensim库,我们可以添加和减去词向量,它会找到与结果向量最相似的单词。该图像显示了最相似的单词列表,每个单词都具有余弦相似性。

Tensorflow (5) Word2Vec

由”king-man + woman”生成的向量并不完全等同于”queen”,但”queen”是我们在此集合中包含的400,000个字嵌入中最接近它的单词。

3、语言模型

Tensorflow (5) Word2Vec

自然语言模型的输出是模型已知单词的概率得分,我们通常将概率表示为百分比,但实际上,40%的得分在输出向量组中表示为0.4。

[En]

The output of the natural language model is the probability score of the words known to the model, and we usually express the probability as a percentage, but in fact, a score of 40% is expressed as 0.4 in the output vector group.

自然语言模型(请参考Bengio 2003)在完成训练后,会按如下中所示法人三步完成预测:

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

4、 语言模型训练

通过查找每个单词附近经常出现的单词,可以获得它们的映射。其机制如下:

[En]

By looking for the words that often appear near each word, their mapping can be obtained. The mechanism is as follows:

1.先是获取大量文本数据(例如所有维基百科内容)

  1. 然后我们建立一个可以沿文本滑动的窗(例如一个窗里包含三个单词)

  2. 利用这样的滑动窗就能为训练模型生成大量样本数据。

Tensorflow (5) Word2Vec

当这个窗口沿着文本滑动时,我们可以(真正地)生成用于模型训练的数据集。

[En]

When this window slides along the text, we can (truly) generate a dataset for model training.

Tensorflow (5) Word2Vec

5、 Skipgram模型

我们不仅要考虑目标词的前两个词,还要考虑后面的两个词。

[En]

We should consider not only the first two words of the target word, but also the next two words.

Tensorflow (5) Word2Vec

如果我们这样做,我们实际构建和训练的模型如下:

[En]

If we do this, the model we actually build and train is as follows:

Tensorflow (5) Word2Vec

上述的这种 架构被称为连续词袋(CBOW)

另一种体系结构,它不根据前面和后面的文本(单词之前和之后)猜测目标单词,但推测当前单词之前和之后的可能单词。假设训练数据中的滑动窗口如下图所示:

[En]

Another architecture, which does not guess the target word based on the preceding and following text (before and after the word), but * speculates the possible word before and after the current word. Let’s imagine that the sliding window in the training data is shown in the following figure:*

Tensorflow (5) Word2Vec

绿色方框中的单词是输入单词,而粉红色方框是可能的输出。

[En]

The words in the green box are the input words, while the pink box is the possible output.

粉红色框的颜色深度在这里是不同的,因为滑动窗口为训练集生成了四个单独的样本:

[En]

The color depth of the pink box is different here because the sliding window produces four separate samples for the training set:

Tensorflow (5) Word2Vec

这种 方式称为Skipgram架构。我们可以像下图这样将展示滑动窗的内容。

这样就为数据集提供了4个样本:

Tensorflow (5) Word2Vec

然后,我们将滑动窗口移动到下一个位置,因此我们生成以下四个示例:

[En]

Then we move the sliding window to the next location, so we produce the next four samples:

Tensorflow (5) Word2Vec

移动几组仓位后,我们可以得到一批样品:

[En]

After moving several sets of positions, we can get a batch of samples:

Tensorflow (5) Word2Vec

6、模型训练过程

目的:如何利用它来训练能够预测邻接词的自然语言模型。

[En]

Objective: how to use it to train a natural language model that can predict adjacent words.

已有前面获得的Skipgram模型的训练数据集,即:

Tensorflow (5) Word2Vec

从数据集中的第一个样本开始。我们将特征输入到一个未训练的模型中,并要求它预测可能的相邻单词。

[En]

Start with the first sample in the dataset. We input features into an untrained model and ask it to predict a possible adjacent word.

Tensorflow (5) Word2Vec

该模型执行三个步骤并输入预测向量(对应于词汇中每个单词的概率)。因为模型没有经过训练,所以这个阶段的预测肯定是错误的。但没关系,我们已经知道它应该是哪个单词–这个单词是我训练集数据中的输出标记:

[En]

The model performs three steps and enters a prediction vector (corresponding to the probability of each word in the vocabulary). Because the model is untrained, the prediction at this stage must be wrong. But it doesn’t matter, we already know which word it should be– this word is the output tag in my training set data:

Tensorflow (5) Word2Vec

目标单词概率为1,其他所有单词概率为0,这样数值组成的向量就是” 目标向量“。

模型的偏差是多少?将这两个向量相减,得到偏差向量:

[En]

What is the deviation of the model? Subtract the two vectors and you get the deviation vector:

Tensorflow (5) Word2Vec

现在这一 误差向量可以被用于更新模型了,所以在下一轮预测中,如果用not作为输入,我们更有可能得到thou作为输出了。

Tensorflow (5) Word2Vec

7、模型切换与负样例

更改预测相邻单词的任务:

[En]

Change the task of predicting adjacent words:

Tensorflow (5) Word2Vec

将其切换到一个提取 输入与输出单词的模型,并输出一个表明它们是否是邻居的分数(0表示”不是邻居”,1表示”邻居”)。

Tensorflow (5) Word2Vec

这一简单的转换将我们需要的模型从神经网络更改为逻辑回归模型-因此它变得更简单、更快。

[En]

This simple transformation changes the model we need from a neural network to a * logical regression model -so it becomes simpler and faster.*

这需要我们切换数据集的结构-标记值现在是一个值为0或1的新列。它们都将是1,因为我们添加的所有单词都是相邻的。

[En]

This requires us to switch the structure of the dataset-the tag value is now a new column with a value of 0 or 1. They will all be 1 because all the words we add are neighbors.

Tensorflow (5) Word2Vec

现在的计算速度令人惊叹–几分钟内就可以处理数百万个例子。但我们仍然需要修补一个漏洞。如果所有的例子都是邻居(目标:1),我们的“天才模型”可能会被训练成永远返回1种颜色–100%准确,但它只会学到垃圾邮件嵌入的结果。

[En]

The computing speed is amazing now-millions of examples can be processed in a few minutes. But we still need to fix a loophole. If all the examples are neighbors (goal: 1), our “genius model” may be trained to return 1 color forever-100% accurate, but it learns nothing but spam embedding results.

Tensorflow (5) Word2Vec

为了解决这个问题,我们需要将负样本引入数据集–不是邻居的单词样本。我们的模型需要为这些样本返回0。这款车型必须努力解决这一挑战,而且必须保持高速运行。

[En]

To solve this problem, we need to introduce negative samples into the dataset-word samples that are not neighbors. Our model needs to return 0 for these samples. The model must try to solve this challenge-and it must still be kept at high speed.

Tensorflow (5) Word2Vec

对于数据集中的每个样本,我们都添加了一个反例。它们具有相同的输入词,标签为0。

[En]

For each sample in our dataset, we added a negative example. They have the same input words with a label of 0.

但是,我们应该填写什么作为输出单词呢?我们从词汇表中随机挑选单词

[En]

But what do we fill in as output words? We randomly pick words from the vocabulary

Tensorflow (5) Word2Vec

这个想法的灵感来自于噪音比较估计。我们将实际信号(相邻单词的正例)与噪声(随机选择的非邻近单词)进行比较。这导致了计算效率和统计效率之间的巨大折衷。

[En]

The idea is inspired by noise comparison estimates. We compare the actual signal (a positive example of a neighboring word) with noise (a randomly selected word that is not a neighbor). This leads to a great compromise between computational and statistical efficiency.

我们现在已经介绍了word2vec中的两个(一对)核心思想: 负例采样,以及skipgram

Tensorflow (5) Word2Vec

8、 Word2vec训练流程

(1)预先处理训练模型的文本,确定词典的大小(我们称之为vocab_size,比如说10,000)以及哪些词被它包含在内。

(2)在训练阶段的开始,我们创建两个矩阵—— Embedding矩阵 和Context矩阵。两个矩阵由单词表中每个单词的 嵌入(Embedding)组成,所以这两个二维矩阵的一个维度是vocab_size,另一个维度嵌入 Embedding的长度(embedding_size——300是一个常见值,但我们在前文也看过50的例子)。

Tensorflow (5) Word2Vec

在训练过程开始时,我们用随机值初始化这些矩阵。然后我们开始训练过程。在每个训练步骤中,我们取一个相邻示例及其相关的非相邻示例。让我们来看看我们的第一名

[En]

At the beginning of the training process, we initialize these matrices with random values. Then we begin the training process. In each training step, we take an adjacent example and its related non-adjacent example. Let’s take a look at our number one

组:

Tensorflow (5) Word2Vec

现在我们有四个单词: 输入单词not和输出/上下文(context)单词: thou(实际邻居词), aarontaco(负样本)。对于输入词,我们检索Embedding矩阵中对应的Embedding。对于上下文单词,我们查看Context矩阵矩阵中对应的Embedding(两个矩阵都在我们的词汇表中都有每个单词的嵌入)。

Tensorflow (5) Word2Vec

然后,我们计算输入 嵌入Embedding与每个Context上下文 嵌入的点积。在每种情况下,点乘结果表示输入和上下文嵌入的相似性度。

Tensorflow (5) Word2Vec

现在我们需要一种方法将这些分数转化为看起来像概率的东西——我们需要它们都是正值,并且 处于0到1之间。sigmoid这一逻辑函数转换正适合用来做这样的事情啦。

Tensorflow (5) Word2Vec

现在我们可以将sigmoid的输出视为模型输出。可以看到 taco得分最高, aaron最低。

未经训练的模型已做出预测,我们目标真实标签作对比,计算模型预测中的误差。只需从目标标签中减去sigmoid分数。

Tensorflow (5) Word2Vec

error = target – sigmoid_scores

这就是”机器学习”的”学习”部分。现在,我们可以利用这个误差数来调整 not, thou, aaron, and taco的Embedding,这样我们下一次做出预测计算时,结果会更接近实际目标值。

Tensorflow (5) Word2Vec

训练步骤到此结束。我们从中得到了这一步所使用词语更优一些的嵌入( not, thou, aaron, and taco)。我们现在进行下一步(下一个正样本及其相关的负样本),并再次执行相同的过程。当我们循环遍历整个数据集多次时,嵌入会继续得到改进。然后我们就可以停止训练过程,丢弃Context矩阵,并使用Embeddings矩阵作为下一项任务的已被训练好的嵌入。

1. 背景知识

Word2Vec是语言模型中的一种,它是从大量文本预料中以无监督方式学习语义知识的模型,被广泛地应用于自然语言处理中。

1.1 统计语言模型

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

p(W)被称为语言模型,即用来计算这个句子概率的模型。利用Bayes公式,上式可以被链式地分解为:

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

这些参数如何计算呢?常见的方法有n-gram模型、决策树、最大熵模型、最大熵马尔可夫模型、条件随机场、神经网络等方法.

1.2 N-gram模型

Tensorflow (5) Word2Vec

从公式(1)可以看出:一个词出现的概率与它前面的所有词都相关。如果假定一个词出现的概率只与它前面固定数目的词相关呢?这就是n-gram模型的基本思想,它做了一个n-1阶的Markov假设,认为一个词出现的概率就只与它前面的n-1个词相关,即,

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

那么,n-gram中的参数n取多大比较合适呢?一般来说,n的选取需要同时考虑计算复杂度和模型效果两个因素。

Tensorflow (5) Word2Vec

在机器学习领域,解决这一问题的一般方法是:在对问题建模后,构造一个目标函数,然后对目标函数进行优化,得到一组最优参数。最后,用这组最优参数所对应的模型进行预测。

[En]

There is a general method to solve the problem in the field of machine learning: after modeling the problem, an objective function is constructed, and then the objective function is optimized to obtain a set of optimal parameters. finally, the model corresponding to this set of optimal parameters is used to predict.

对于统计语言模型,使用最大似然法,目标函数可以设置为:

[En]

For statistical language models, using maximum likelihood, the objective function can be set to:

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

1.3 神经概率语言模型

Tensorflow (5) Word2Vec

模型一共三层,第一层是映射层,将n个单词映射为对应word embeddings的拼接,其实这一层就是MLP的输入层;第二层是隐藏层,激活函数用tanh;第三层是输出层,因为是语言模型,需要根据前n个单词预测下一个单词,所以是一个多分类器,用Softmax。整个模型最大的计算量集中在最后一层上,因为一般来说词汇表都很大,需要计算每个单词的条件概率,是整个模型的计算瓶颈。

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec
Tensorflow (5) Word2Vec

这里,需要注意的是需要提前初始化一个word embedding矩阵,每一行表示一个单词的向量。词向量也是训练参数,在每次训练中进行更新。

Softmax是一个非常低效的处理方式,需要先计算每个单词的概率,并且还要计算指数,指数在计算机中都是用级数来近似的,计算复杂度很高,最后再做归一化处理。此后很多研究都针对这个问题进行了优化,比如层级softmax、softmax tree

与n-gram模型相比,神经概率语言模型有什么优势呢?主要有以下两点:

  • *词语之间的相似性可以通过词向量来体现。

例如,如果一个(英语)语料库

[En]

For example, if a (English) corpus

Tensorflow (5) Word2Vec
Tensorflow (5) Word2VecTensorflow (5) Word2Vec 应该很接近才对。

事实上,由神经概率语言模型算得的

Tensorflow (5) Word2VecTensorflow (5) Word2Vec 是大致相等的。原因在于:(1)在神经概率语言模型中假定了”相似的”的词对应的词向量也是相似的;(2)概率函数关于词向量是光滑的,即词向量中的一个小变化对概率的影响也只是一个小变化。这样一来,对于下面这些句子, 只要在语料库中出现一个,其他句子的概率也会相应的增大。

A dog is running in the room
A cat is running in the room
The cat is running in a room
A dog is walking in a bedroom
The dog was walking in the room

Tensorflow (5) Word2Vec

最后,回过头来看,单词向量在整个神经概率语言模型中扮演着什么角色?在训练过程中,它是帮助构建目标函数的辅助参数,在训练完成后,它似乎是语言模型的副产品。但这一副产品不应被低估,这将在下一节进一步阐述。

[En]

Finally, in retrospect, what role does word vector play in the whole neural probabilistic language model? During training, it is an auxiliary parameter to help construct the objective function, and after the training is completed, it seems to be a by-product of the language model. But this by-product should not be underestimated, which will be further elaborated in the next section.

2. 词向量

在与自然语言处理相关的任务中,通常需要将语言数学化为机器学习中的算法,因为机器不是人,机器只识别数学符号。向量是人从自然抽象到机器去处理的东西,基本上可以说向量是人向机器输入的主要方式。

[En]

In the tasks related to natural language processing, it is usually necessary to mathematize the language to the algorithms in machine learning, because the machine is not a human being, and the machine only recognizes mathematical symbols. Vector is what people abstract from nature to the machine to deal with, basically it can be said that the vector is the main way for people to input to the machine.

词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量就是把一个词表示成一个向量。 我们都知道词在送到神经网络训练之前需要将其编码成数值变量,常见的编码方式有两种:One-Hot Representation 和 Distributed Representation。

2.1 One-Hot Representation

一种最简单的词向量方式是One-Hot编码 ,就是用一个很长的向量来表示一个词,向量的长度为词典的大小,向量中只有一个 1 , 其他全为 0 ,1 的位置对应该词在词典中的位置。

举个例子:I like writing code,那么转换成独热编码就是:

词One-Hot 编码

I like writing code

1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1

这种One Hot编码如果采用稀疏方式存储,会是非常的简洁:也就是给每个 词分配一个数字 ID 。比如上面的例子中,code记为 1 ,like记为 4 。 如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配 合上最大熵、 SVM 、 CRF 等等算法已经能很好地完成 NLP 领域的各种主流任务。

但这个词有两个缺点:

[En]

But the word indicates two drawbacks:

(1)容易受维数灾难的困扰,尤其是将其用于 Deep Learning的一些算法时;

( 2 )词汇鸿沟,不能很好地刻画词与词之间的相似性;

(3)强稀疏性;

由于One-hot编码存在以上种种问题,所以研究者就会寻求发展,用另外的方式表示,就是Distributed Representation

2.2 Distributed Representation

Distributed Representation基本想法是:通过训练将某种语言中的每一个 映射成一个固定长度的 短向量(当然这里的”短”是相对于One-Hot Representation的”长”而言的),所有这些向量构成一个 词向量空间,而每一个向量则可视为 该空间中的一个 ,在这个空间上 引入”距离“,就可以根据词之间的距离来判断它们之间的 语法、语义上的相似性了。Word2Vec中采用的就是这种Distributed Representation 的词向量。

如何获取词向量呢?有很多不同模型可以用来估计词向量,包括有名的LSA(Latent Semantic Analysis)和LDA(Latent Dirichlet Allocation)。此外,利用神经 网络算法也是一种常用的方法,上一节介绍的神经概率语言模型就是一个很好的实例。当然,在那个模型中,目标是生成语言模型,词向量只是一个副产品。事实上, 大部分情况下,词向量和语言模型都是捆绑在一起的,训练完成后两者同时得到。在用神经网络训练语言模型方面,最经典的论文就是Bengio于2003年发表的《A Neural Probabilistic Language Model》 ,其后有一系列相关的研究工作,其中也包括谷歌Tomas Mikolov团队的Word2Vec。

3. Word2Vec的网络结构

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

3.1 CBOW

3.1.1 Simple CBOW Model

为了更好的了解模型深处的原理,我们先从 Simple CBOW model(仅输入一个词,输出一个词)框架说起。

Tensorflow (5) Word2Vec

如上图所示:

Tensorflow (5) Word2Vec
* 输入层到隐藏层之间有一个 权重矩阵W,隐藏层得到的值是由 输入X乘上 权重矩阵得到的(细心的人会发现,0-1向量乘上一个矩阵,就相当于选择了权重矩阵的某一行,如图:输入的向量X是[0,0,1,0,0,0],W的转置乘上X就相当于从矩阵中选择第3行[2,1,3]作为隐藏层的值);
* 隐藏层到输出层也有一个权重矩阵W’,因此,输出层向量y的每一个值,其实就是 隐藏层的向量点乘 权重向量W’的每一列,比如输出层的第一个数7,就是 隐藏层向量[2,1,3]和 权重向量列向量[1,2,1]点乘之后的结果;
* 最终的输出需要经过softmax函数,将输出向量中的每一个元素归一化到0-1之间的概率,概率最大的,就是预测的词。

了解了Simple CBOW model的模型框架之后,我们来学习一下其目标函数。

Tensorflow (5) Word2Vec

输出层通过softmax归一化,u代表的是输出层的原始结果。通过下面公式,我们的目标函数可以转化为现在这个形式

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

3.1.2 CBOW Multi-Word Context Model

了解了Simple CBOW model之后,扩展到CBOW就很容易了,只是把单个输入换成多个输入罢了(划红线部分)。

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

3.2 Skip-gram Model

有了CBOW的介绍,对于Skip-gram model 的理解应该会更快一些。

Tensorflow (5) Word2Vec

如上图所示,Skip-gram model是通过 输入一个词去预测多个词的概率。输入层到隐藏层的原理和simple CBOW一样,不同的是隐藏层到输出层,损失函数变成了C个词损失函数的总和,权重矩阵W’还是共享的。

一般神经网络语言模型在预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。不同于其他神经网络,Word2Vec提出两种加快训练速度的方式,一种是 Hierarchical softmax,另一种是 Negative Sampling

4. 基于Hierarchical Softmax的模型

基于层次Softmax的模型主要包括输入层、投影层(隐藏层)和输出层,非常的类似神经网络结构。对于Word2Vec中基于层次Softmax的CBOW模型,我们需要最终优化的目标函数是 :

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

4.1 基于Hierarchical Softmax的CBOW

4.1.1 CBOW模型网络结构

下图给出了基于层次Softmax的CBOW的整体结构,首先它包括输入层、投影层和输出层:

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

初步了解:霍夫曼编码,如图:

[En]

Preliminary knowledge: Huffman coding, as shown in the figure:

Tensorflow (5) Word2Vec

哈夫曼树

Tensorflow (5) Word2Vec

哈夫曼编码

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

word2vec hierarchical softmax结构

和传统的神经网络输出不同的是,word2vec的hierarchical softmax结构是把输出层改成了一颗哈夫曼树,其中图中白色的叶子节点表示词汇表中所有的|V|个词,黑色节点表示非叶子节点,每一个叶子节点也就是每一个单词,都对应唯一的一条从root节点出发的路径。我们的目的是使的w=wO这条路径的概率最大,即: P(w=wO|wI)最大,假设最后输出的条件概率是W2最大,那么我只需要去更新从根结点到w2这一个叶子结点的路径上面节点的向量即可,而不需要更新所有的词的出现概率,这样大大的缩小了模型训练更新的时间。

我们应该如何获得某个叶节点的概率?

[En]

How should we get the probability of a certain leaf node?

Tensorflow (5) Word2Vec

假设我们要计算W2叶子节点的概率,我们需要从根节点到叶子结点计算概率的乘积。我们知道,本模型替代的只是原始模型的softmax层,因此,某个非叶子节点的值即隐藏层到输出层的结果仍然是uj,我们对这个结果进行sigmoid之后,得到节点往左子树走的概率p,1-p则为往右子树走的概率。关于这棵树的训练方式比较复杂,但也是通过梯度下降等方法,这里不详述,感兴趣的可以阅读论文 word2vec Parameter Learning Explained

详细理论公式推导参见:深入浅出Word2Vec原理解析 – 知乎

4.2 基于Hierarchical Softmax的Skip-gram

本小节介绍Word2Vec中的另一个模型-Skip-gram模型,由于推导过程与CBOW大同小异,因此会沿用上小节引入的记号。

4.2.1 Skip-gram模型网络结构

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec

Tensorflow (5) Word2Vec
Tensorflow (5) Word2Vec
* 输出层:和CBOW模型一样,输出层也是一颗Huffman树。

5. 基于Negative Sampling的模型

详细理论公式推导参见:深入浅出Word2Vec原理解析 – 知乎

传统神经网络在训练过程中的每一步都需要计算当前语境下词库中其他词的概率值,计算量巨大。

[En]

At every step of the training process of the traditional neural network, it is necessary to calculate the probability values of other words in the thesaurus in the current context, which leads to a huge amount of computation.

Tensorflow (5) Word2Vec

然而,对于word2vec中的特征学习,可以不需要一个完整的概率模型。CBOW和Skip-Gram模型在输出端使用的是一个 二分类器(即Logistic Regression),来区分 目标词和词库中其他的 k个词(也就是把目标词作为一类,其他词作为另一类)。下面是一个CBOW模型的图示,对于Skip-Gram模型输入输出是倒置的。

Tensorflow (5) Word2Vec

此时,最大化的目标函数如下:

[En]

At this point, the objective function of maximization is as follows:

Tensorflow (5) Word2Vec

其中,Qθ(D=1|w,h)为 二元逻辑回归的概率,具体为在数据集 D中、输入的embedding vector θ、上下文为 h的情况下词语 w 出现的概率;公式后半部分为 k 个从 [噪声数据集] 中随机选择 kk个对立的词语出现概率(log形式)的期望值。可以看出,目标函数的意义是显然的,即尽可能的 [分配(assign)] 高概率给真实的目标词,而低概率给其他 k 个 [噪声词],这种技术称为 负采样(Negative Sampling)

这种想法来源于 噪声对比评估方法(NEC),大致思想是:假设X=(x1,x2,⋯,xTd)是从真实的数据(或语料库)中抽取样本,但是样本服从什么样的分布我们不知道,那么先假设其中的每个xi服从一个未知的概率密度函数pd。这样我们需要一个相对可参考的分布反过来去估计概率密度函数pd,这个可参考的分布或称之为噪音分布应该是我们知道的,比如高斯分布,均匀分布等。假设这个噪音分布的概率密度函数pn,从中抽取样本数据为Y=(y1,y2,⋯,yTn)Y=(y1,y2,⋯,yTn),而这个数据称之为噪声样本,我们的目的就是通过学习一个分类器把这两类样本区别开来,并能从模型中学到数据的属性,噪音对比估计的思想就是”通过比较而学习”。

具体来说,word2vec里面的负采样:将输出层的V个样本分为正例(Positive Sample)也就是目标词对应的项,以及剩余V−1个负例(Negative Samples)。举个例子有个样本phone
number,这样wI=phone,wO=number, 正例就是number这个词,负例就是不太可能与phone共同出现的词。负采样的思想是每次训练只随机取一小部分的负例使他们的概率最小,以及对应的正例概率最大。随机采样需要假定一个概率分布,word2vec中直接使用词频作为词的分布,不同的是频数上乘上0.75,相比于直接使用频次作为权重,取0.75幂的好处可以减弱不同频次差异过大带来的影响,使得小频次的单词被采样的概率变大。

Tensorflow (5) Word2Vec

采样权重

负抽样定义的损失函数如下:

[En]

The loss function defined by negative sampling is as follows:

Tensorflow (5) Word2Vec

损失函数,一部分是正样本(期望输出的词),另一部分是负采样随机抽取出来的负样本集合,V’wo是输出向量

如果大家理解的还不是很深的话,接下来将通过谷歌发布的tensorflow官方word2vec代码解析加深理解。代码链接:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py

Original: https://blog.csdn.net/light169/article/details/124035519
Author: light169
Title: Tensorflow (5) Word2Vec

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508595/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球