Word2vec 简介

Word2vec 是一种词嵌入技术,属于自然语言处理(NLP)领域。它的核心目标是将词汇转化为具有可计算性和结构化的向量形式。这种技术由谷歌的 Tomas Mikolov 等人在 2013 年提出,对整个 NLP 领域产生了深远的影响。

技术背景Word2vec 的提出,标志着词嵌入技术的一个重要进步。它通过将词映射为向量,使得计算机能够更好地理解和处理自然语言。

技术特点

  • 可计算性:向量化后的词可以进行数学运算,便于机器学习模型处理。
  • 结构化:词向量能够反映出词与词之间的语义关系。

NLP 中的地位Word2vec 在自然语言处理中占据着重要的位置,它为后续的语义分析、文本分类等任务提供了基础。

应用场景

  • 语义分析:通过词向量理解词义。
  • 文本分类:利用词向量进行文本特征提取。

技术发展Word2vec 的提出促进了词嵌入技术的发展,为后续的模型如 GloVe 和 BERT 等奠定了基础。

总结Word2vec 不仅是一种技术,更是一种思想,它开启了自然语言处理的新篇章,为理解语言的深层含义提供了新的视角。

文本向量化代码java实现 word2vec文本向量化_神经网络

二、词向量(Word Embedding)

  在说明 Word2vec 之前,需要先解释一下 Word Embedding。 它就是将「不可计算」「非结构化」的词转化为「可计算」「结构化」的向量。这一步解决的是“将现实问题转化为数学问题”,是人工智能非常关键的一步。

  自然语言处理(NLP)相关任务中,要将自然语言交给机器学习中的算法来处理,通常需要首先将语言数学化,因为机器不是人,机器只认数学符号。向量是人把自然界的东西抽象出来交给机器处理的东西,基本上可以说向量是人对机器输入的主要方式了。

  词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量就是把一个词表示成一个向量。主要有两种表示方式:One-Hot Representation(独热编码) 和 Distributed Representation

2.1 One-Hot Representation 

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

  “话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ···]

  “麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ···]

  每个词都是茫茫 0 海中的一个 1。

  这种 One-Hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。

  但这种词表示有两个缺点:(1)容易受维数灾难的困扰,尤其是将其用于 Deep Learning 的一些算法时;(2)不能很好地刻画词与词之间的相似性(术语好像叫做“词汇鸿沟”):任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。

  所以会寻求发展,用另外的方式表示,就是下面这种。

2.2 Distributed Representation

  另一种就是Distributed Representation 这种表示,它最早是 Hinton 于 1986 年提出的,可以克服 one-hot representation 的缺点。其基本想法是直接用一个普通的向量表示一个词,这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, ···],也就是普通的向量表示形式。维度以 50 维和 100 维比较常见。

  当然一个词怎么表示成这样的一个向量是要经过一番训练的,训练方法较多,word2vec是其中一种,在后面会提到,这里先说它的意义。还要注意的是每个词在不同的语料库和不同的训练方法下,得到的词向量可能是不一样的。词向量一般维数不高,很少有人闲着没事训练的时候定义一个10000维以上的维数,所以用起来维数灾难的机会相对于One-Hot representation表示就大大减少了。

  由于是用向量表示,而且用较好的训练算法得到的词向量的向量一般是有空间上的意义的,也就是说,将所有这些向量放在一起形成一个词向量空间,而每一向量则为该空间中的一个点,在这个空间上的词向量之间的距离度量也可以表示对应的两个词之间的“距离”。所谓两个词之间的“距离”,就是这两个词之间的语法,语义之间的相似性。

  一个比较爽的应用方法是,得到词向量后,假如对于某个词A,想找出这个词最相似的词,这个场景对人来说都不轻松,毕竟比较主观,但是对于建立好词向量后的情况,对计算机来说,只要拿这个词的词向量跟其他词的词向量一一计算欧式距离或者cos距离,得到距离最小的那个词,就是它最相似的。这样的特性使得词向量很有意义,自然就会吸引比较多的人去研究,前有Bengio发表在JMLR上的论文《A Neural Probabilistic Language Model》,又有Hinton的层次化Log-Bilinear模型,还有google的TomasMikolov 团队搞的word2vec,等等。词向量在机器翻译领域的一个应用,就是google的TomasMikolov 团队开发了一种词典和术语表的自动生成技术,该技术通过向量空间,把一种语言转变成另一种语言,实验中对英语和西班牙语间的翻译准确率高达90%。

  介绍算法工作原理的时候举了一个例子:考虑英语和西班牙语两种语言,通过训练分别得到它们对应的词向量空间 E 和 S。从英语中取出五个词 one,two,three,four,five,设其在 E 中对应的词向量分别为 v1,v2,v3,v4,v5,为方便作图,利用主成分分析(PCA)降维,得到相应的二维向量 u1,u2,u3,u4,u5,在二维平面上将这五个点描出来,如下图左图所示。类似地,在西班牙语中取出(与 one,two,three,four,five 对应的) uno,dos,tres,cuatro,cinco,设其在 S 中对应的词向量分别为 s1,s2,s3,s4,s5,用 PCA 降维后的二维向量分别为 t1,t2,t3,t4,t5,将它们在二维平面上描出来(可能还需作适当的旋转),如下图右图所示:

