当前位置:   article > 正文

word2vec学习笔记

word2vec学习笔记


版权声明:本文为CSDN博主「v_JULY_v」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/v_JULY_v/article/details/127411638 如有侵权,请联系删除

 学习链接

http://t.csdn.cn/Df6Nehttp://t.csdn.cn/Df6Ne

【保护新手!啃透这份满分级【word2vec词向量模型】入门教程,计算机博士手把手带你掌握机器学习最著名的模型,超级简单!!--机器学习|自然语言处理|人工智能】 https://www.bilibili.com/video/BV1ng411Q7UK/?p=15&share_source=copy_web&vd_source=5f8359bfd39f438acc51eab45c4c0aa1

目录

 1.1 从向量表示到词嵌入

 为何要把词向量化表示?

1.2 从N-gram模型、NNLM到Word2Vec

1.2.1 N-gram模型

n-gram模型  

神经网络语言模型(Neural Network Language Model,简称NNLM)

 1.2.2 语言模型训练:如何构建映射矩阵(词嵌入矩阵)

 1.2.3 Word2Vec的两种架构:从CBOW到Skipgram模型

连续词袋(CBOW):以上下文词汇预测当前词

Skipgram架构:根据当前词推测当前单词可能的前后单词

 负采样

 1.3 Word2vec训练流程:不断缩小error(target - sigmoid_scores)


 1.1 从向量表示到词嵌入

用0到100的范围来表示是多么内向/外向(其中0是最内向的,100是最外向的)

 假设一个叫Jay的人,其内向/外向得分为38/100,则可以用下图表示这个得分:

 为了更好的表达数据,我们把范围收缩到-1到1:

 对于一个人的描述只有一条信息显然是不够的,为此,我们添加另一测试的得分作为一个新的第二维度,而这两个维度均可以表现为图上的一个点(或称为从原点到该点的向量)

 然后可以说这个向量部分地代表了Jay的人格。

假设Jay是一家公司的CEO,某天被公共汽车给撞住院了,住院期间需要一个与Jay性格相似的人代行Jay的CEO之责。那在下图中,这两个人中哪一个更像Jay呢,更适合做代理CEO呢?

计算两个向量之间相似度得分的常用方法是余弦相似度

 person 1在性格上与Jay更相似。其实,从坐标系里也可以看出,person1的向量指向与Jay的向量指向更相近,即他俩具有更高的余弦相似度。

用五个维度再度比较Jay与person1 2的相似性:

 这些得分比上次的得分看起来更准确

小结一下,有两点

1.我们可以将人和事物表示为代数向量

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

 

 为何要把词向量化表示?

各个国家的人们通过各自的语言进行交流,但机器无法直接理解人类的语言,所以需要先把人类的语言“计算机化"

比如对于计算机,它是如何判断一个词的词性,是动词还是名词的呢?

假定我们有一系列样本(x,y),其中的 x 是词语,y 是它们的词性,我们要构建f(x) \to y的映射:

1. 首先,这个数学模型 f(比如神经网络、SVM)只接受数值型输入;
2. 而 NLP 里的词语是人类语言的抽象总结,是符号形式的(比如中文、英文、拉丁文等等);
3. 如此一来,咱们便需要把NLP里的词语转换成数值形式,或者嵌入到一个数学空间里;
4. 进一步,可以把文本分散嵌入到另一个离散空间,称作分布式表示,又称为词嵌入(word embedding)或词向量
5. 在各种词向量中,有一个简单的词向量是one-hot encoder。所谓one-hot编码,本质上是用一个只含一个 1、其他都是 0 的向量来唯一表示词语
当然,不是所有的编码都是01编码,且one-hot编码无法反应词与词之间的语义相似度

 一个单词表达成Word Embedding后,便很容易找出语义相近的其它词汇

再举一个例子,这是一个单词“king”的词嵌入(在维基百科上训练的GloVe向量):

