赞
踩
gensim中word2vec的参数见文档:
https://radimrehurek.com/gensim/models/word2vec.html
class gensim.models.word2vec.Word2Vec(
sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5,
max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75,
cbow_mean=1, hashfxn=, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False,
callbacks=(), max_final_vocab=None)
· sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
· window:表示当前词与预测词在一个句子中的最大距离是多少
· alpha: 是学习速率
· seed:用于随机数发生器。与初始化词向量有关。
· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
· workers参数控制训练的并行数。
· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
· negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
· hashfxn: hash函数来初始化权重。默认使用python的hash函数
· iter: 迭代次数,默认为5
· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
· sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
· batch_words:每一批的传递给线程的单词的数量,默认为10000
语料的影响
实际发现在微博,违法色情的词训练的比较好,因为黑产用这种聚到来推广。而在评论,骂人的词训练的比较好,在新闻,则是常见的正规的词训练的比较好。
为什么会出现这种情况呢?
因为 word2vec 的原理就是 一个词预测前后词 或者 前后词预测当前词,使得概率最大化。这就导致相似的句子,相同部位的词会相似,比如微博和新闻的句子的整体分布是不一样的。。挨的近的词,也是相似的,比如新闻长文多,句式复杂,微博短文多。
一些参数的选择
skip-gram (训练速度慢,对罕见字有效),CBOW(训练速度快)。一般选择Skip-gram模型;
训练方法:Hierarchical Softmax(对罕见字有利),Negative Sampling(对常见字和低维向量有利);
sample 降采样越低,对高频词越不利,对低频词有利。可以这么理解,本来高频词 词被迭代50次,低频词迭代10次,如果采样频率降低一半,高频词失去了25次迭代,而低频词只失去了5次。一般设置成(1e-3~1e-5)。降采样会降低高频词对上下文影响的权重。
window 窗口大小影响 词 和前后多少个词的关系,和语料中语句长度有关,建议可以统计一下语料中,句子长度的分布,再来设置window大小。一般设置成8。Skip-gram通常选择10左右,CBOW通常选择5左右。
iter 影响训练次数,语料不够的情况下,可以调大迭代次数。spark 版本有bug,迭代次数超过1,训练得到的词向量维度值超大。
workers workers 用于设定训练的并行处理,以加快训练速度。workers设为1可复现训练好的词向量,但速度稍慢。worker 这个参数起作用的前提是安装了 Cython,否则只能用单核。
参数选择必然涉及原理剖析。不了解原理很难理解调参的意义。
参考zhihu这里
cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而往往这也是最耗时的部分),复杂度大概是O(V);
skip-gram是用中心词来预测周围的词。skip-gram进行预测的次数是要多于cbow的:因为每个词在作为中心词时,都要使用周围词进行预测一次。这样相当于比cbow的方法多进行了K次(假设K为窗口大小),因此时间的复杂度为O(KV),训练时间要比cbow要长。
通俗地说,在skip-gram里面,相当于是1个学生 VS K个老师,每个词在作为中心词的时候,受到窗口中周围词的训练;
而cbow是用周围词预测中心词,相当于K个学生 VS 1个老师,窗口中周围的词都要通过中心词的训练来学习。
word2vec中,基于Hierarchical Softmax(分层softmax)的实现用到了Huffman树。
与Hierarchical softmax相对的是负采样实现,这两种实现方法都可以看作是softmax的一种近似,来优化softmax的计算效率问题。
从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这样的性能显然是对于一个embedding操作来讲是得不偿失的。
与之前的神经网络语言模型(NNLM)相比,我们的霍夫曼树的内部节点都与之前的神经网络的隐含层神经元相似,其中,根节点的单词向量与投影后的单词向量相对应,所有叶子节点类似于之前神经网络softmax输出层的神经元。叶节点的数量就是词汇表的大小。在该模型中,通过Huffman树的向下搜索,逐步将隐含层映射到输出层:
由哈夫曼树的建树规则不难知道,每个叶子节点代表一个目标词,同时每个目标词也有一条路径代表了其编码规则。在word2vec中,我们采用逻辑回归的方法,规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数,对于n1-n2-n3-n4这条路径来讲,神经网络训练的目标就是要让走这条路径的可能性最大。
以CBow为例,CBOW模型的第一层是输入层,输入已知上下文的词向量。中间一层投影层又称为线性隐含层,它将所有输入的词向量累加。第三层是一棵哈夫曼树, 树的的叶节点与语料库中的单词一一对应,而树的每个非叶节点是一个二分类器(一般是softmax感知机等), 树的每个非叶节点都直接与隐含层相连。
在给定输入层提供的单词的向量表示的情况下,输出层中的每个向量实质上决定了在每个内部节点处沿霍夫曼树向下走时左移或右移的概率。
1,我们每次只对窗口中出现的几个单词进行更新,但是在计算梯度的过程中,我们是对整个参数矩阵进行运算,而参数矩阵中的大部分值都是0;
2,目标函数是softmax函数,分母需要把窗口中所有单词的“得分”都算出来再求和,效率低下。
可以说,负采样是对softmax的一种近似。负采样的优点在于不会引入额外参数。
Ref:
https://zhuanlan.zhihu.com/p/29364112
Word2Vec的参数解释(选择与对比)
word2vec模型原理(一):基于哈夫曼树的word2vec
word2vec的数学原理详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。