源
Word2Vec(译注)
Word2vec是一组产生word embeddings的模型(word embeddings是NLP中把词或短语映射到数字或向量的方法的合称).这些模型由2层的神经网络实现,通过训练来重建词或短语的语法上下文.
Word2vec包括两个结构: continuous bag-of-words(CBOW)和continuous skip-gram.
本文介绍word2vec的skip gram的神经网络结构, 简单介绍word2vec的简介和抽象的理解,重点介绍神经网络实现的细节.
The Model
skip-gram的神经网络模型十分简单;I think it’s the all the little tweaks and enhancements that start to clutter the explanation.
Word2vec使用的一些技巧在其他机器学习方法中也会遇到. 训练一个单隐层的神经网络完成某个任务,但是这个网络最终会被用来处理另一个任务.其实训练的目的只是为了获得隐层的权重-这些权重就是我们期望得到的”word vectors”.
无监督学习领域内有同样的技巧. 训练一个auto-encoder,在隐层压缩输入向量,在输出层解码出输入信号.训练完成后,删除输出层(解压缩层),只使用隐层–这是一个从未标记的训练数据中学习特征的技巧.
The Fake Task
现在我们分析一下构建神经网络的虚构的任务,以及这个任务如何帮助我们得到word vector.
网路训练的方法如下.给定句子中的一个词(输入词),从其邻域内随机选择一个词.网路需要告诉我们词典中每个词在我们选中的词的邻域内的概率.
所谓的”邻域”,在算法中实际是一个”window size”参数.一个典型的window size是5,即邻域是指前后5个词(共10个词)
输出的概率是关于每个词出现在输入词邻域内的可能性.如果输入词是”Soviet”,”Union”和”Russian”对应的输出概率会高于其他无关词,比如”watermelon”和”kangartoo”
我们通过输入训练文档中的词对训练网络.下图是一些训练样本(词对)的例子,词对来自句子”The quick brown fox jumps over the lazy dog.” 例子中的window size是2. 蓝色高亮的词是输入词.
网络从每个词对的出现次数学习统计信息.例如输入的(“Soviet”,”Union”)次数比(“Soviet”,”Sasquatch”)多.训练结束后,输入”Soviet”,输出中对应”Union”或”Russia”的概率会高于”Sasquatch”
Model Details
那么词对如何描述?
显然不能直接把文本送入神经网络,需要先把词转换成一种神经网路可以接受的形式.为此,我们先从训练文档中构建词典-假设字典包括10000个不同的词.
我们使用one-hot编码描述词,比如”ants”. 这是一个10000维的向量(每个维度对应词典中一个词),把对应”ants”的维度设置为1,其他维度设置为0.
网络输出同样也是10000维的向量,每一个维度表示对应的词出现在输入词邻域的概率.
下图是网路架构.
隐层没有激励函数,输出层使用了sigmoid激励.
用词对训练这个网络时,输入表示输入词的one-hot向量,输出是对应输出词的one-hot向量.但做预测时,输入依然是one-hot向量,但输出不再是one-hot向量,而是一个概率分布.
The Hiddne Layer
我们例子中,word vector有300个特征.所以隐层可以用一个权重矩阵,10000行(每一行对应词典中一个词),300列(一列对应一个隐层节点)
Google公开的基于news dataset的模型采用的是300个特征.特征的个数是应用相关的hyper parameter.
权重矩阵的一行(300维)就是一个词向量.
训练的目的是学习隐层的权重矩阵,输出层会在训练结束后被删除.
重新回顾一下训练的模型.可能会有疑问,”one-hot向量中几乎全部是0,其作用何在?”. 把一个
1×10000
1
×
10000
的one-hot向量和
10000×300
10000
×
300
, 只有”1”对应那一行会被选中,下面是一个例子:
如此隐层的功能就是一个查找表,隐层输出的是输入词对应的词向量.
The Output Layer
“ants”对应的
1×300
1
×
300
的词向量如果送入输出层,而输出层是softmax回归,也就是每个输出层节点都是一个0和1之间的值,所有输出值的和是1.
也就是每个输出层节点把隐层输出的词向量和节点权重相乘,对结果应用exp()函数.最后每个输出值除以10000个输出值的和,保证输出的和是1.
下图是一个实例,输入词是”car”:
网络是不知道输入词和输出词之间的距离(句子中).它学习的是二者相邻的概率.为了理解这一点,假设训练语料库中”York”每次出现,其前面总是”New”.那么至少根据语料库,”New”出现在”York”的概率是100%.但如果”York”的邻域内10个词,随机选择一个,”New”被选中的概率低于100%.
Intuition
现在可以更加深入的理解一下这个网络了.
如果两个不同的词上下文很相似,网络对这两个词的输出就应该比较相似.而输出相似的一个可能是两个词对应的词向量是相似的.所以如果两个词有相似的上下文,网络学习到的词向量可能也很相似.
两个词具有相似上下文表示什么意思?比如”intelligent”和”smart”可能有相似上下文.或者一些有关联的词,比如”transmission”和”engine”也可能有相似上下文.
另外网络还可以做词干提取,因为”ant”和”ants”具有相似的上下文,他们对应的词向量也会比较相似.
Next Up
skip-gram网络包括很多权重.对于10000个词,300个特征的情况,隐层和输出层将有3M个权重.在大样本集上训练这样的网络会十分困难,word2vec的作者做了一些调整使训练可行,这将在另一篇文献中介绍