NLP(一)Word2vec

2019-08-07  本文已影响0人  一个想当大佬的菜鸡

一、简述

  • 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】算法原理 公式推导

上一篇下一篇

猜你喜欢

热点阅读