Sentence2vecSentence2vec 是2017年发表于ICLR(国际学习展示回忆)的一篇论文,其全称为:A Simple but tough-to-beat baseline for sentence embeddings 下面来看一下论文所介绍的内容(论文的内容比较晦涩难懂,小编水平也不高,如果不当之处,评论区留言,感谢!)。 1、概述论文主要提出了一种无监督的,基于单词词向量计算句子embedding的方法,称之为Smooth Inverse Frequecy(SIF),使用加权平均的方法从word embedding到sentence embedding,然后再基于句子的embedding进行相似度计算,下面使用Sentence2vec来代替模型的思想。 论文中提出的计算方法比直接平均求句子embedding的方法效果要好一些,在一些任务中甚至比RNN、LSTM模型表现还要好一些。 与该论文中思路比较相近的做法有:
通过引入SIF,结合词语embedding加权计算句子embedding,不仅表现较好,而且有较好的鲁棒性,论文中提到了三点:
2、理论a)潜在变量生成模型在介绍Sentence2vec之前,先看一下潜在变量生成模型(latent variable generative model),其将语料的生成过程看作是一个动态的过程,第个单词是在第步生成的,每个单词 对应一个实值向量 。这个动态过程是通过 discourse vector 随机游走驱动的。discourse vector表达的是 what is being talked about。 discourse vector 和 单词的向量 的内积表达的是 discourse和word之间的相关性,并且假设时间观测到的 的概率为这个内积的对数线性关系(log linear),表达式为: 由于 是较小幅度的随机游走生成的, 和 之间只是相差一个很小的随机差向量,因此相邻的单词由相似的discourses vector 生成,另外计算表明这种模型的随机游走允许偶尔 有较大的 jump,通过这种方法生成的词向量,与word2vec(CBOW)和Glove是相似的。 b)Sentence2vec 在随机游走上的改进在给定句子的情况下,对控制该句子的向量 discourse vector 进行最大似然估计, 我们观察到在句子生成单词的时候,discourse vector 变化特别小,为了简单起见,认为其是固定不变的,为 ,可以证明 对 的最大似然估计就是该句中所有单词向量的平均。 Sentence2vec对模型的改进为增加了两项平滑(smoothing term),原因是:有些单词在上下文之外出现,可能会对discourse vector产生影响;有些常见的停用词和discourse vector几乎没有关系。 两项平滑技术为:
纠正后的单词在句子中出现的概率为: 其中:
从上面的公式中也可以看出,一个与 没有关系的词语 也可以在句子中出现,因为:
c)计算句子相关性句子的向量,即上文提到的 可以通过最大似然函数去生成,这里假设组成句子的词语 是统一分散的,因此这里归一化 对于不同句子的值都是大致相同的,即对于任意的,值都是相同的,,在这个前提下,得到的似然函数为: 取对数,可得: 经过一系列推导,可得最终的目标函数为: 其正比于: 其中 因此可以得到:
最后, 为了得到最终的句子向量, 我们需要估计.。通过计算向量的first principal component(PCA中的主成分), 将其作为,最终的句子向量即为减去主成份向量。 d)整体算法流程3、实现作者开源了其代码,地址为: https://github.com/PrincetonML/SIF Glove1、概述论文中作者总结了目前生成embedding的两大类方法,但这两种方法都有其弊端存在
因此作者提出了一种基于语料库进行信息统计,继而生成embedding的算法-Glove。下面就来具体看下对应的算法原理。 2、算法推导过程字符的定义:
论文中给出了一个简单的例子,来数目如何从共现矩阵中提取出有意义的信息,如下图所示: 上图想要说明的信息是,如果单词 和单词的相关度比 和的相关度大的话,的值会很大,差距越大,比值越大;同理如果和的相关度比和的相关度小的话,的值会很小,差距越大,比值越小;如果和都不想关的话,的值会接近于1。 上述的讨论说明了词向量的学习应该是基于共现概率的比率而不是概率本身,因此假设可以通过函数来学习到词向量,函数可以抽象为: 其中表示的是词向量, 可以从语料中计算得到,函数依赖于一些尚未指定的参数,但因为一些必要的条件,函数可以进一步的被确定。 由于向量空间具有线性结构,因此可以对词向量进行差分,函数可以转化为: 虽然函数F可能是一个比较复杂的结构,比如神经网络,但这样做,会使我们试图捕获的线性结构消失,因此为了避免这个问题,我们可以先对向量做个内积,可以转化为: 上述公式中左侧是减法,右侧是除法,这很容易让人联想到指数运算,因此限定函数为指数函数,此时有: 此时,只需要确保等式两边分子和分母相等即可,即: 进一步,可以转化为语料中的所有词汇,考察,即: 由于上式左侧 中,调换 和 的值不会改变其结果,即具有对称性,因此,为了确保等式右侧也具备对称性,引入了两个偏置项,即: 此时, 已经包含在中,因此,此时模型的目标就转化为通过学习词向量的表示,使得上式两边尽量接近,因此,可以通过计算两者之间的平方差来作为目标函数,即: 但是这样的目标函数有一个缺点,就是对所有的共现词汇又是采用相同的权重,因此,作者对目标函数进行了进一步的修正,通过语料中的词汇共现统计信息来改变他们在目标函数中的权重,具体如下: 这里 表示词汇的数量,并且权重函数 必须具备一下的特性:
综合以上三点特性,作者提出了下面的权重函数: 作者在实验中设定,并且发现 时效果比较好,函数的图像如下图所示: 3、总结以上就是有关原理的介绍,作者其实也是基于最开始的猜想一步一步简化模型的计算目标,最后看GloVe的目标函数时发现其实不难计算,但是要从最开始就想到这样一个目标函数其实还是很难的。最后做一下总结:
4、实现实现可以参考官方给出的代码和数据: https://nlp./projects/glove/ AINLP 一个有趣有AI的自然语言处理公众号:关注AI、NLP、机器学习、推荐系统、计算广告等相关技术。公众号可直接对话双语聊天机器人,尝试自动对联、作诗机、藏头诗生成器,调戏夸夸机器人、彩虹屁生成器,使用中英翻译,查询相似词,测试NLP相关工具包。 330篇原创内容 公众号 |
|