当前位置:   article > 正文

01:word2vec_word2vec维度选择

word2vec维度选择


本篇主要介绍《Efficient Estimation of Word Representations in Vector Space》,中文名为:基于向量空间中词表示的有效估计,它的第一作者是来自Google的Tomas Mikolov。

研究背景

前期知识储备

  1. 数学知识
  • 高等数学中偏微分
  • 线性代数中矩阵基本运算
  • 概率论中的条件概率
  1. 机器学习
  • 机器学习中基本的原理以及概念,如逻辑回归分类器、梯度下降方法等
  1. 神经网络
  • 了解神经网络基本知识
  • 知道前馈神经网络和循环神经网络的概念
  • 知道语言模型概念
  1. 编程
  • 了解Pytorch基本使用方法,如数据读取、模型构建等

学习目标

  1. 了解词向量的背景知识
  • 历史背景
  • 数学基础
  1. 了解前人工作
  • SVD
  • 前馈神经网络
  • RNN语言模型
  1. 掌握词向量的评价方法
  • Cosine/Analogy
  • 论文中数据集
  1. 掌握模型结构
  • CBOW
  • Skip-gram
  1. Word2vec中的关键技术
  • 层次softmax
  • 负采样
  1. 掌握word2vec代码
  • 关键代码
  • 提高效率细节
    学习目标

论文储备知识

语言模型
直观概念:语言模型是计算一个句子是句子的概率的模型。
例子:深度之眼的论文课真的很好! 0.8
论文课的深度之眼很真好的! 0.000001
语言模型的应用有很多,这里举一个用在输入法里面的例子,在输入法里面输入拼音:zi ran yu yan chu li ,它返回对应的中文就是一个语言模型:
举例
基于专家语法规则的语言模型
语言学家企图总结出一套通用的语法规则,比如形容词后面跟名词。但是很难总结出一套通用的语法规则。
统计语言模型
通过概率计算来刻画语言模型
公式
某一个词出现的概率是怎么计算的?
求解方法:用预料的频率代替概率(频率学派)
公式1
统计语言模型是通过一个很大的语料来构建的,这个语料被称为背景语料,通过上图中的公式可以计算出每个词出现的频率,用频率来代替概率。
条件概率怎么计算?
求解方法:频率学派+条件概率
公式2
统计语言模型中的平滑操作
有一些词或者词组在语料库中没有出现过,但是这不能代表它不可能存在。
平滑操作就是给那些没有出现过的词或者词组也给一个比较小的概率。
_Laplace Smoothing_也称为加1平滑:每个词在原来出现次数的基础上加1.
在这里插入图片描述
P(w)= c(w) / N ===> P(w) = c(w)+1 / N+V
主要解决了词的问题,但是词组的问题还没得到很好的解决。
平滑操作的问题,可能会导致一个有语法错误的句子和一个正确句子的概率是相同的。
还会引发参数空间过大以及数据稀疏严重。
马尔科夫假设
下一个词的出现仅依赖于前面的一个词或几个词。
马尔科夫假设例子
在这里插入图片描述语言模型评价指标:困惑度(Perplexity)

语言模型实质上是一个多分类问题,比如P(w1)的计算,输入是空白的,标签就是w。
在这里插入图片描述

论文导读

论文背景知识

词的表示方式

  • One-hot Representation 独热表示
    这种表示方法表示简单;存在的问题是:词越多,维数越高,维数为词表的大小V,且无法表示词和词之间的关系。
    比如将“话筒”表示为:[0,0,0,0,1,0,0,……],
    将“麦克”表示为[0,0,1,0,0,0,0,……]等。
  • SVD
    这种是基于窗口的贡献矩阵的方法,一个词只跟与它在特定窗口内的词有关,两个词共同出现一次就加一。例如:
    在这里插入图片描述
    通过共线的方法,可以体现一定相似的关系,但是维度很多,因此需要降维,使用SVD分解,。SVD分解可以在一定程度上得到词与词之间的相似度,但是矩阵太大,SVD分解效率低,学习得到的词向量可解释性差。
  • 分布式表示/稠密表示
    它的维度不再是词典的大小,每个维度上的数字不再是0,这些数是通过训练得到的,训练得到的词向量可以将意思相近的词离得很近。
    在这里插入图片描述

研究成果

  • 提出新的模型结构
  • 提出优化训练的方法,使得训练速度加快
  • 给出训练代码word2vec,使得单机训练成为可能
  • 成果:训练的词向量,又快又好,并且能够在大规模语料上进行词向量的训练。

