一、简述
- word2vec可以把word用一个低维稠密向量表示,能够解决one-hot编码造成的维数灾难和语义相关问题。
- 训练过程可以看作通过神经网络训练N-gram语言模型,并在训练过程中求出word对应的词向量。
- 模型结构是三层神经网络,Input Layer是词One-Hot编码,Hidden Layer没有激活函数,是线性单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。
- 损失函数:交叉熵,目标函数:最大化似然函数,优化算法:梯度上升。
- word2vec主要有两种模型:
CBOW(Continuous Bag-of-Words):输入上下文,输出当前单词的预测
Skip-Gram:输入单词,输出上下文,适用于大型数据库- 为了降低训练复杂度,输出层采用层次softmax和negative sampling。
二、背景
(一)独热编码的优缺
优点:
- 解决了不好处理离散数据的问题;
- 在一定程度上也起到了扩充特征的作用。
缺点:
- 词袋模型,不考虑词与词之间的顺序;
- 假设词与词相互独立;
- 得到的特征是离散稀疏的。
(二)word embedding
将高维稀疏向量映射到低维稠密向量
- 映射是单设;
- 映射之后不会丢失之前所含的信息。
出现这种现象的原因是,我们得到最后的词向量的训练过程中引入了词的上下文。
(三)w2v和神经网络的区别
- 没有隐层,投隐层把所有词向量相加(或求均值),传统模型是词向量拼接。
- 输出层采用树形结构,降低训练复杂度。
三、模型结构——CBOW
- 输入层:上下文单词的onehot。单词向量空间dim为V,上下文单词个数为C
- 所有onehot分别乘以共享的输入权重矩阵W。V*N矩阵,N为自己设定的数,初始化权重矩阵W
- 所得的向量相加求平均作为隐层向量,size为1*N.
- 乘以输出权重矩阵W'
- 得到向量1*V激活函数处理得到V-dim概率分布,对应V个单词
- 概率最大的index所指示的单词为预测出的中间词与true label的onehot做比较,根据误差更新权重矩阵。
所以,需要定义loss function(交叉熵),采用梯度下降更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的word embedding,W是所有单词的word embedding,也叫做look up table。
四、模型结构——Skip-Gram
- 假设有一个句子“The dog barked at the mailman”
- input word:“dog”
- skip_window:从input word的一侧选取词的数量。如果skip_window=2,那么窗口中的词就是['The', 'dog', 'barked', 'at']。
- num_skips:从整个窗口中选取多少个词作为output word。当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('dog', 'barked'),('dog', 'the')。
- 神经网络基于这些训练数据将会输出一个概率分布,这个概率代表词典中的每个词是output word的可能性。假如我们先拿一组数据 ('dog', 'barked') 来训练神经网络,那么模型通过学习这个训练样本,会得到词汇表中每个单词是“barked”的概率大小。
模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。
下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)
(六)哈夫曼树和层次softmax
哈夫曼树:带权最小二叉树
层次softmax:把词频作为权重,构造哈夫曼树,依次判断,复杂度O(N)到O(logN)
negative sampling:只更新少量负面类,从而减轻了计算量。
hierarchical softmax:将词库表示成前缀树,从树根到叶子的路径可以表示为一系列二分类器,一次多分类计算的复杂度从|V|降低到了树的高度
(七)公式推导
求解目标
(八)实战
from gensim.models import Word2Vec
model = Word2Vec(LineSentence(inp), size=100, window=10, min_count=3,
workers=multiprocessing.cpu_count(), sg=1, iter=10, negative=20)
sentences
:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
size
:特征向量的维度,默认为100
alpha
:初始的学习速率,在训练过程中会线性地递减到min_alpha
window
:窗口大小
min_count
:词频少于min_count次数的单词会被丢弃掉, 默认值为5
max_vocab_size
: 设置词向量构建期间的RAM限制。
sample
: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)。
seed
:用于随机数发生器。与初始化词向量有关。
workers
:用于控制训练的并行数。
min_alpha
:学习率的最小值。
sg
: 默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
hs
:如果为1则会采用层次softmax。如果设置为0(默认),则使用negative sampling。
negative
:如果>0,则会采用negative sampling,用于设置多少个noise words(一般是5-20)。
cbow_mean
:0采用上下文词向量的和,1(default)采用均值。
hashfxn
:hash函数来初始化权重,默认使用python的hash函数。
iter
: 迭代次数,默认为5。
trim_rule
: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)。
sorted_vocab
: 如果为1(默认),则在分配word index 的时候会先对单词基于频率降序排序。
batch_words
:每一批的传递给线程的单词的数量,默认为10000。
参考资料
通俗理解word2vec
fastText原理和文本分类实战,看这一篇就够了
Word2Vec&Doc2Vec总结
Word2Vec的参数解释
【word2vec】算法原理 公式推导
网友评论