本文共 3234 字,大约阅读时间需要 10 分钟。
目录
word2vector已经成为NLP领域的基石算法,其从大量的文本预料中以无监督学习语义只是的一种模型,该模型主要包含两种算法CBOW(continuous bag-of-words)和skip-gram。两中模型的区别就在于,CBOW的输入为目标特征词的上下文相关词(词数≤2*windows)对应向量所构成的向量矩阵,而Skip-gram则与CBOW正好相反,Skip-gram的输入为目标特征词的词向量,而输出则为目标特征词的上下文相关词词向量矩阵
【NOTE:括号内()为解释内容】:
- 输入层:上下文单词的OneHot向量矩阵M_{2C, V} (假设当前语料库中共有V个单词,上下文窗口大小为C)
- 所有onehot分别乘以共享的输入权重矩阵W_{ V, N}(计算耗时). (V*N矩阵,N为自己设定的数,初始化权重矩阵W)
- 所得矩阵各行相加求平均作为隐层向量M_{1, N}, (size为1*N).
- 乘以输出权重矩阵W_{ N, V}(计算耗时),得输出向量为M_{1, V}
- 由于我们的目标是反映输出层中的中间词与其上下文单词之间的关系,因此,需要将输出向量中的值转变为概率。因此,Word2vec通过使用softmax函数(计算耗时)将输出层神经元的激活值转换为概率来实现此目的。
- 得到向量 {1*V} 激活函数处理得到V-dim概率分布 (PS: 因为是onehot嘛,其中的每一维斗代表着一个单词),概率最大的index所指示的单词为预测出的中间词(target word)
- 与true label的onehot做比较,误差越小越好。所以,需要定义loss function(一般为交叉熵代价函数(独热编码简化交叉熵的计算)),采用梯度下降算法更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。
【模型缺点】
- 用于CBOW模型训练的语料库通常都有10^6以上的词数,因此,在矩阵计算以及softmax概率转换时的时间消耗是无法容忍的。针对上述问题,提出了一种基于哈夫曼树的优化CBOW算法,具体描述如下:
【带权路径长度(WPL)】:设二叉树有n个叶子节点,每个叶子节点带有权值w_{k},从根节点到每个叶子节点的长度为l_{k},则每个叶子节点的带权路径长度之和就是:
而哈夫曼树的目标就是将带权路径长度降到最小。
(从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这样的性能显然是对于一个embedding操作来讲是得不偿失的,而哈夫曼树的上述特征性则有效的降低了高频词词向量的维度,减小了softmax层的计算量)
【构造思路】:每次将权值最小的两棵二叉树进行合并
【实例】:假定存在权值序列{1, 3, 4, 2, 5},则具体流程如下
- 对权值从小到大进行排列{1, 2, 3, 4, 5}
- 从排列中选择权值最小的两棵树进行合并,合并后的根结点权值为两个叶子节点权值的和,并将该根结点加入序列并从小到大重新排序
- 重复步骤2,直到序列中无权值为止
哈夫曼编码的过程实际上就是2.2.2.中的过程,只不过,需要额外添加一些信息:左子树编码为0,右子树编码为1.
则上述各数字的编码为:
1:000
2:001
3:01
4:10
5:11
- 传统神经概率语言模型的主要目的在于得到一种语言模型(也就是两个权重矩阵),次要目的是得到词向量。然而,对于word2vec,其主要目的是得到词向量。
- 那么,换一种角度思考就是:在已知词ω上下文Context(ω)的情况下该词为ω的概率,也就是最大化p(ω|Context(ω))
【具体流程】
- Context(ω):表示目标词ω的上下文单词
- c: 表示上线文窗口大小
- v(Context(ω)): 表示目标词上下文单词的OneHot编码向量
- Xω: 表示目标词ω的上下文单词的OneHot编码向量的和向量
- 输入层:上下文单词的OneHot向量矩阵M_{2C, V}
- 投影层:将神经概率语言模型中的拼接模式,替换为累加模式,得到累加向量Xω_{1, V},具体累加同时如下:
- 输出层:以语料中出现的词为叶子节点,以各词在语料中出现的次数当做权值构造一棵哈夫曼树,该树中,叶子节点总共有N个(N=|D|)。然后,并将投影层所得的累加向量输入哈夫曼树,构造极大似然估计,并通过梯度上升法进行求解,进而调整目标词所对应的上下文的词向量。
【构造极大似然估计】
【说明】
import pandas as pdfrom gensim.models import word2vecfrom gensim.models.word2vec import LineSentence# 加载语料库# LineSentence(source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None)# 迭代包含以下句子的文件:一行=一个句子。单词必须已经过预处理并用空格隔开。s = LineSentence("00_data\\result\\item_title_vector.txt", max_sentence_length=100)# 模型训练# Word2Vec(entences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5,# max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,# sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,# trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH, compute_loss=False, callbacks=(),# max_final_vocab=None)# sg=0: CBOW; sg=1:Skip-gram# window: 上下文窗口大小model = word2vec.Word2Vec(s, sg=0, min_count=1, window=5)# # 模型保存# model.save("00_data\\result\\item_title_model")# 模型测试print(model.vector_size)print(model["情侣装"])print(model.wv.get_vector("情侣装"))print(model.wv.similarity("情侣装", "四角内裤"))
在交流中学习,在交流中进步!
欢迎点赞、评论、关注!(部分内容参考:)
转载地址:http://qpxtf.baihongyu.com/