[ 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个数字的列表。通过观察数值我们看不出什么,但是让我们稍微给它可视化,以便比较其它词向量。故我们把所有这些数字放在一行:

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

 将“king”与其它单词进行比较

 “Man”这个词和“Woman”相比,比与“King”相比更相似,而这些向量图示很好的展现了这些单词的含义与关联

1.2 从N-gram模型、NNLMWord2Vec

1.2.1 N-gram模型

智能手机输入法中的下一单词预测功能,或者你在电脑上用Google搜索也会遇到类似的搜索智能提示:  比如当你输入thou shalt时,系统会预测/提示你想输入的下一个单词是不是not?

 

 系统是根据什么来预测/提示下一个单词的呢?

1. 在上面这个手机截屏中,该模型已经接收到了两个绿色单词(thou shalt)后

2. 为此推荐一组单词且要计算比如“not” 是其中最有可能被选用的一个

n-gram模型  

假设一个长度为m的句子,包含这些词:(w_1,w_2,w_3,..,w_m),那么这个句子的概率(也就是这m个词共同出现的概率)是:P\left ( sen = (w_1,w_2,\cdots ,w_m) \right ) = P(w_1)P(w_2|w_1)P(w_3|w_2,w_1)\cdots P(w_m|w_{m-1}\cdots w_1)

语言模型都是为了使得条件概率P(w_t|w_1,w_2,..,w_{t-1})最大化,不过考虑到近因效应,当前词只与距离它比较近的n个词更加相关(一般n不超过5,所以局限性很大)

神经网络语言模型(Neural Network Language Model,简称NNLM)

NNLM的核心是一个多层感知机(Multi-Layer Perceptron,简称MLP),它将词向量序列映射到一个固定长度的向量表示,然后将这个向量输入到一个softmax层中,计算出下一个词的概率分布

 模型表示为黑盒:

 模型不会只推荐一个单词。实际上,它对所有它知道的单词(模型的词库,可能有几千到几百万个单词)均按可能性打分,最终输入法程序选出其中分数最高的推荐给用户,比如not

模型的输出就是模型所知单词的概率评分,比如40%或者0.4,最终在完成训练后按下图中所示的三个步骤完成预测

1.    第一步就是Look up Embedding,由于模型在经过另外一个训练之后可以生成一个映射单词表所有单词的矩阵,也称词嵌入矩阵,从而在进行预测的时候,我们的算法可以在这个映射矩阵(词嵌入矩阵)中查询输入的单词(即Look up embeddings)
2.    第二步则是计算出预测值
3.    第三步则输出结果

 「模型在经过另外一个训练」→ 即如何构建映射矩阵(词嵌入矩阵)

 1.2.2 语言模型训练:如何构建映射矩阵(词嵌入矩阵)

 通过找常出现在每个单词附近的词,就能获得它们的映射关系。机制如下:

  1. 先是获取大量文本数据(例如所有维基百科内容)
  2. 然后我们建立一个可以沿文本滑动的窗(例如一个窗里包含三个单词)
  3. 利用这样的滑动窗就能为训练模型生成大量样本数据

当这个窗口沿着文本滑动时,我们就能(真实地)生成一套用于模型训练的数据集

得到一个较大的数据集,从数据集中我们能看到在不同的单词组后面会出现的单词:

 1.2.3 Word2Vec的两种架构:从CBOW到Skipgram模型

更进一步,为了更好的预测,其实不仅要考虑目标单词的前两个单词,还要考虑其后两个单词。

如果这么做,我们实际上构建并训练的模型就如下所示:

连续词袋(CBOW):以上下文词汇预测当前词

 CBOW包括以下三层:

  1. 输入层:包含Context(w)中个词的词向量\left \{ v\left (Context (w_{1}) \right),v\left ( Context({w2}) \right ),\cdots ,v\left ( Context({w2}) \right ) \right \} \in R^m,其中,v表示单词的向量化表示函数,相当于此函数把一个个单词转化成了对应的向量化表示,2c表示上下文取的总词数,m表示向量的维度;
  2. 投影层:将输入层的2c个向量做累加求和;
  3. 输出层:按理我们要通过确定的上下文决定一个我们想要的中心词,但怎么决定想要的中心词具体是{ w_{1} w_{2} .. w_{t} .. w_{N} }中的哪个呢?

通过计算各个可能中心词的概率大小,取概率最大的词便是我们想要的中心词,相当于是针对一个N维数组进行多分类,但计算复杂度太大,所以输出层改造成了一棵Huffman树以语料中出现过的词当叶子结点,然后各个词出现的频率大小做权重

Skipgram架构:根据当前词推测当前单词可能的前后单词

 负采样

例子:“Thou shalt not make a machine in the likeness of a human mind”

 输入单词not,和上下文单词:thou(实际邻居词),aaron和taco(负面例子)

 

 1.3 Word2vec训练流程:不断缩小error(target - sigmoid_scores)

预先处理正在训练模型的文本

先创建两个矩阵:

词嵌入Embedding矩阵

(注意:这个 Embedding矩阵其实就是网络Onehot层到Embedding层映射的网络参数矩阵,所以使用Word Embedding等价于把Onehot层到Embedding层的网络用预训练好的参数矩阵初始化了)

上下文Context矩阵

这两个矩阵在我们的词汇表中嵌入了每个单词,且两个矩阵都有这两个维度

第一个维度,词典大小vocab_size,比如可能10000,代表一万个词
第二个维度,每个词其嵌入的长度embedding_size,比如300是一个常见值(当然,我们在前文也看过50的例子,比如上文1.1节中最后关于单词“king”的词嵌入长度)

训练的过程还是这个标准套路/方法,比如

第一步,先用随机值初始化这些矩阵。在每个训练步骤中,我们采取一个相邻的例子及其相关的非相邻例子
 
具体而言,针对这个例子:“Thou shalt not make a machine in the likeness of a human mind”,我们来看看我们的第一组(对于not 的前后各两个邻居单词分别是:Thou shalt 、make a):
 

 现在有四个单词:输入单词not,和上下文单词:thou(实际邻居词),aaron和taco(负面例子)
我们继续查找它们的嵌入
对于输入词not,我们查看Embedding矩阵
对于上下文单词,我们查看Context矩阵

 第二步,计算输入嵌入与每个上下文嵌入的点积

还记得点积的定义否
两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:

a\cdot b = a_{1}b_{1} + a_{2}b_{2} + \cdots + a_{n}b_{n}

 而这个点积的结果意味着输入上下文各个嵌入的各自相似性程度,结果越大代表越相似

 为了将这些分数转化为看起来像概率的东西——比如正值且处于0到1之间,可以通过sigmoid这一逻辑函数转换下。

 可以看到taco得分最高,aaron最低,无论是sigmoid操作之前还是之后。

第三步,既然未经训练的模型已做出预测,而且我们拥有真实目标标签来作对比,接下来便可以计算模型预测中的误差了,即让目标标签值减去sigmoid分数,得到所谓的损失函数

 error = target - sigmoid_scores

 第四步,我们可以利用这个错误分数来调整not、thou、aaron和taco的嵌入,使下一次做出这一计算时,结果会更接近目标分数

 训练步骤到此结束,我们从中得到了这一步所使用词语更好一些的嵌入(not,thou,aaron和taco)

第五步,针对下一个相邻样本及其相关的非相邻样本再次执行相同的过程

 当我们循环遍历整个数据集多次时,嵌入会继续得到改进。然后我们就可以停止训练过程,丢弃Context矩阵,并使用Embeddings矩阵作为下一项任务的已被训练好的嵌入

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号