词向量

时间:2024-08-24 19:50:12编辑:小松

什么是词向量?

""" 确实,网上的很多资料好像并没有在一开始就阐明这个“词向量”到底是怎么来的,也有可能是简短说了一下但是并没有引起我们的注意,导致我们会问“生成的向量到底在哪儿呀”。那么word2vec向量到底在哪儿?其实这些词向量就是神经网络里的参数,生成词向量的过程就是一个参数更新的过程。那么究竟是什么参数呢?就是这个网络的第一层:将one-hot向量转换成低维词向量的这一层(虽然大家都不称之为一层,但在我看来就是一层),因为word2vec的输入是one-hot。one-hot可看成是1 N(N是词总数)的矩阵,与这个系数矩阵(N M, M是word2vec词向量维数)相乘之后就可以得到1 M的向量,这个向量就是这个词对应的词向量了。那么对于那个N M的矩阵,每一行就对应了每个单词的词向量。接下来就是进入神经网络,然后通过训练不断更新这个矩阵。这个部分在网上的资料里经常被简略的概括,输出层一般是重点解释的对象,所以需要仔细地理清这个思路。有了这个概念之后再去看word2vec网络具体是怎么实现的,就会容易很多。

词向量原理

了解词向量要从语言模型说起,语言模型其实就是计算任意一个句子的概率。 经典的语言模型是n-gram模型,该模型假设每个词的生成仅仅依赖前面n个词,所以从大规模语料中统计每个词的概率和基于前面n词的条件概率,就可以计算出一个句子的概率。对于没有出现的条件概率,则采用平滑方法来估计。该方法的假设太强,没有考虑更多的上下文。而且训练需要大量语料,一般的统计也只到trigram。 后来出现了神经网络语言模型,该模型训练出语言模型的同时可以输出词向量。 也就是说所有词向量模型的目标都是训练一个语言模型,最大化训练数据中每个句子的概率,词向量作为参数一起训练,当语言模型训练好的时候,词向量也就有了。 2003年bengio推出了《A Neural Probabilistic Language Model》,对每个词采用分布式表示,即词向量表示,用一个三层的神经网络训练出一个好的语言模型。 第一层为词向量层,每个词都查表替换为词向量作为输入,第二层是一个tanh层(隐藏层),与第一层相连,第三层是一个softmax输出层,与第一层和第二层都相连。 该网络估计的是一个ngram片段的概率,输入层是n-1个词的词向量拼接而成的向量,输出是|V|个词的概率,对应一个|V|维向量。 假设词向量为m维,隐藏层节点数为h,词表大小为|V|,则 训练目标就是最大化所有ngram片段(n个连续词)的似然性,可以加正则项。 词向量也是参数,采用随机梯度下降法训练,训练结束后,语言模型有了,词向量也有了。 更多词向量模型可参考: Licstar的 Deep Learning in NLP (一)词向量和语言模型 与Bengio的模型相比,Word2Vec去掉了最耗时的非线性隐藏层的计算,改为简单的求和隐层,并提出了两种模型: 一种是CBOW模型,通过前后n个词(上下文)来预测当前词的概率,隐藏层对上下文词的词向量求和,所以节点数和词向量维度相同。 一种是Skip-gram模型,通过词w预测上下文范围内每个词的概率,所以Skip-gram 中的每个词向量表征了上下文的分布。 每种模型又有两种选择:层次softmax,或者Negative Sampling。 层次Softmax结合了哈夫曼编码,每个词的编码对应从树根到这个词的路径,路径每个节点计算出的概率的乘积就是当前预测词的概率。 层次softmax的思想其实借鉴了Hinton提出的层次log-bilinear模型,N元层次log-bilinear模型通过上下文预测下一个词w概率的方法为: 词w对应编码中每一位的条件概率的乘积 Negative Sampling的思想就是随机找些负样本,通过计算对比损失来优化,理论上叫作噪声对比估计(Noise Contrastive Estimation),损失函数为: 公式的推导可参考: 其他参考:

word2vec是如何得到词向量的

假设每个词对应一个词向量,假设:
1)两个词的相似度正比于对应词向量的乘积。即:sim(v1,v2)=v1⋅v2sim(v1,v2)=v1⋅v2。即点乘原则;
2)多个词v1∼vnv1∼vn组成的一个上下文用CC来表示,其中C=∑ni=1viC=∑i=1nvi。C|C|C|C|称作上下文C的中心向量。即加和原则;
3)在上下文CC中出现单词AA的概率正比于能量因子e−E(A,C),whereE=−A⋅Ce−E(A,C),whereE=−A⋅C。即能量法则(可参看热统中的配分函数)。
因此:

p(A|C)=e−E(A,C)∑Vi=1e−E(vi,C)=eA⋅C∑Vi=1evi⋅C (1)p(A|C)=e−E(A,C)∑i=1Ve−E(vi,C)=eA⋅C∑i=1Vevi⋅C (1)

其中VV是整个词汇空间。
ref1ref1的分母计算是非常耗时的,下面推导比较方面快速的计算ref1ref1的方法。
把整个词汇空间分成两部分GG和HH,同时在下面的公式中GG和HH也表示各自的词向量中心,并且设AA存在于GG中,则:

p(A|C)=p(A|G,C)⋅p(G|C) (2)p(A|C)=p(A|G,C)⋅p(G|C) (2)

where,

p(G|C)=eG⋅CeG⋅C+eH⋅C=11+e(H−G)⋅C (3)p(G|C)=eG⋅CeG⋅C+eH⋅C=11+e(H−G)⋅C (3)

and,

p(A|G,C)=eA⋅C∑w∈Gew⋅C (4)p(A|G,C)=eA⋅C∑w∈Gew⋅C (4)

引入sigmoidsigmoid函数σ(x)=1/(1+e−x)σ(x)=1/(1+e−x),则

p(G|C)=σ(−(H−G)⋅C)=σ((G−H)⋅C)p(G|C)=σ(−(H−G)⋅C)=σ((G−H)⋅C)

p(G|C)p(G|C)只是简单的计算两部分向量之差,不能再简化了。
另外,根据上述定义,很容易得到这个关系p(G|C)=1−(H|C)p(G|C)=1−(H|C),因为CC要么落在GG要么落在HH。
观看ref4ref4,则知p(A|G,C)p(A|G,C)是另一个版本的p(A,C)p(A,C),只是词汇空间从V→GV→G而已。然后我们继续拆分GG递归的计算下去,最后只需要计算各兄弟部分的向量差而已。这是一个典型的二叉树,划分规则在开始就可确定,如果考虑查询效率的话,就是一个霍夫曼树。其中每个叶子节点表示一个单词,每个中间节点G or HG or H的向量为所有子向量的中心。
展开来就是:

p(A|C)=∏σ((Gi−Hi)⋅C)p(A|C)=∏σ((Gi−Hi)⋅C)


那么问题来了,这个词向量是怎么搞出来了?学习词向量哪家强?

现在我们这里有一堆的语料,一行一行分好词的,语料那是相当的多,以至于它涵盖了自然语言中的所有正确句子,每个单词在它所在的位置都是恰到好处。现在每个单词我们有一个对应的词向量,我们怎么来衡量这批词向量的好坏呢。
这批词向量张成一个自然语言的空间(从线性代数来说这样描述可能不太准确),它自己规定的自然语言空间,在这个空间中,它可以导出给定语料在它的空间中出现的概率。熟悉吧,这就是语言模型。
我们可以根据词向量计算出来每个单词在它的位置出现的概率,然后这整个语料在这个向量空间中出现的概率就等于每个词在其位置出现概率的乘积。
即,

p(T)=∏p(wi|Contexti) (5)p(T)=∏p(wi|Contexti) (5)

TT为整个语料样本,ContextiContexti为单词ii的上下文,理论上是扣除该单词后剩下的所有单词包括位置。当然了,我们只考虑它的前后cc个邻居。
我们的目标是使ref5ref5最大化,实际中是加loglog加负之后的最小化。怎么以高效率优化这个目标函数呢,这是一个典型的运筹学问题,而且还是非线性规划。我要翻一下运筹学的教材了。


word2vec 词向量怎么来的

2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。其实word2vec算法的背后是一个浅层神经网络。另外需要强调的一点是,word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。很多人以为word2vec指的是一个算法或模型,这也是一种谬误。接下来,本文将从统计语言模型出发,尽可能详细地介绍word2vec工具背后的算法模型的来龙去脉。详情:网页链接

上一篇:思乡渔夫赶海视频直播

下一篇:中国上市药品目录集官网