一、Word2vec简介
WordW2vec是google在2013年的论文《Efficient Estimation of Word Representations inVector Space》中提出的。顾名思义,是一个词向量模型,也就是将字词转为向量表示。
Word2vec模型包含两种训练词向量的方法:CBOW和skip-gram。其中CBOW的基本思想是通过该关键词的上下文的词语来预测这个关键词:而skip-gram的基本思想与CBOW相反,是通过该关键词来预测上下文的词语。如下图所示:
二、训练过程
- CBOW
具体如上图所示:
- 首先将关键词的上下文词语进行独热编码,得到的向量长度为词表长度(所有训练语料中不同的词的总个数),形状为
的向量,该词的位置为1,其余位置为0。
- 将每个上下文词语的独热编码乘以一个
的权重矩阵
,每个词语都乘以同一个权重矩阵
。得到多个
的向量。
- 对于这么多个
的向量,采用相加求平均的方法整合成一个
的向量。
- 然后将这个
的向量与该关键字对应的
的矩阵
,得到一个
的向量。
- 对于这个
的向量需要通过softmax层归一化后得到的向量为关键词的预测向量,该向量不是独热编码,而是有许多浮点数值的概率组成的。概率最大的位置为关键词独热编码为1的位置。
- 将关键词的预测向量与标签向量(独热编码的向量)进行一个误差计算,通常采用交叉熵。
- 将这个误差反传回神经元,每一次前向计算后都会将误差反传,从而达到调整权重矩阵
和
的目的,与BP神经网络同理。
当损失达到最优则训练结束,便得到了我们需要的权重矩阵,通过这个权重矩阵便可根据输入的独热向量形成词向量。
- skip-gram
其实skip-gram就是将CBOW反过来操作,如以上那张CBOW的过程图一样,只不过用上面同样的步骤从右边开始解读。明白的话这部分的训练步骤可以不看。
- 首先将关键词进行独热编码。
- 将每个关键词的独热编码乘以一个
的权重矩阵
。
- 然后将这个关键词的
的向量与该关键字的上下文词语词向量(共用一个)的
矩阵
相乘,得到多个
的向量。
- 对于这些
的向量需要通过softmax层归一化后得到的向量为关键词上下文词语的预测向量。
- 将关键词上下文词语的预测向量与标签向量(独热编码的向量)进行一个误差计算,通常采用交叉熵,对得到的多个交叉熵损失进行求和。
- 将这个误差反传回神经元,每一次前向计算后都会将误差反传,从而达到调整权重矩阵
和
的目的。
- 最后得到形成词向量的权重矩阵是
。
三、优缺点
- 优点
- 由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好。
- 比之前的 Embedding方法维度更少,所以速度更快
- 通用性很强,可以用在各种 NLP 任务中
- 缺点
- 由于词和向量是一对一的关系,所以多义词的问题无法解决。
- Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化。
注意:word2vec有负采样和层次softmax的改进,也是知识点和难点,详细可以产靠这篇博客:http://t.csdn.cn/Nie7O
四、代码示例
这里没有弄很详细的代码,就调用了word2vec的一个包,也就是一个简单的使用例子,知道怎么使用就行,具体的模型参数网上都可以查得到,也不多:
import logging
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
from all_model_param import *
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',level=logging.INFO)
model = Word2Vec(
LineSentence(open('file_path', 'r', encoding='utf8')),
sg=0,
epochs=300,
vector_size=word_vector_size,
window=5,
min_count=1,
workers=8
)
# 词向量保存
model.wv.save_word2vec_format('word2vec/data.vector', binary=False)
# 模型保存
model.save('word2vec/test.model')