研究意义

1.衡量词向量之间的相似程度:余弦相似度和词类比。
在这里插入图片描述2.作为预训练模型提升nlp任务
外部任务比如命名体识别、文本分类;应用到其他nlp任务上,相当于半监督训练。

论文总览

在这里插入图片描述

介绍

  • 传统NLP把词当做最小单元处理,并且能够在大语料库上得到很好的结果,其中一个例子是n-grams模型;
  • 然而很多自然语言处理任务只能提供很小的预料,如语音识别、机器翻译,所以简单的扩大数据规模来提升简单模型的表现在这些任务上不再适用,所以我们必须寻找更加先进的模型;
  • 分布式表示可以在大语料上训练得到很好额语言模型,并且能够超过n-grams模型,这是一个很好的可以作为改进的技术。

对比模型03

《Efficient Estimation of Word Representations in Vector Space》
基于向量空间中词表示的有效估计

前馈神经网络语言模型(NNLM)

在nlp任务中,首先都会构建word2id以及id2word,它们都是字典类型。
_input layer_层,首先输入的是index,将每个index映射成一个向量,将这些向量进行拼接,如输入的是n-1个词,每个词都是100维,因此拼接完成后变成100×(n-1)维;
_hidden layer_层,将上一步得到的向量输入到全连接层中,使用tanh激活函数;
_output layer_层,上一步得到的结果再接一个全连接层,然后使用softmax。
在这里插入图片描述
n-grams是通过前n-1个单词,来预测第n个位置单词的概率。因此将前n-1个单词输入到上述模型中去,模型经过最后softmax得到的结果来预测第n个位置单词的概率,然后通过不断地优化,使得模型能够正确预测到第n个位置上的单词。这样可以得到句子中每个词的概率,每个词的概率相乘就可以得到句子的概率。语言模型是无监督的。

  • 输入层
    将词映射成向量,相当于一个1×V的one-hot向量乘以一个V×D的向量得到一个1×D的向量。
    在这里插入图片描述
    如果是得到前n-1个词的向量,则用(n-1)*V的矩阵乘以V×D的矩阵,得到(n-1)×D的矩阵。
  • 隐藏层
    一个以_tanh_为激活函数的全连接层:a = tanh(d + Ux)
  • 输出层
    一个全连接层,后面跟了个_softmax_函数生成概率分布。
    y = b + Wa
    其中y是一个1×V的向量在这里插入图片描述

语言模型困惑度和Loss的关系

如何求困惑度?
需要将每个句子中每个词的概率给预测出来,然后将他们相乘吗?这样做也是可以的,但在实际中有更加方便巧妙的方法。
先写出Loss,使得预测出得到的每个正确单词得到的概率越大越好,使用了交叉熵损失函数,这个Loss是一句话的Loss:
T表示句子中词的个数
其中,T表示句子中词的个数。
困惑度是句子的概率开负T分之一:
在这里插入图片描述这样在得出loss的情况下,可以很方便的求出困惑度是多少,看看困惑度的情况。现在都是批次进行训练和预测的,每计算batchsize大小的个数进行一次loss的计算。

回顾网络模型

在这里插入图片描述

  • 仅对一部分输出进行梯度传播。比如单词the、a、and等他们所包含的信息比较少,但是在语料中又频繁出现,因此这些词能不能或者少进行不进行梯度传播;
  • 引入先验知识,如词性等。加词性之前,先考虑这个模型本身是否会学到词性信息,如果模型本身就可以学习到词性信息,那么就不需要再加了,也可以先加上词性信息看看效果能不能好。
  • 解决一词多义问题。一个词就一个向量,那么一个向量怎么能表示多个意思呢?
  • 加速softmax层。softmax层的神经元个数是字典V的个数,因为每个词都要输出一下概率,这样就很慢。

循环神经网络语言模型(RNNLM)

在这里插入图片描述
s(t-1)是上一个时间步的输出,w(t)是当前词向量(也是通过one-hot方式转换的)的输入。
在这里插入图片描述在这里插入图片描述

每个时间步预测一个词,在预测第n个词的时候,使用到了前n-1个词的信息,它就没有使用马尔科夫假设了。
在这里插入图片描述

对比模型04

Log-Linear model

定义:将语言模型的建立看成一个多分类问题,相当于线性分类器加上softmax。
γ = softmax ( wx + b )
只有softmax中求指数是非线性的,变成log就是线性的???

