参考:
https://easyai.tech/ai-definition/word2vec/
https://jalammar.github.io/illustrated-word2vec/
Word2vec 是 Word Embedding 词嵌入的方法之一。
Word Embedding 就是将「不可计算」「非结构化」的词转化为「可计算」「结构化」的向量。
Word2vec 有 2 种训练模式。
CBOW(Continuous Bag-of-Words Model)
通过上下文来预测当前值。相当于一句话中扣掉一个词,让你猜这个词是什么。
Skip-gram (Continuous Skip-gram Model)
用当前词来预测上下文。相当于给你一个词,让你猜前面和后面可能出现什么词。
训练过程如下。
滑动窗口,产生训练集:
得到训练集和目标:
看第一个训练样本,先用初始化的模型训练,得到完全不准的概率预测(没关系,以后慢慢修正)
模型进行三大步骤:1. 查看嵌入值 2. 计算预测结果 3. 映射到整个字典上。 产出一个预测向量:
计算预测值与实际值向量的差异,得到错误向量:
用错误向量来反馈模型训练:
对于每个训练集样本,重复以上训练步骤。训练完所有样本后,就完成了一次epoch。
重复多个epoch,就能得到训练模型,从中提取出嵌入矩阵(embedding matrix),以供后续使用。
Negative Sampling 负采样
要解决的问题,模型进行预测时的第三个步骤,耗时太长:
为了提高性能,先调整模型的功能,从预测邻居单词,改为预测两个单词是邻居的概率:
这就把神经网络替换成了逻辑回归模型,计算起来就快的多了。相应的,训练集要调整为:
但这样训练,可能会训练出虚假准确(a smartass model)的模型。因为只有正样本,那它干脆全预测1,就能得到很高的精度:
所以就需要引入负样本,比如随机从词典中选出非邻居单词的aaron
和taco
,与not
共同组成负样本:
跳字模型和负采样 Skipgram with Negative Sampling (SGNS)
至此,已经涵盖了word2vec的核心思想:Skipgram 和 Negative Sampling,合称SGNS。
word2vec训练过程
准备两个矩阵,先随机赋值:
目标是训练出正确的Embedding向量矩阵。先取第一个正样本及其相关的负样本:
正样本在Embedding矩阵里查值,负样本在Context矩阵里查值:
计算二者的点乘。
为了转换成概率,再用sigmod()转换一下。
最后计算差值,根据差值就可以调整Embedding矩阵了(不用管Context):
接下来用每个训练集都进行上述操作。用完整的训练集训练若干次。
最后,可以丢掉Context矩阵,只保留Embedding矩阵即可。
重要参数:窗口大小和负样本
word2vec有两个重要超参数:窗口大小和负样本。
窗口大小
较小的窗口(2-15)得出的结果中,相似性高表示可互换程度高(不光近义词可以,反义词也可以相互替换,比如good和bad)。
较大的窗口(15-50)得出的结果中,相似度更多的表示相关性,
gensim的默认窗口大小是5,前后各取2词。
负采样
原始论文中表示可以用5-20个负样本;如果训练集足够大,2-5个就足够了。
gensim中默认也是5个负样本。
优缺点
优点:
- 由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好(但不如 18 年之后的方法)
- 比之前的 Embedding方 法维度更少,所以速度更快
- 通用性很强,可以用在各种 NLP 任务中
缺点:
- 由于词和向量是一对一的关系,所以多义词的问题无法解决。
- Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化