0
点赞
收藏
分享

微信扫一扫

word2vec的算法思想详解(cbow+skipgram+negative sampling))

alanwhy 2022-03-12 阅读 174

参考:
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,就能得到很高的精度:
在这里插入图片描述
所以就需要引入负样本,比如随机从词典中选出非邻居单词的aarontaco,与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 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化
举报

相关推荐

0 条评论