Word2vec原理

  • 语言模型基本原理:句子中下一个词的出现和前面的词是有关系的,所以可以使用前面的词预测下一个词
  • Word2vec基本思想:句子中相近的词之间是有联系的,比如今天后面经常出现上午、下午和晚上。所以Word2vec的基本思想就是用词来预测词,_skip-gram_使用中心词预测周围词,_cbow_使用周围词预测中心词。 word2vec的基本思想上就对语言模型进行了简化。

Skip-gram

在这里插入图片描述
如何求上图中的概率?其实语言模型中概率问题都是一个多分类问题,输入就是Wi,而标签就是Wi-1,相当于一个词表大小的多分类问题,怎么求概率以及学习词向量?
在这里插入图片描述input:Wi label:Wi-1
输入是index,代表这个词在词表中的位置;1×V是这个词的one-hot编码,V×D是词向量矩阵,这个词向量矩阵W被叫做中心词的词向量矩阵;得到1×D的词向量与周围词的词向量矩阵W 进行相乘,得到1×V的向量,这个向量在经过softmax之后,得到每个词的概率,然后使得正确词的位置上的概率越大越好。
其中W和W*就是想训练得到的词向量,一般用W就可以或者用(W+W )/2
1×D的词向量代表的是中心词Wi的词向量,W 是周围词的词向量矩阵,它们相乘后再做softmax,把Wi-1这个位置的单词取出来。
在这里插入图片描述
分母是Vwi与所有的周围词做内积的和,而分子是Vwi与Wi-1这个位置上的词做内积。
求以下公式的最大值:
在这里插入图片描述
在这里插入图片描述

cbow

在这里插入图片描述对于中心词来说只有一个训练的样本,而之前的skip-gram对于中心词,根据窗口大小假设等于2,他会根据窗口大小产生4个训练的样本。
在这里插入图片描述

关键技术

复杂度讨论

在这里插入图片描述
U是周围词的矩阵,V是中心词的矩阵,第三个矩阵相乘相当于是一个没有激活函数也没有偏置的全连接层,全连接层额神经元个数是词表大小,因为softmax层要输出V个概率,V是特别大的,因此这个全连接层也是特别大的,那么如何降低复杂度呢?能不能将softmax的复杂度降低呢?论文中也提到了两种方法,下面依次介绍。

Hierarchical Softmax

softmax会一下子求出词典大小数的概率,那么,能不能转换成求几个sigmoid呢?层次softmax的基本思想就是将softmax的计算转换成求sigmoid的计算。怎么转换呢?
将其写成二叉树的结构,在每个节点上作一个二分类,比如结果小于0.5就往左走,大于0.5就往右走。因为softmax总共要做V次指数操作,一次sigmoid做一次指数运算,因此只需要转成少于V次的sigmoid的指数运算即可,怎么实现做最少的sigmoid呢?
在这里插入图片描述这里写一个有8个节点的满二叉树,词表大小是8,那么做softmax就需要做8次指数操作,而sigmoid只需要做树的深度减一次即可,即只需要做log2 V次就可以。 那么如果是其他的二叉树呢,效果会不会更好?看看Huffman树的效果。
在这里插入图片描述上图中叶子结点上数字对应于词上,代表词出现的频率,比如第一个词出现的频率是5等,因此计算这个词的sigmoid的次数就是5×2次,依次类推,可以得到上图中左边的式子和右边的式子。
Huffman树的思想是将出现频率高的词放到上面,例如上图中将出现频率为13的词放到第二层,那么计算这个词的概率只需要计算一次sigmoid就可以了。
如果将词构建成Huffman树的形式,那么求解softmax就可转换成最少于log2 V次的sigmoid的求解。具体计算概率如下:
在这里插入图片描述
首先每一个分支节点都是一个向量,对于比如说在skip-gram里面,有一个中心词向量Vc ,它与塞塔进行相乘,结果大于0.5往左走,小于0.5往右走等。
在这里插入图片描述
在这里插入图片描述
下面解释一下下图中的公式,n(w,j+1)表示词w在树上的第j+1个节点;n(w,j+1)==ch(n(w,j))判断词w在树j+1个节点是否是j个节点的右孩子,通过这个式子来判断是右孩子还是左孩子,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里再在CBOW中说一下层次softmax,CBOW与skip-gram的唯一区别是u0 是窗口内上下文词向量的平均值,塞塔是没有变的。
这里有一个问题,之前我们在讲原始的skip-gram和cbow的时候,我们说最终的词向量可以是中心词向量和周围词向量的平均,但是在层次softmax上我们就只有一组词向量了,因为塞塔的个数是少于V个的,而且也不知道塞塔具体值得是什么,因此这个塞塔是没办法用的。
在这里插入图片描述

