由于对nlp还没有整体的了解,只是看了几篇博客。现,只说word2vec。word2vec其实只是工具。
输入是 语料库。
假设是 每个词对应一个连续的特征向量;一个连续平滑的概率模型(此模型的输入是词向量的序列,输出是这段序列的联合概率)
参数是 词向量;概率模型里的参数。
目标是 极大似然。极大似然的方向不同(word到context,context到word),就有了CBOW和Skip-gram两个模型。
输入: 由语料库得到的,one-hot 词向量。概率模型: one-hot 向量* 要学习的词向量,可以得到分布的词向量。再经过神经网络,转化成概率。
word2vec调优(别人的经验总结):
1. 根据具体任务,选一个领域相似的语料。语料对词向量的影响比模型的影响要重要得多得多得多。领域选好了,可能只要 1/10 甚至 1/100 的语料,就能达到一个大规模泛领域语料的效果。有时候语料选的不对,甚至会导致负面效果(比随机词向量效果还差)。当只有小规模的领域内语料,而有大规模的领域外语料时,到底是语料越纯越好,还是越大越好。在我们的实验中,是越纯越好。这一部分实验数据比较丰富,原文相对清楚一些。
2. 在这个条件下,语料越大越好。然后下载一个 word2vec 的新版(14年9月更新)
3. 语料小(小于一亿词,约 500MB 的文本文件)的时候用 Skip-gram 模型
4. 语料大的时候用 CBOW 模型。
CBOW是从输入的上下文信息来预测目标词(例如利用 [the cat sits on the] 来预测 [mat] );而skip-gram模型则是相反的,从目标词来预测上下文信息。一般而言,这种方式上的区别使得CBOW模型更适合应用在小规模的数据集上,能够对很多的分布式信息进行平滑处理;而Skip-Gram模型则比较适合用于大规模的数据集上。
5. 最后记得设置迭代次数为三五十次,维度至少选 50,就可以了。
至于评价标准:很难说,说不清楚。
1种是用类比评价。2种是直接把vector做特征,去看在模型的效果。
gensim 的word2vec 的参数说明:
classgensim.models.word2vec.Word2Vec(sentences=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,cbow_mean=1,hashfxn=,iter=5,null_word=0,trim_rule=None,sorted_vocab=1,batch_words=10000)
sentences: 语料库。 size: 词向量的维度。 alpha :学习率 。 window:窗口长度。
min_count : 出现次数低于此值的词,可以忽略。 sg:0,CBOW。1,skip -gram 。默认是0。
workers:用多少线程去训练模型。
hs= 1, 在训练过程中用到分层softmax。 0 (default),negativeis 非0, 负采样。
negative > 0, 负采样,表示有多少噪音词应该被 drawn (一般为 5-20),默认是 5。 0的话,不用负采样。
cbow_mean: 0, 上下文词向量的和.。默认是1,,上下文词向量的平均. 只在cbow有效。
iter:迭代次数,默认5。
trim_rule: 字典额外的规则。制定某个词是否应该在字典中,是否应该被去掉,或者保留。 如,word count < min_count则丢弃单词.
sorted_vocab:默认为1, 在分配单词索引之前,按降序对词汇表进行排序。
batch_words:对于传递给每个worker(线程)的批处理example的大小(以字表示)。默认10000。
http://blog.csdn.net/szlcw1/article/details/52751314
http://spaces.ac.cn/archives/4233/#不是总结的总结
看到其他人的博客,才知道自己想的,看的,有多肤浅。所谓Embedding层,就是一个one hot的全连接层罢了(再次强调,这里说的完全等价,而不是“相当于”),而词向量,就是这个全连接层的参数;至于Word2Vec,就通过大大简化的语言模型来训练Embedding层,从而得到词向量(它的优化技巧有很多,但模型结构就只是这么简单);词向量能够减少过拟合风险,是因为用Word2Vec之类的工具、通过大规模语料来无监督地预训练了这个Embedding层,而跟one hot还是Embedding还是词向量本身没啥关系。
1. 解释为什么做文本的相似度或者分类时,可以把文本中词向量相加或者求平均之类,就可以有很好的效果。
如果我们用传统的词袋模型,不考虑词序,然后后面接一个全连接层。为了防止过拟合,这个全连接层的参数用预训练的词向量代替,那么结果就是等价于直接将对应的词向量取出,然后求和!也就是说,词向量求和得到句向量,实际上就是传统的词袋模型的等价物!
词向量的表达:最初的one-hot办法,维度由词库的大小决定,维度高,很稀疏,而且不考虑词之间的关系。关于降低维度,最初的方法就是SVD。而SVD分解等价于一个三层的自编码器,这就是一个N维输入,中间节点为n个,N维输出的自编码器方案,也等价于一个SVD分解。
再看word2vec,Word2Vec的一个CBOW方案是,将前后若干个词的词向量求和(embedding),后接一个N维的全连接层,并做一个softmax来预测当前词的概率。而这种词向量求和,等价于原来的词袋模型接一个全连接层(这个全连接层的参数就是词向量表,也是此模型中要求的参数),这样来看,Word2Vec也只是一个N维输入,中间节点为n个,N维输出的三层神经网络罢了,所以从网络结构上来看,它跟自编码器等价,也就是跟SVD分解等价。
http://spaces.ac.cn/archives/4216/
SVD相当于意味着聚类。
p(bj|ai)=∑k,lp(bj|dk)p(dk|cl)p(cl|ai)
每一项都有非常清晰的概率意义:
p(cl|ai)是ai表现为类别cl的概率;
p(dk|cl)是类别cl后接类别dk概率;
p(bj|dk)是已知类别dk时,元素为bj的概率。
我们通过概率模型,为SVD分解赋予了聚类意义。
那么可以思考SVD、HMM、word2vec、als等之间的相同点。理解输入矩阵、输出矩阵、矩阵分解和网络。
我们降维,并不是纯粹地为了减少储存量或者减少计算量,而是“智能”的初步体现。
差别在于:1、Word2Vec的实现方案,可以看作是通过前后词来预测当前词或反过来,而自编码器或者SVD则是通过前后词来预测前后词;
2、Word2Vec最后接的是softmax来预测概率,也就是说实现了一个非线性变换,而自编码器或者SVD并没有。
2. 什么样的词叫相似,用数学的表达是什么。Word2vec得到了词向量,都可以怎么用。
什么叫“相似”:相似度的定义是看场景的。
余弦相似度表达的是,空间向量中,夹角,反向 。word2vec表达的词向量,是基于分布式表达。也就是用上下文的分布来表达词。但是无词序。而余弦值与向量模长没关系,因此它描述的是“相对一致”。那么,余弦相似度大,事实上意味着这两个词经常跟同一批词搭配,或者更粗糙讲,那就是在同一句话中,两个词具有可替换性。
相似也可以说是,另一种相似,可以理解为相关,理解为经常一起出现。在数学上,可以用互信息的大小来描述。