文本向量化代码java实现 word2vec文本向量化_文本向量化代码java实现_02

词向量空间的相似性分析

在对比左右两幅图时,我们可以明显观察到五个词在两个不同的向量空间中保持了相似的相对位置。这一现象揭示了不同语言的向量空间结构之间存在一定的相似性。这种相似性进一步验证了使用词向量空间中的距离来衡量词与词之间相似性的方法的合理性。

word2vec模型简介

word2vec是一个简化版的神经网络语言模型。在训练过程中,我们主要关注的是模型中第一个隐含层的参数权重。这些权重构成了我们所需的词向量。具体来说:

  1. 模型结构:word2vec模型由输入层、隐含层和输出层组成。
  2. 训练目标:在训练过程中,我们的目标是优化神经网络的语言模型,以提高其预测下一个词的准确性。
  3. 词向量获取:训练完成后,我们提取隐含层的参数矩阵,这些参数即为词向量,它们能够捕捉词与词之间的语义关系。 通过word2vec模型,我们能够将词汇转换为向量形式,进而在向量空间中进行各种语义分析和计算。
    文本向量化代码java实现 word2vec文本向量化_文本向量化代码java实现_03
    在自然语言处理中,One-Hot Vector是一种常见的数据表示方法,它将词表中的每个词映射为一个二进制向量,其中只有一个元素为1,其余元素为0。这种表示方法虽然简单,但存在维度高和语义信息损失的问题。为了解决这些问题,引入了词嵌入技术,通过训练神经网络模型来学习词的向量表示。

神经网络模型结构

模型通常由输入层、隐层和输出层组成。在这个特定场景中,输入层使用的是One-Hot Vector,隐层没有激活函数,即采用了线性单元。输出层的维度与输入层相同,并且使用Softmax回归进行输出。训练完成后,我们关注的是模型学习到的参数,尤其是隐层的权重矩阵,这些参数可以用于后续任务。

数据输入与输出定义

定义模型的输入和输出通常有两种方式:CBOW(Continuous Bag-of-Words)和Skip-Gram。

  • CBOW模型:其训练输入是某一个特征词的上下文相关的词的词向量,而输出是这个特定词的词向量。CBOW模型适用于小型数据库,因为它可以快速捕捉上下文信息。

  • Skip-Gram模型:与CBOW相反,Skip-Gram模型的输入是特定词的词向量,输出是该词对应的上下文词向量。Skip-Gram在处理大型语料时表现更佳,因为它可以更细致地学习词与上下文的关系。 这两种模型各有优势,选择哪一种取决于具体的应用场景和数据规模。
    文本向量化代码java实现 word2vec文本向量化_神经网络_04

CBOW模型

文本向量化代码java实现 word2vec文本向量化_词向量_05

Skip-Gram模型

3.1 CBOW(Continuous Bag-of-Words)

  CBOW通过上下文来预测当前值。相当于一句话中扣掉一个词,让你猜这个词是什么。

文本向量化代码java实现 word2vec文本向量化_词向量_06

  CBOW的训练模型如下图所示:

文本向量化代码java实现 word2vec文本向量化_词向量_07
在自然语言处理中,词嵌入(word embedding)是一种将单词转换为向量的技术。以下是实现词嵌入的步骤,使用one hot编码和神经网络方法进行描述:

  1. 输入层处理:首先,将上下文单词转换为one hot编码。假设单词向量空间的维度为V,上下文单词的个数为C。

  2. 权重矩阵应用:每个one hot编码的单词向量乘以一个共享的输入权重矩阵W。这个矩阵是一个V×N的矩阵,其中N是我们设定的数值,用于初始化权重矩阵W。

  3. 求平均向量:将所有乘以权重矩阵后的向量相加,然后求平均,得到隐层向量,其大小为1×N。

  4. 输出层处理:将隐层向量乘以输出权重矩阵W’,这个矩阵的大小为N×V。

  5. 激活函数处理:通过激活函数处理得到的向量,将其转换为一个V维的概率分布。在这里,每个维度代表一个单词的概率。

  6. 预测与误差计算:选择概率最高的索引所指示的单词作为预测的中间词,并与真实标签的one hot编码进行比较。误差越小,模型的预测效果越好。

  7. 损失函数与优化:定义损失函数,通常使用交叉熵损失函数。通过梯度下降算法来更新权重矩阵W和W’。

  8. 词向量的获取:训练完成后,输入层的每个单词与权重矩阵W相乘得到的向量即为词向量。所有单词的词向量组成的矩阵称为查找表(look up table),实际上就是权重矩阵W本身。

  9. 快速查表:有了查找表后,可以免去训练过程,直接通过查表得到单词的词向量。 例如,如果我们有一个上下文,我们可以通过上述步骤来获得每个单词的词向量,并用这些词向量来进行进一步的自然语言处理任务。
    文本向量化代码java实现 word2vec文本向量化_词向量_08

  窗口大小是2,表示选取coffe前面两个单词和后面两个单词,作为input词。

文本向量化代码java实现 word2vec文本向量化_文本向量化代码java实现_09
在自然语言处理中,word embedding是一种将词汇映射到高维空间的向量表示技术。以下是关于word embedding生成过程的描述,特别是Skip-Gram模型的工作原理:

  1. Word Embedding的生成
  • 给定一个概率分布,通过迭代训练,我们可以得到一个矩阵W,称为查找表(Look-Up Table,LUT)。
  • 每个单词通过其one-hot编码与矩阵W相乘,得到对应的word embedding向量。
  1. Skip-Gram模型的直观理解
  • Skip-Gram模型的核心思想是使用当前词来预测其上下文。
  • 这可以类比为给定一个词,模型需要猜测它前后可能出现的词汇。
  1. Skip-Gram模型的工作流程
  • 模型接受一个中心词,并尝试预测其周围的词作为上下文。
  • 通过这种方式,模型学习到单词之间的关联性,从而生成能够捕捉语义信息的词向量。
  1. 迭代训练的过程
  • 训练过程通常需要设定一个迭代次数,以确保模型收敛到稳定状态。
  • 每次迭代中,模型都会根据当前的参数更新矩阵W,以减少预测误差。
  1. One-Hot编码
  • One-Hot编码是一种将单词表示为二进制向量的方法,其中只有一个元素为1,其余为0。
  • 这种编码方式便于与矩阵W进行矩阵乘法操作,从而得到word embedding。
  1. Word Embedding的应用
  • 生成的word embedding可以用于多种自然语言处理任务,如文本分类、情感分析、机器翻译等。 通过上述步骤,我们可以得到一个训练有素的word embedding模型,它能够将单词映射到一个能够捕捉其语义信息的向量空间。
    文本向量化代码java实现 word2vec文本向量化_神经网络_10

神经网络训练方法概述

1. 输入词的选择在句子 ‘The dog barked at the mailman’ 中,我们选择 ‘dog’ 作为输入词(input word)。

2. 定义 Skip-Window设置 skip_window=2,表示从输入词的两侧各选取2个词作为窗口内容。因此,窗口中的词为 [‘The’, ‘dog’, ‘barked’, ‘at’],窗口大小为 span=4

3. 确定 Num-Skipsnum_skips 表示从窗口中选取多少个不同的词作为输出词(output word)。当 skip_window=2num_skips=2 时,我们得到两组训练数据:(‘dog’, ‘barked’) 和 (‘dog’, ’the’)。

4. 神经网络输出神经网络基于训练数据输出概率分布,表示词典中每个词作为输出词的可能性。

4.1 概率分布示例以 (‘dog’, ‘barked’) 为例,模型学习后会输出词汇表中每个词是 ‘barked’ 的概率。

4.2 相关词概率输入词 ‘中国’ 时,模型输出的概率中,相关词如 ‘英国’、‘俄罗斯’ 的概率将高于非相关词如 ‘苹果’、‘蝈蝈’。

5. 训练样本示例以句子 ‘The quick brown fox jumps over lazy dog’ 为例,设置窗口大小为2(window_size=2),选取输入词前后各两个词作为训练样本。

5.1 训练样本展示

  • 输入词:quick
  • 窗口内容:[‘The’, ‘quick’, ‘brown’, ‘fox’]
  • 训练样本:(‘quick’, ‘The’),(‘quick’, ‘brown’)

5.2 可视化展示下图中,蓝色代表输入词,方框内代表窗口内的词。

训练样本图示

结论通过输入文本中成对的单词,神经网络学习并完成概率计算,从而理解词与词之间的关联性。