Negative Sampling

负采样在效果上比层次softmax上好点,之前softmax之所以慢,就是进行了多分类,而且是一个V类别的多分类,所以能不能舍弃多分类来提升速度呢?就是把多分类变成一个二分类,二分类中要有正负样本。正样本是一个中心词和一个周围词在一块,负样本就有一个巧妙的思想,先拿skip-gram举例,先把中心词拿出来,比如将over拿出来,然后再在所有的词表里面随便选一个词,比如again,将over和again组合到一块作为负样本。随便选一个词当然可能会选到真正的周围词,但是周围词的个数相比词表中单词的个数来说太少了,因此选到周围词的概率很低,可以忽略。
负采样的思想就是增大正样本的概率,减小负样本的概率。对于每一个词,不能只对应一个负样本,因为一个负样本可能有一定的偏差,一般情况下要选3–10个之间,它要输出正样本的概率,还要输出k个负样本的概率,这样只需要输出k+1个概率。

它的复杂度是下图中的式子,第一项是正样本的概率,第二项是负样本的概率,由于第二项中添加了负号,因此只需让下面的式子得到的值越大越好。
在这里插入图片描述
其中,vc 是中心词向量,u0 是窗口内上下文词向量,uk 是负采样上下文词向量。
它的效果要比多分类要好,但是和最原始的word2vec一样,这里也需要一组中心词向量和周围词向量,并且都是完整额V×D,因此它总的参数个数要比层次softmax多,但是每次的计算量不多,每次只需要输出k+1个概率就可以,而在层次softmax中要输出log2 V个概率。
那么应该如何采样比较好?
论文中提到一种采样方法,将每个词出现的频率都开四分之三次方,然后再除以归一化来作为该词采样的频率。
在这里插入图片描述
为什么要减少把频率大的词的抽样概率,增大频率小的词的概率呢?
因为一些重要的词往往出现的次数少一些,不重要的词往往多一些,比如the、a等。

下面看一下CBOW中负采样是怎么使用的。
周围词的词向量的平均与随机采样得到的词组成的是负样本,与中心词组成的是正样本,损失函数如下图中J所示,也是最大化J。
在这里插入图片描述总结下负采样和层次softmax的策略,层次softmax的思想是把softmax转换成多个sigmoid,并且多个sigmoid是少于log2 V次的,减少了计算量;而负采样是将一个多分类问题转换成一个二分类问题,这样就不用受到softmax的干扰了。

Subsampling of Frequent Words

自然语言处理共识:文档或者数据集中出现频率高的词往往携带信息较少,比如the、is,而出现频率低的词往往携带信息多
重采样的原因:
1.想更多的训练重要的词对,比如训练"Frence"和"Pairs"之间的关系比训练"France"和"the"之间的关系要有用,即多训练这些含有信息比较多的词对,少训练含所有信息比较少的词对;
2.高频词很快就训练好了,因为高频词出现一次就训练一次,而低频次需要更多的轮次。
重采样方法:
在这里插入图片描述使用上图中的公式进行重采样。由公式可知,词频越大,f(wi )越大,P(wi )越大,那么词wi 就有更大的概率被删除,反之亦然。如果词wi 的词频小于等于t,那么wi 则不会被剔除。
优点:加速训练,能够得到更好的词向量。

模型复杂度

模型复杂度的概念

模型的复杂度也就是时间上的复杂度,O = E × T × Q
O是训练复杂度 training complexity
E 是训练迭代次数 number of the training epochs
T 是数据集大小 number of the words in the training set
Q 是模型计算复杂度 model computational complexity
论文中求Q的方法比较特殊,使用参数的数目来计算时间复杂度

基于前馈网络的语言模型的时间复杂度

Q = V×H + N×D×H + N×D
输入层的参数:输入n个上下文的词,每个词映射成1×D的向量,N个词就是N×D;
隐藏层的参数就是W,隐藏层的输入是(N×D)维,输出得到的神经元的个数是H,因此W的维度是(N×D)×H;
U是H×D维。
如果使用层次softmax,每次计算一个词的概率,需要平均做log2 V次的sigmoid,就相当于有log2 V个塞塔和隐藏输出做内积,每个塞塔的个数都是和隐藏输出的个数相同,因此V×H就变成了H×log2 V。
在这里插入图片描述
在这里插入图片描述

