Word2Vec实现


文章目录

  • Word2Vec实现
  • 一、Word2Vec原理
  • 损失函数-负采样
  • 二、主流实现方式
  • 1.gensim
  • 2.jiaba
  • Word2Vec调参
  • 缺点:
  • 总结



一、Word2Vec原理

    一句话,word2vec就是用一个一层的神经网络(CBOW的本质)把one-hot形式的词向量映射为分布式形式的词向量,为了加快训练速度,用了Hierarchical softmax,negative sampling 等trick。

word2vec 实践 word2vec案例_人工智能[0,1,0,…,V], 经过初始化后的一个权重矩阵word2vec 实践 word2vec案例_机器学习_02后(shape=VxN, 其中V是语料库中的V维,N代表Embedding之后的维度)得到该词Embedding之后的1xN的词向量。

    然后再跟另一个NxV大小的系数矩阵W2相乘得到1xV的输出层

word2vec 实践 word2vec案例_人工智能_03


多词情况下,需要把上下文各词的Embedding加和取平均成一个向量

word2vec 实践 word2vec案例_word2vec 实践_04

    以“我爱北京天安门”这句话为例。假设我们现在关注的词是“爱”,C=2时它的上下文分别是“我”,“北京天安门”。CBOW模型就是把“我” “北京天安门” 的one hot表示方式作为输入,也就是C个1xV的向量,分别跟同一个VxN的大小的系数矩阵W1相乘得到C个1xN的隐藏层hidden layer,然后C个取平均所以只算一个隐藏层。这个过程也被称为线性激活函数(这也算激活函数?分明就是没有激活函数了)。然后再跟另一个NxV大小的系数矩阵W2相乘得到1xV的输出层,这个输出层每个元素代表的就是词库里每个词的事后概率。输出层需要跟ground truth也就是“爱”的one hot形式做比较计算loss。

这里需要注意的就是V通常是一个很大的数比如几百万,计算起来相当费时间,除了“爱”那个位置的元素肯定要算在loss里面,word2vec就用基于huffman编码的Hierarchical softmax筛选掉了一部分不可能的词,然后又用nagetive samping再去掉了一些负样本的词所以时间复杂度就从O(V)变成了O(logV)。Skip gram训练过程类似,只不过输入输出刚好相反。

损失函数-负采样

以CBOW模型为例,训练时,最容易想到的是,得到输入序列的SUM embedding之后,通过一个softmax层,计算出是字典V中每个词的概率,再构建交叉熵之类的损失函数。然而,直接对词典里的V个词计算相似度并归一化,显然是极其耗时的。

为此作者提出了层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)两种损失层。层次Softmax(Hierarchical Softmax)原理很有意思,但是计算起来还是比NCE要复杂。因此,真正应用比较多的是NCE,这里就详细介绍一下NCE的原理。

比如我们有一个训练样本,中心词是w,它周围上下文共有2c个词,记为context(w)。由于这个中心词w,的确和context(w)在实际语料中真实存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和w不同的中心词wi,i=1,2,…neg,这样context(w)和wi们 就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,得到负采样对应每个词wi对应的模型参数θi和每个词的词向量。

二、主流实现方式

1.gensim

    Gensim是在做自然语言处理时较为经常用到的一个工具库 它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法。

    对于word2vec模型,模型的输入是分完词的语料库,形式类似于list:

[ [‘我’,‘喜欢’,‘踢’,‘足球’],
  [‘罗纳尔多’,‘也’,‘喜欢’,‘踢’,‘足球’],
  [‘罗纳尔多’,‘是’,‘世界足球’,‘先生’]
]

至于如何得到分词结果,除了手工分词外,主要使用jieba分词,详情见下一节

分词后得到的语料库sentences,即可送入word2vec

model = word2vec.Word2Vec(sentences, hs=1, min_count=1, window=3, vector_size=100)

2.jiaba

Word2Vec调参

sentences

可以是list(list的每一成员对应每行分词后的结果),对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建

sg

用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法

size

是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百

window

表示当前词与预测词在一个句子中的最大距离是多少

alpha

学习速率

seed

用于随机数发生器。与初始化词向量有关

min_count

可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5

hs

Word2vec 经常采用 2 种加速方式,如果为1则会采用hierarchica·softmax技巧。如果设置为0(default),则negative sampling会被使用。

negative

如果>0,则会采用negativesampling,用于设置多少个noise words

cbow_mean

如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用

hashfxn

hash函数来初始化权重。默认使用python的hash函数

缺点:

  • 由于词和向量是一对一的关系,所以多义词的问题无法解决。
  • Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。