赞
踩
NNLM模型的基本思想可以概括如下:
将整个模型拆分成两部分加以理解:
缺点:
与NNLM相比,word2vec的主要目的是生成词向量而不是语言模型,在CBOW中,投射层将词向量直接相加而不是拼接起来,并舍弃了隐层,这些牺牲都是为了减少计算量。不经过优化的CBOW和Skip-gram中 ,在每个样本中每个词的训练过程都要遍历整个词汇表,也就是都需要经过softmax归一化,计算误差向量和梯度以更新两个词向量矩阵(这两个词向量矩阵实际上就是最终的词向量,可认为初始化不一样),当语料库规模变大、词汇表增长时,训练变得不切实际。为了解决这个问题,word2vec支持两种优化方法:hierarchical softmax 和negative sampling。
CBOW 是 Continuous Bag-of-Words Model 的缩写,是一种根据上下文的词语预测当前词语的出现概率的模型。其学习目标是最大化对数似然函数:
L
=
∑
w
l
o
g
p
(
w
∣
c
o
n
t
e
x
t
(
w
)
)
L=\sum_{w}logp(w|context(w))
L=w∑logp(w∣context(w))
上图输出层的树形结构即为Hierarchical Softmax,每个叶子节点代表语料库中的一个词语,以各词在语料中出现的次数当权值构造Huffman树,于是每个词语都可以被01唯一地编码。哈夫曼树,是带权路径长度最短的树,哈夫曼树保证了词频高的单词的路径短,词频相对低的单词的路径长,这种编码方式很大程度减少了计算量
考虑 w = “足球” 的情形
对目标函数取对数似然:
L
=
∑
w
l
o
g
p
(
w
∣
c
o
n
t
e
x
t
(
w
)
)
L=\sum_{w}logp(w|context(w))
L=w∑logp(w∣context(w))
随机梯度上升:
考虑
L
(
w
,
j
)
L(w,j)
L(w,j) 关于
θ
j
−
1
w
θ^w_{j-1}
θj−1w 的梯度计算:
考虑
L
(
w
,
j
)
L(w,j)
L(w,j) 关于
x
w
x_w
xw 的梯度计算:
最终目的是求词典中每个词的词向量,而这里
x
w
x_w
xw 是
C
o
n
t
e
x
t
(
w
)
Context(w)
Context(w)中各词词向量的累加,直接将梯度的更新贡献到每个词中:
CBOW模型中采用随机梯度上升法更新各参数伪代码(Hierarchical Softmax):(其中 3.3 和3.4不能交换)
Negative Sampling目的:提高速度、改进模型质量
在CBOW中给定训练样本,即一个词w和它的上下文Context(w),Context(w)是输入,w是输出。那么w就是正例,词汇表中其他的词语的就是负例。假设我们通过某种采样方法获得了负例子集NEG(w)。对于正负样本,分别定义一个标签:(正样本为1,负样本为0)
为了增大正样本的概率同时降低负样本的概率,最大化
g
(
w
)
g(w)
g(w),给定语料库C,函数G作为整体优化目标:
G
=
∏
w
∈
C
g
(
w
)
G=\prod_{w\in C}g(w)
G=w∈C∏g(w)
随机梯度上升:
考虑
L
(
w
,
u
)
L(w,u)
L(w,u) 关于
θ
u
θ^u
θu 的梯度计算:
CBOW模型中采用随机梯度上升法更新各参数伪代码(Negative Sampling):
Skip-gram只是逆转了CBOW的因果关系而已,即已知当前词语,预测上下文。其学习目标是最大化对数似然函数:
L
=
∑
w
l
o
g
p
(
c
o
n
t
e
x
t
(
w
)
∣
w
)
L=\sum_{w}logp(context(w)|w)
L=w∑logp(context(w)∣w)
随机梯度上升:
考虑
L
(
w
,
u
,
j
)
L(w,u,j)
L(w,u,j) 关于
θ
j
−
1
u
θ^u_{j-1}
θj−1u 的梯度计算:
Skip-gram模型中采用随机梯度上升法更新各参数伪代码(Hierarchical Softmax):(其中 3 和4不能交换)
将优化的目标函数由原来的
G
=
∏
w
∈
C
g
(
w
)
G=\prod_{w\in C}g(w)
G=∏w∈Cg(w) 改写成:
G
=
∏
w
∈
C
∏
u
∈
C
o
n
t
e
x
t
(
w
)
g
(
u
)
G=\prod_{w\in C}\prod_{u\in Context(w)}g(u)
G=w∈C∏u∈Context(w)∏g(u)
在上式中,用
w
w
w 替换
u
u
u,用
w
w
w 替换
w
w
w,用
u
u
u 替换
z
z
z
随机梯度上升:
Skip-gram模型中采用随机梯度上升法更新各参数伪代码(Negative Sampling):
给定一个词,如何生成NEG(w):任何采样算法都应该保证频次越高的样本越容易被采样出来。基本的思路是对于长度为1的线段,根据词语的词频将其公平地分配给每个词语:
gensim文档:https://radimrehurek.com/gensim/models/word2vec.html
在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法需要注意的参数有:
from gensim.models import word2vec // 直接用gemsim提供的API去读取txt文件,读取文件的API有LineSentence 和 Text8Corpus, PathLineSentences等。 sentences = word2vec.LineSentence("data.txt") // 模型的训练 model = gensim.models.Word2Vec(sentences, size=200, sg=1, iter=8) // 或: model= Word2Vec() model.build_vocab(sentences) model.train(sentences,total_examples = model.corpus_count,epochs = model.iter) // 模型的保存 model.save("word2vec.model") //保存可以在读取后追加训练 model.wv.save_word2vec_format("./word2Vec" + ".bin", binary=True) // 保存不能追加训练 model.wv.save_word2vec_format("./word2Vec" + ".txt", binary=False) // 保存不能追加训练 //模型的加载 model = Word2Vec.load("word2vec.model") wordVec = gensim.models.load_word2vec_format("word2Vec.bin", binary=True) wordVec = gensim.models.load_word2vec_format("word2Vec.txt", binary=False) // 最省内存的加载方法 model = gensim.models.Word2Vec.load("word2vec.model") word_vectors = model.wv del model word_vectors.init_sims(replace=True) // 引入KeyedVectors 保存和加载bin,txt模型 wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin", binary=True) // 载入 .bin文件 wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin.gz", binary=True) // 载入 .bin文件 wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.txt", binary=False) // 载入 .txt文件 //增量训练 model = gensim.models.Word2Vec.load("word2vec.model") model.train(more_sentences) // Word2Vec应用 model.wv['man'] // 获取词向量 model.wv.similarity('first','is') // 两个词的相似性距离 model.wv.doesnt_match("input is lunch he sentence cat".split()) // 找出不同类的词即不匹配的词语 model.wv.similar_by_word('沙瑞金'.decode('utf-8'), topn =100) // 找出某一个词向量最相近的词集合 model.wv.most_similar(['man']) //计算一个词的最近似的词,倒排序 for i in model.wv.most_similar(u"戏剧"): print (i[0],i[1]) // 词,分数 model.wv.most_similar(positive=['first', 'second'], negative=['sentence'], topn=1) // 计算两词之间的余弦相似度 model.wv.n_similarity(list1,list2) //计算两个集合之间的余弦似度
参考:
https://blog.csdn.net/itplus/article/details/37969979
https://www.cnblogs.com/sxron/p/5975596.html
https://www.cnblogs.com/pinard/p/7278324.html
https://radimrehurek.com/gensim/models/word2vec.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。