循环神经网络语言模型

在这里插入图片描述
输入也是1×D维,矩阵U是D×H维,矩阵W是H×H,V是H×V。
按照论文来说,D和H是一样大的,因此Q = 1×D + D×H + H×H + H×V,将D换成H,并加以整理,得Q = H(1+2H) + H*V

Skip-gram

Hierarchical复杂度

在这里插入图片描述
对于原始的skip-gram,它的中心词词向量是D维,然后乘以W (D×V维),而对于一个中心词来说,它对应着多个周围词,一般是5–10 个,这里假设是C个,因此再乘以C,便可以得到上图中的第一个公式。如果使用的是层次softmax,那么便将D×V变成D×log2 V。

在这里插入图片描述

Negative Sampling复杂度

在这里插入图片描述
在这里插入图片描述
对于每一个中心词来说,有1,个正样本和K个负样本,每个都会变成一个D维的词向量,便得到上图中第二个公式。

CBOW复杂度

在这里插入图片描述原始的CBOW,输入的是周围词,每个周围词的维度是1×D,那么N个周围词就是N*D维的,又经过一个前馈层,得到词典大小V的向量,因此中间矩阵的维度为D×V,所以总的参数个数为N×D+D×V。
与skip-gram相同,cbow对应于层次softmax和负采样的复杂度如上图所示。

模型复杂度对比

在这里插入图片描述
前馈神经网络最复杂的部分是由隐藏层引起的;循环神经网络最复杂的部分是H×H;
可以自己取具体的值带入到公式中,然后对比查看复杂度的差别。
对比可知,不管是基于层次softmax的结构还是基于负采样的结构,他们的速度都是比基于前馈神经网络模型和循环神经网络模型的速度快的;skip-gram要比cbow稍微慢一点;负采样要比softmax要快一些。
在这里插入图片描述

实验结果

任务描述

任务是一个词对推理的任务,下图中前五个是语义类,后九个是语法类

在这里插入图片描述在这里插入图片描述

最大化正确率(优化参数)

用小数据集调参,选择最好的参数,参数包括维度、训练的数据量。
在这里插入图片描述
随着维度的增加,随着数据集的扩大,效果基本上是越来越好的。

模型比较

在这里插入图片描述

RNNLM和NNLM都在语义上表现的比较好,在语法上表现的比较差,CBOW也是,而skip-gram在语法和语义上都表现的比较好。

讨论与总结

讨论

超参数选择:请问,利用genism做word2vec的时候,词向量的维度和单词数目有没有一个比较好的对照范围呢?
词向量的维度一般在100–500维之间选择,初始值词典大小V的1/4次方,V=10k,dim=100。
min_count一般在2–10之间选择,min_count指在词在语料中最小的频率,min_count选越大,词表就越小,因为删去的词就越多,
在这里插入图片描述

总结

论文的主要创新点:
1.提出一种新的结构
这个结构是使用词预测词,而不是用前面的一系列词来预测词,简化了结构;也提出了层次softmax和负采样,大大减少了计算量,从而可以使用更高的维度,更大的数据集
2.利用分布式训练框架
在大数据上训练,从而达到更好的效果
3.提出了新的词相似度任务
Analogy词类别
关键点:
1.更简单的预测模型——word2vec
2.更快的分类方案——HS和NEG
创新点:
1.使用词对的预测来替换语言模型的预测
2.使用HS和NEG降低分类复杂度
3.使用subsampling加速训练
4.新的词对推理数据集来评估词向量的质量
创新点
1.大数据集上的简单模型往往强于小数据集上的复杂模型
论文能否通过增加数据集来提升自己的模型?
2.King的词向量减去Man的词向量加上Woman的词向量和Queen的词向量最接近
它很好的说明了word2vec具有的非常良好的性质,它能学到这种代数的关系,词对的这种关系。
3.我们决定设计简单的模型来训练词向量,虽然简单的模型无法像神经网络那么准确地表示数据,但是可以在更多地数据上更快的训练。
因此我们设计模型不一样要往复杂的方向进行设计,也可以按照简单的方向进行设计。
4.我们相信在更大的数据集上使用更大的词向量维度能够训练得到更好的词向量。
数据非常重要。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/344427
推荐阅读
相关标签
  

闽ICP备14008679号