word2vec介绍

word2vec是一种将word转为向量的方法,其包含两种算法,分别是skip-gram和CBOW,它们的最大区别是skip-gram是通过中心词去预测中心词周围的词,而CBOW是通过周围的词去预测中心词。

这个word2vec的方法是在2013年的论文《Efficient Estimation of Word Representations inVector Space》中提出的,作者来自google,文章下载链接:https://arxiv.org/pdf/1301.3781.pdf

在自然语言处理时,通常将词语或者字做向量化,例如one-hot编码,例如我们有一句话为:“我爱北京天安门”,我们分词后对其进行one-hot编码,结果可以是:

“我”: 【1,0,0,0】
“爱”: 【0,1,0,0】
“北京”: 【0,0,1,0】
“天安门”: 【0,0,0,1】

这样,我们就可以将每个词用一个向量表示了。

但是one-hot编码在大量数据情况下会出现维度灾难,one-hot编码中如果词语的个数是n个,则one-hot编码向量维度为1*n,也就是说,任何一个词的one-hot编码中,其中一位是1,其他n-1位是0,这种导致数据非常稀疏,存储开销也很大。
怎么解决这个问题呢
分布式表示被提出来了,
它的思路是通过训练,将每个词都映射到一个较短的词向量像来,这个较短的词向量维度是768,这个需要自己去训练中制定,例如先买呢展示四个不同的单词,可以用一个可变化的维度长度来表示,这些维度数字不是1和0,而是一些其他的浮点数,
word2vec介绍_第1张图片

这种将高位地的词表示转换为低纬度的词表示的方法,我们称之为词嵌入(word embedding)
word2vec介绍_第2张图片
当我们使用词嵌入后,词之间可以存在一些关系,例如:king的词向量减去man的词向量,再加上woman的词向量等于queen的词向量
word2vec介绍_第3张图片
为什么会出现这种表示,我们使用的分布式表示的词向量包含词语的上下文信息。
怎么理解上下文信息呢?
上下文信息无非是当前内容再文本中,前后的其他内容信息。
如下图所示,learning这个词的上下文信息可以是它左右两边的content标记的内容
word2vec介绍_第4张图片
试想一下,如果这里的learning换成studying,是不是这句话仍然很合适呢?毕竟这两个单词都是学习的意思。

再转换一下思维,由于在当前上下文信息中,根据上下文语义信息,learning和studying都可以出现,是不是learning和studying是近义词了呢?没错,在当前的CBOW下确实是这样,甚至man和woman,cat和dog都可能是近义词。
其实就是拥有相似或者相同的上下文的多个词可能是近义词或者同义词。
CBOW通过当前中心词的上下文单词信息预测当前中心词
word2vec介绍_第5张图片
接下来进入具体的算法模型部分!
1,首先我们需要训练CBOW模型,该模型的结构如下:
word2vec介绍_第6张图片
这张略微复杂,我们需要从最左看是看,最左边的一列是当前测的上下文词语,例如当前词前两个词和后两个词,一共四个上下文词,
这些词的one-hot编码表示,维度是1V行向量,其中V为此空间的大小,也就是有多少个不同的词,则one-hot编码的维度是多少,也就是V个不用的词,然后刚才说每个上下文的词向量都需要乘以一个共享矩阵W(也可以成为周围词向量矩阵),由于整个模型是神经网络结构,我们将这个存在于输入层和隐藏层之间的矩阵成为W1,该矩阵的维度为VN,其中V如前所述,N为我们自己定义的一个维度。

one-hot 编码向量1V乘以维度为VN的矩阵W1,结果是1*N的向量。

这里因为一个中心词会出现多个上下文词,而每个上下文词都会计算得到一个1N向量,这个向量也是1N,我们将这些上下文词的1N向量甲醛取平均,得到中间层的向量,这个向量也是1N,之后这个向量需要乘以一个NV的矩阵W2(这个向量称为中心词向量矩阵),最终得到输出层维度1N

