Word2Vec
本篇 Blog 结合了课程 Stanford CS224n 以及本人自己对 Word2Vec 的理解。
首先是传统NLP中的一些概念:
one-hot编码:每个词都是向量,这个向量中只有一个维度的值为1,其与都为0。向量的维度是由单词的个数决定的。
例:有\(hotel\),\(car\),\(money\),\(book\)四个词,于是:\(hotel = [1,0,0,0]\),\(moeny = [0,0,1,0]...\)。
但是我们不难发现的是,字典里有很多单词,这就使每个词向量的维度过于大了。
这样的弊端使Distributional semantic开始被现代深度学习所利用。
Distributional semantic:一个词的含义是由频繁地出现在它身边的词所赋予的。
Word Vector(Embedding):单词在空间中的分布,每个维度坐标的大小是取决于经常出现在本词附件的词所赋予的。这就导致语义、类型相似的词语在空间里的分布很接近。这是因为它们在文本中附近的词语可能很相似。
- 比如:remain和become,e.g.He remains angry,He becomes angry...
介绍了上述概念之后,我们开始接触著名的Word2vec:
首先,顾名思义,2vec指的是文本中的每一个单词\(w\)都有着两个词向量:
- \(v_w\)是\(w\)为中心词时所对应的词向量
- \(u_w\)是\(w\)为文本词时所对应的词向量
Word2vec的基本想法是这样的:
- 训练集是一个非常庞大的文本,我们go through这个文本中的每一个单词:将每一个词都作为中心词(\(c\)),并且将其周围的词作为文本词(\(o\))。使用每个词的词向量来计算概率,从而进一步得到损失函数。
- 运用梯度下降的算法,逐步调整词向量,使损失函数最小化。
下面开始介绍Word2vec具体的公式以及实现:
上图展示了into作为中心词时的情况。对于文本中的每一个词,都有一个固定大小的window,其刻画的是所谓“中心词附近的文本词”。我们需要计算每个中心词附近文本词出现的条件概率\(P(w_{t+i}|w_i)\)。
于是,考虑全局文本,我们定义Likelihood:
注意:
\(\theta\)是一个极大的列向量,它是文本中每一个单词的中心词词向量和文本词词向量的拼接,因此它表示的是所有需要调整的参数
\(j\neq 0\)
类似地,我们定义损失函数\(J(\theta)\),损失函数\(J(\theta)\)应当与Likelihood关系很紧密。同时,我们也应当避免随着文本量的增大而导致的损失函数增大,这是不公平的,于是,我们考虑平均的思想。
注意:
- 运用了公式\(\log_{}{ab} = \log_{}{a}+\log_{}{b}\)
- \(j\neq 0\)
结合上面的Likelihood和损失函数公式,我们发现:降低损失函数,实际上就是在增加Likelihood。
自然地,在定义完毕后,我们考虑:如何计算\(P(w_{t+j}|w_t;\theta)\) ?
不妨先提出观点:两个词向量的点积具有描述这两个词相似性的天然属性。
- 这个观点实际上不难理解,当某两个词向量在某个维度的正负性相同时,这表示着它们在此维度具有一定的相似性,同时它们的点积在此维度被提高;相反,如果它们在某个维度的正负性相反,说明它们在这个维度的相似性较低,因此它们的点积在此维度被削弱。
同时,考虑到概率函数的非负性,我们使用Softmax函数。
综上所述,针对中心词\(c\)以及它附件的文本词o:
其中:
- \(V\)是文本中所有的单词的集合
到此,Word2vec的思想、概念以及公式以及介绍完毕,降低损失函数\(J(\theta)\)的梯度下降的算法将不在这里赘述。
以下内容 Upd on April-4th。
提出一个疑问:如果一个单词具有多种意思,例如:bank,pike...
应该如何表示其词向量?
解决方法由 TACL 2018 中的论文 Linear Algebraic Structure of Word Senses,with Applications to Polysemy 提出。
实际上非常简单:
其中:
\(\alpha_i = \frac{f_i}{f_1+f_2+f_3}\),系数就是不同词义的词出现的频率
我们可能会认为,这个词向量只是不同词向量实现的一种微妙的平衡,但是事实上这种方法的结果非常好。
本页面最近更新:,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:OI-wiki
本页面的全部内容在 协议之条款下提供,附加条款亦可能应用