《文本嵌入式表示方法实战》系列文章是基于2017年我于研一下半学期做的两场长时间的组会汇报ppt上形成的文章(学习和实验长达3个月,因为当时主要以上课为主,实验都是课余时间做的。。),由于当时我正处于入门阶段,理解和表述定有不当之处,还请各位同学老师批评指教。。。
《文本嵌入式表示方法实战》系列文章全部链接如下:
(一)文本嵌入式表示方法实战(词、句和段落向量:Word2Vec,GloVe,Paragraph2vec,FastText,DSSM)
(二)文本嵌入式表示方法实战(词、句和段落向量:Word2Vec,GloVe,Paragraph2vec,FastText,DSSM)
(三)文本嵌入式表示方法实战(词、句和段落向量:Word2Vec,GloVe,Paragraph2vec,FastText,DSSM)
(。。。。。。书接上一期。。。。。。)
我们可以将这种共现关系表示成以下形式:
→
→
,其中
这使得该特征矩阵可与其转置互换。
该算法中还包含了一个加法偏移,防止log中的xik=0:
其在计算该共现矩阵时,在避免分歧的同时又维持了 X 的稀疏性。
然后定义了一个新的损失函数
并且定义了一个非常好用的加权函数f(x):
其中:
1. f(0)=0;
2. f(x)应该为非递减;
3. f(x)的值相对于x要小的多。
在阅读原作论文时发现,只是讲解了原理,很多部分没有细讲,具体glove一步一步如何实现没有讲(当然也不可能会讲基础东西)。
然而无论用google还是百度,都没能收到足够的讲解glove的博客/教程(内容质量google>百度),都是千篇一律把目标函数推一遍,具体的算法原理、实现原理都没有解释,而且对于glove的网络结构没有一个直观的描述。
所以我在看了c源码,并且在来斯惟博士证明了glove与sg目标函数其实一致等资料的基础上,对glove的实现和模型的抽象化理解进行了分析,见我之前的博文:GloVe背后的计算原理(进一步理解GloVe实现细节)(内容优点糊了,后面我会重新梳理和重写的)。
其实在了解了skip-gram模型后发现其与skip-gram模型还是有点相像的,尤其是来斯惟在其博士论文的附录证明了两者的损失函数其实是一样的,感觉还是很神奇的。
来斯惟的一个总结的表格,来博士的博士论文总结的非常好,推荐阅读一下。
4.2 C源码及结合gensim实战
下载好基于C实现的glove源码后,进行试验。本实验基于text8语料,先用glove