然后将1N的向量softmax归一化得到新的1N向量,再V个取值中概率最大的数字对应的位置所表示的词就是预测的结果,
而这个输出的结果1N就是预测出中心词的分布式表示,
这就是CBOW模型的前向计算过程:
接下来讲模型计算过程:
1.当前词的上下文词语的one-hot编码输入到输出层。
2.这些词分贝乘以同一个矩阵W1(周围词向量矩阵)后分别得到各自的1
N向量。
3.将这些1N向量取平均为一个1N向量。
4.将这个1N向量乘以W2,变成一个1V向量。
5.将1V向量softmax归一化后输出每个词的概率向量1V.
6.将概率最大的数对应的词作为预测词。
7.将预测的结果1V向量和真实标签1V向量(其真实标签中的V个值中有一个是1,其他是0计算误差,一般是交叉熵,。
8.在每次前向传播之后反向传播,不断调整W1和W2矩阵的值。
预测的时候做一次前向传播即可得到预测的中心词结果,
你可能会想,word2vec不是要将词转化为分布式的词嵌入么?怎么变成预测中心词了?
其实我们再做CBWO时,最终要的时W1这个V*N矩阵,想想这是为什么呢,

因为我们要将词转换为分布式表示的词嵌入,我们先将词进行one-hot编码,每个词的向量表示1N,经过乘以W1后,根据矩阵乘法理解,假设1V的向量第N位时1,其他位是0,则矩阵乘法的结果是得到W1矩阵的n行结果,也就是将词表示为了一个1*N的向量,一般N远小于V,这也就是将长度位V的one-hot编码稀疏词向量表示准尉稠密的长度位N的词向量表示。
word2vec介绍_第7张图片
所以,当我们下次要查某个词的词向量时,只需要和矩阵W1相乘就能得到结果,常用的词向量长度有300,大家想想300是不是远小于我们词表李所有不重复词的数量。
word2vec介绍_第8张图片

介绍word2vec另一种模型,skip-gram模型

skip-gram模型的概念时在每一次迭代中都取一个词作为中心词汇,尝试去预测它一定范围内的上下词汇,连续词袋模型于skip-gram模型类似,最大的不同在于,来纳许词袋模型假设基于某中旬词在文本序列前后的背景词来生成该中心词,
例如:‘我’,‘爱’,‘红色’,‘这片’,‘土地’,窗口大小为2,就是用‘我’,‘爱’,‘这片’,‘土地’这四个背景词,来预测生成 ‘红色’ 这个中心词的条件概率,即:

​ P(红色|我,爱,这片,土地)

以“我爱北京天安门”为例,中心词取“爱”,步长取1,也就是周围词为“我”和“北京”。
接下来说说模型的训练过程(前向传播)

将“爱”这个词首先表示为one-hot编码输入到输入层。
接下来我们构建两个参数矩阵,分别为中心词矩阵和周围词矩阵,这两个矩阵分别是V × N V×NV×N维和N × V N×VN×V维,其中V VV跟介绍CBOW模型一样,表示词典的大小,N NN表示我们要构建的词向量的维度,是一个超参数,我们暂时认为其是固定的,不去管它。
以中心词矩阵为例,其为V × N V×NV×N维的,而我们的词表里一共有V VV个词,也就是说,该矩阵的每一行都表示一个单词的中心词向量(低维、稠密的),同理,周围词向量矩阵是N × V N×VN×V维的,每一列表示一个单词的周围词向量表示。

用第二步中的得到的,“爱”的one-hot编码乘以中心词向量矩阵W 1 W_1W
1

,得到一个1 × N 1×N1×N维的向量,这个向量可以认为是该词的中心词向量表示。
用该中心词向量乘以周围词向量矩阵W 2 W_2W
2

,该步骤可以理解为对于“爱”这个词,我们分别与每一个词作内积,最终得到的1 × V 1×V1×V向量中的每一个元素,便是该位置的词与“爱”这个词的内积大小。
对于最终的得到的向量,我们再进一步的做softmax归一化,归一化之后的概率越大,表示该词与“爱”的相关性越大,现在我们的目标就是要使得:“北京”这个词的概率较大,我们如何去实现这个目标呢?那就是通过调整参数矩阵W 1 W_1W
1

和W 2 W_2W
2

,(这里就可以明白这两个矩阵其实只是辅助矩阵,我们根据损失函数,使用反向传播算法来对参数矩阵进行调节,最终实现损失函数的最小化。
对于“爱”这个词,我们要迭代两次,第一次是使得“我”这个词的概率尽量大,第二次使得“北京”这个词的概率尽量大。然后“爱”这个词迭代完了之后,我们再去遍历这个词表里的所有词,通过一次次的迭代,逐步降低损失函数。
提问:为什么一个词汇要用两种向量表示(中心词向量和背景词向量)?

1:数学上处理更加简单

让每个单词用两个向量表示,这两个表示是相互独立的,所以在做优化的时候,他们不会相互耦合,让数学处理更加简单。

2:实际效果更好

如果每个单词用一个向量来表示,那么中心词预测下一个词是自己本身的概率就会很大,因为我们是向量内积来定义;两个单词之间的相似性。所以用两种向量表示在通过效果上会比一种向量表示更好。

在训练结束后,对于词典中任一索引为i的词,我们都会得到两组词向量,在自然语言处理应用中,一般使用skip-gram模型的中心词向量作为词的表征向量。word2vec介绍_第9张图片
链接: link

你可能感兴趣的:(1024程序员节,word2vec,自然语言处理,人工智能)