目录
可以直接将Sentence/Document中所有词的向量取均值作为Sentence/Document的向量表示,但是这样会忽略了单词之间的排列顺序对句子或文本信息的影响。
1、DM模型在训练时,首先将每个文档ID和语料库中的所有词初始化一个K维的向量,然后将文档向量和上下文词的向量输入模型,隐层将这些向量累加(或取均值、或直接拼接起来)得到中间向量,作为输出层softmax的输入。在一个文档的训练过程中,文档ID保持不变,共享着同一个文档向量,相当于在预测单词的概率时,都利用了真个句子的语义。
2、DBOW模型的输入是文档的向量,预测的是该文档中随机抽样的词。
用一句简单的话说,就语言模型就是计算一个句子的概率大小的这种模型。有什么意义呢?一个句子的打分概率越高,越说明他是更合乎人说出来的自然句子。
预料足够大时,利用Bayes,可近似为:
(1) (2)
平滑处理:
假设一个词至于它前面的 n-1 个词有关。n-garm主要工作是统计词串在预料出现在次数及平滑处理(加1)。概率值计算好后就存储起来,下次要计算一个句子的概率时,只要找到相关的概率参数,提出来连乘即可。
带权路径长度:从根节点到当前节点的路径长度乘以当前节点的权值;
树的带权路径为所有叶子节点的带权路径长度之和;
给定n个叶子节点n个权值,构造一棵二叉树,若它的带权路径之和达到最小,则为最优二叉树,即Huffman树。
1、词向量:
one-hot representation 容易造成维数灾难;
word2Vec采用 distributed representation: 将每一个词映射成一个短向量(有很多非0分量,相对分散,相当于把词的信息分散到各个分量中去了),所有向量构成一个词向量空间,每个向量可视为该空间中的一个点,然后可根据词之间的距离来判断相似性;
输入层是当前词上下文窗口内的词的词向量(k维,随机初始化);将向量加起来就是隐藏层的k个节点;输出层是一个二叉树( 哈夫曼树Haffman),叶节点代表语料里所有的词(语料含V个词,就有|V|个独立节点),这样,对于叶节点的每一个词,就会有一个全局唯一的编码,形如"010011"。我们可以记左子树为1,右子树为0。接下来,隐层的每一个节点都会跟二叉树的内节点有连边,于是对于二叉树的每一个内节点都会有K条连边,每条边上也会有权值;Haffman它以语料中出现过的词当叶节点,以各词在语料中出现的次数当权值构造。
训练过程:
1、根据语料库建立词汇表V,V中的所有词均初始化一个K维向量,并根据词频构建哈夫曼树;
2、将语料库中的文本依次进行训练,以一个文本为例,输入当前单词Wi的上下文窗口内的词的词向量,由隐藏层累加求和得到k维中间向量Wnew,Wnew在哈夫曼树种沿某个特定路径到达某个叶子节点(即当前词Wi);
3、由于知道Wi,根据其哈夫曼编码,可以确定从根节点到叶子节点的正确路径,也确定了路径上所有分类器(非叶子节点)上应作出的预测概率,相乘就可得到Wi在当前网络下的概率,那么残差就是(1-P),于是可以采用梯度下降法调整路径中非叶子节点的参数,以及最终上下文词的向量,使得实际路径向正确路径靠拢,n次迭代后收敛,即可得到每个词的词向量表示。
总结:实际上我们知道要的是哪个词(Wn),而Wn是肯定存在于二叉树的叶子节点的,因此它必然有一个二进制编号,如"010011",那么接下来我们就从二叉树的根节点一个个地去便利,而这里的目标就是预测这个词的二进制编号的每一位!即对于给定的上下文,我们的目标是使得预测词的二进制编码概率最大。
参考:https://blog.csdn.net/zhoubl668/article/details/24319529
https://blog.csdn.net/mpk_no1/article/details/72458003
输入时一个词的词向量,不用累加;用当前词预测上下窗口的每一个词。过程类似cbow。
CBOW :已知目标词的上下文,来预测目标词;
Skip-gram:给定目标词,预测上下文的词;
与神经网络语言模型(NNLM)的区别:
NNLM:输入层、投影层、隐藏层、输出层;
1)输入:前者为向量的前后拼接,后者为求和;
2)前者有隐藏层,后者无;
3)输出:前者是线性结构,后者是树结构(Huffman树);
因为模型的大部分计算集中在隐藏层与输出层之间的矩阵向量的运算上,CBOW通过去掉隐藏层,,输出改为Huffman树,为hierarchical softmax(分层) 技术奠定了基础;
在文本分类中,传统的将词转为词向量的方法有:
(1)one-hot representation,大量0值,数据稀疏,且易造成维度爆炸;
(2)tfidf向量化:输出的向量不包含次序信息,深度神经网络学不到什么东西,一般用ml的方法如贝叶斯,svn进行分类即可;
(3)word2vec:神经网络(可看成四层结构:输入层、投影层、隐藏层、输出层),因隐藏层到输出层的计算量巨大,所以word2Vec省略了隐含层,仅包含输入层、投影层、输出层;
输入向量为随机初始化的词向量;
两种方法:CBOW、Skip-gram;以CBOW为例,样本(Context(w),w),输入为每个词的词向量v,在投影层向量累加x,输出的是softmax(x);后提出两种加速训练的方法:softmax和随机负梯度采样;
1)已知目标词的上下文词,从而预测目标词的概率;
2)层次softmax:输出是haffman树,每个节点是一个二分类,左边为负样本(1),右边为正样本(0),p(Context(w) | w)的概率为每个节点的概率之积,我们的目标是 p(Context(w) | w)越大越好,代入最大似然函数,得到目标函数:
用随机梯度上升法更新参数(每次用一组样本所有的参数),对输入和非叶子结点向量进行求导;对每个样本(Context(w) , w),从根节点出发至节点(w)的所有节点依次进行二分类,由上往下更新参数和关于输入的偏导数 ,最后将梯度值贡献到每个分量上去,以此对每一个上下文单词Context(w)进行更新;
3)随机负采样:以(Context(w) , w)为正样本,(Context(w) , u)为负样本,u属于字典D,每次取一个正样本的同时要取一定数量的负样本组成样本集(选到自己就跳过去),每次一个样本去更新参数。更新完毕后,对每个Context(w) 中词的的词向量更新;
1)已知目标词,预测上下文的概率;
2)对每个上下文单词,先依次遍历结点进行参数更新,再更新目标词的向量;
3)随机负采样类似word2vec;
随机负采样容易猜到高频词如:the、a、an....,就好比一个圆,高频词占的面积会大一些,投飞镖被刺中的概率也大一些,为解决这个问题,求某个词的概率时上下取频率的3/4次方来均衡;;
CBOW每次更新context(w)个词的词向量,skip-gram每次更新一个词(目标词)的词向量;haffman树在每个结点出更新参数,随机负采样是每次用一个样本去更新参数;
要讲GloVe模型的思想方法,我们先介绍两个其他方法:
一个是基于奇异值分解(SVD)的LSA算法,该方法对term-document矩阵(矩阵的每个元素为tf-idf)进行奇异值分解,从而得到term的向量表示和document的向量表示。此处使用的tf-idf主要还是term的全局统计特征。
另一个方法是word2vec算法,该算法可以分为skip-gram 和 continuous bag-of-words(CBOW)两类,但都是基于局部滑动窗口计算的。即,该方法利用了局部的上下文特征(local context)
LSA和word2vec作为两大类方法的代表,一个是利用了全局特征的矩阵分解方法,一个是利用局部上下文的方法。
GloVe模型就是将这两中特征合并到一起的,即使用了语料库的全局统计(overall statistics)特征,也使用了局部的上下文特征(即滑动窗口)。
Cbow/Skip-Gram 是一个local context window的方法,比如使用NS来训练,缺乏了整体的词和词的关系,负样本采用sample的方式会缺失词的关系信息。
另外,直接训练Skip-Gram类型的算法,很容易使得高曝光词汇得到过多的权重
Global Vector融合了矩阵分解Latent Semantic Analysis (LSA)的全局统计信息和local context window优势。融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。
我的理解是skip-gram、CBOW每次都是用一个窗口中的信息更新出词向量,但是Glove则是用了全局的信息(共线矩阵),也就是多个窗口进行更新