万物皆可Embedding系列会结合论文和实践经验进行介绍,前期主要集中在论文中,后期会加入实践经验和案例,目前已更新:
-
Sentence2Vec & GloVe 算法原理、推导与实现
Sentence2vec
Sentence2vec 是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模型表现还要好一些。
与该论文中思路比较相近的做法有:
-
直接使用词语的平均embedding来表示句子,即不带权平均
-
使用TF-IDF值作为权重,进行带权计算(前提是句子中没有大量重复的词语,且使用tfidf值作为权重没有理论依据)
通过引入SIF,结合词语embedding加权计算句子embedding,不仅表现较好,而且有较好的鲁棒性,论文中提到了三点:
-
使用不同领域的语料训练得到的不同词语embedding,均取得了不错的效果,说明算法对各种语料都比较友好
-
使用不同语料计算得到的词频,作为词语的权重,对最终的结果影响很小
-
对于方法中的超参数, 在很大范围内, 获得的结果都是区域一致的, 即超参数的选择没有太大的影响
2、理论
a)潜在变量生成模型
b)Sentence2vec 在随机游走上的改进
c)计算句子相关性
d)整体算法流程
整体算法流程
3、实现
作者开源了其代码,地址为:
https://github.com/PrincetonML/SIF
Glove
1、概述
论文中作者总结了目前生成embedding的两大类方法,但这两种方法都有其弊端存在
-
基于矩阵分解,弊端为因为是基于全局进行矩阵的构建,对于一些高频词,在算法优化的过程中,占的权重比较大
-
基于滑动窗口,不能直接对语料库的单词进行共现建模,使用的是滑动窗口,没有办法利用数据的共现信息
因此作者提出了一种基于语料库进行信息统计,继而生成embedding的算法-Glove。下面就来具体看下对应的算法原理。
2、算法推导过程
共现矩阵提取信息说明
a值设定效果
3、总结
以上就是有关原理的介绍,作者其实也是基于最开始的猜想一步一步简化模型的计算目标,最后看GloVe的目标函数时发现其实不难计算,但是要从最开始就想到这样一个目标函数其实还是很难的。最后做一下总结:
-
综合了全局词汇共现的统计信息和局部窗口上下文方法的优点,可以说是两个主流方法的一种综合,但是相比于全局矩阵分解方法,由于不需要计算那些共现次数为0的词汇,因此,可以极大的减少计算量和数据的存储空间
-
但是把语料中的词频共现次数作为词向量学习逼近的目标,当语料比较少时,有些词汇共现的次数可能比较少,笔者觉得可能会出现一种误导词向量训练方向的现象
4、实现
实现可以参考官方给出的代码和数据:
https://nlp.stanford.edu/projects/glove/