文本向量化代码java实现 word2vec文本向量化_文本向量化代码java实现_11

   我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“中国“,”英国“)这样的训练样本对,而对于(”英国“,”蝈蝈“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”中国“作为输入,输出的结果中”英国“或者”俄罗斯“要比”蝈蝈“被赋予更高的概率。

  再次提醒,最终我们需要的是训练出来的权重矩阵

四、训练注意事项

  我们发现Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。举个栗子,我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 = 300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难(太凶残了)。

  为了降低复杂度,Word2Vec使用了Hierarchical Softmax和Negative Sampling两种求解策略。普遍认为Hierarchical Softmax对低频词效果较好;Negative Sampling对高频词效果较好,向量维度较低时效果更好。

1、负采样(negative sampling)
负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。

  在训练神经网络时,每当接受一个训练样本,然后调整所有神经单元权重参数,来使神经网络预测更加准确。换句话说,每个训练样本都将会调整所有神经网络中的参数。
我们词汇表的大小决定了我们skip-gram 神经网络将会有一个非常大的权重参数,并且所有的权重参数会随着数十亿训练样本不断调整。

  negative sampling 每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。如果 vocabulary 大小为1万时, 当输入样本 ( “fox”, “quick”) 到神经网络时, “ fox” 经过 one-hot 编码,在输出层我们期望对应 “quick” 单词的那个神经元结点输出 1,其余 9999 个都应该输出 0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们为 negative word. negative sampling 的想法也很直接 ,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。

  对于小规模数据集,建议选择 5-20 个 negative words,对于大规模数据集选择 2-5个 negative words.

  如果使用了 negative sampling 仅仅去更新positive word- “quick” 和选择的其他 10 个negative words 的结点对应的权重,共计 11 个输出神经元,相当于每次只更新 300 x 11 = 3300 个权重参数。对于 3百万 的权重来说,相当于只计算了千分之一的权重,这样计算效率就大幅度提高。

2、层序softmax(hierarchical softmax)

W个输出结点,而只需要评估大约log2(W)个结点。层次Softmax使用一种二叉树结构来表示词典里的所有词,V个词都是二叉树的叶子结点,而这棵树一共有V−1个非叶子结点。

  对于每个叶子结点(词),总有一条从根结点出发到该结点的唯一路径。这个路径很重要,因为要靠它来估算这个词出现的概率。以下图为例(图来自Xin Rong,2014[6]),白色结点为词典中的词,深色是非叶子结点。图中画出了从根结点到词w2的唯一路径,路径长度L(w2)=4,而n(w,j)表示从根结点到词w2的路径上的的第j个结点。

在层次Softmax模型中,叶子节点的词没有直接输出的向量,而非叶子节点其实都有响应的输出向量。

  softmax需要对每个词语都计算输出概率,并进行归一化,计算量很大;进行softmax的目的是多分类,那么是否可以转成多个二分类问题呢, 如SVM思想? 从而引入了层次softmax

文本向量化代码java实现 word2vec文本向量化_权重_12

Word2vec 简介及应用

什么是 Word2vec?

Word2vec 是一种词嵌入(Word Embedding)技术,由谷歌的 Mikolov 于 2013 年提出。它的核心思想是将词汇映射为向量,使得语义上相近的词在向量空间中的距离也相近。Word2vec 在自然语言处理(NLP)领域有着广泛的应用。

Word2vec 的优势

  1. 编码效率:采用霍夫曼编码(Huffman Coding)对词进行编码,提高了编码效率。
  2. 问题简化:将词的多分类问题转化为多个二分类问题,每个预测问题通过逻辑回归方法解决。
  3. 函数特性:在二分类问题中,使用 Sigmoid 函数作为激活函数,其导数具有良好的性质,便于优化。
  4. 优化算法:采用随机梯度上升(Stochastic Gradient Ascent)方法进行优化,每次迭代更新一次误差函数。

Word2vec 的模型

Word2vec 主要包含两种模型:

  • CBOW(Continuous Bag-of-Words Model):通过上下文预测当前词。
  • Skip-gram(Continuous Skip-gram Model):用当前词预测上下文。

训练方法

  1. 负采样(Negative Sampling):一种加速训练的方法,通过采样减少计算量。
  2. 层序 Softmax(Hierarchical Softmax):另一种加速方法,通过层次化结构优化计算过程。

总结

Word2vec 作为一种 NLP 工具,能够将词转换为向量形式,定量度量词与词之间的关系,挖掘词之间的联系。它不仅提高了词表示的效率,还简化了词的分类问题,并通过特定的训练方法加快了学习过程。

参考资料