Global Vectors-使用小试

Socher 2014 EMNLP 中给出一个新的词向量方法:GloVec

官方下载地址为:http://nlp.stanford.edu/projects/glove/

按照说明进行编译make,不过编译时出现错误,从他人经验中看,应该是GCC版本的问题。
$gcc -v
gcc version 4.3.4
这里有建议为4.7.3 版本,http://blog.csdn.net/adooadoo/article/details/38505497
那么更新一下版本吧,先查看一下本地服务器的Linux版本:
$lsb_release -a
Distributor ID: SUSE LINUX
Description: SUSE Linux Enterprise Server 11 (x86_64)
Release: 11
Codename: n/a

这里有提供多种版本的GCC 4 SUSE http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/,不过基于二进制文件进行安装的步骤很繁琐,例如是这样子的:http://blog.csdn.net/cloudskyfhx/article/details/17660607

另一种方式是:suse 的安装包里面有gcc,使用命令yast2,打开图形界面,找到软件管理,查找gcc,点击安装,系统会帮你装好的。
你下载二进制的包,有很多依赖包要装,很麻烦。。。。反正就是各种麻烦,组里的好多服务器申请权限又需要时间,想想就麻烦,还是用自家的虚拟机Ubuntu虚拟机吧。

自家Ubuntu的GCC版本是gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 。

jacobxu@jacobxu-ubuntuNode001:~$ tar -xf 2014-EMNLP-glove.tar.gz
jacobxu@jacobxu-ubuntuNode001:~$ cd glove/
jacobxu@jacobxu-ubuntuNode001:~/glove$ ls
cooccur.c demo.sh eval glove.c LICENSE makefile README shuffle.c vocab_count.c
jacobxu@jacobxu-ubuntuNode001:~/glove$ make
gcc glove.c -o glove -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
gcc shuffle.c -o shuffle -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
gcc cooccur.c -o cooccur -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
gcc vocab_count.c -o vocab_count -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result

jacobxu@jacobxu-ubuntuNode001:~/glove$
make编译倒是能够通过。

但是跑程序时仍然报错,而且自家机虚拟机的内存太低了。在一台不能上网的服务器上面安装GCC真是一场恶梦,只要硬着头皮挑战一下,还好有人整理过,我们尝试进行一下。
http://blog.lehu.shu.edu.cn/maglee/A152690.html, http://blog.csdn.net/cloudskyfhx/article/details/17660607
======================华丽的分割线下开始在一台SUSE服务器上面更新新版的GCC,但是失败了,所以不看也罢===========================
步骤0,先看一下当前服务器GCC版本
linux-hp001:/u11/jacoxu # gcc -v
Using built-in specs.
Target: x86_64-suse-linux
Configured with: ../configure –prefix=/usr –infodir=/usr/share/info –mandir=/usr/share/man –libdir=/usr/lib64 –libexecdir=/usr/lib64 –enable-languages=c,c++,objc,fortran,obj-c++,java,ada –enable-checking=release –with-gxx-include-dir=/usr/include/c++/4.3 –enable-ssp –disable-libssp –with-bugurl=http://bugs.opensuse.org/ –with-pkgversion=’SUSE Linux’ –disable-libgcj –disable-libmudflap –with-slibdir=/lib64 –with-system-zlib –enable-__cxa_atexit –enable-libstdcxx-allocator=new –disable-libstdcxx-pch –enable-version-specific-runtime-libs –program-suffix=-4.3 –enable-linux-futex –without-system-libunwind –with-cpu=generic –build=x86_64-suse-linux
Thread model: posix
gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux)
步骤1,下载GCC
################# Download GCC ###########################
Download GCC 4.8.2 from http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.2/ (seems quite promising for speed)
Supposed to be stored to /u11/jacoxu/GCC

步骤2,下载GMP并安装
######################### 下载GMP,并安装 ###########################
Download GMP from https://gmplib.org/#DOWNLOAD
下载gmp-6.0.0a.tar.bz2,解压:tar -xf gmp-6.0.0a.tar.bz2
$cd gmp-6.0.0/
$./configure
$make
$make check
这一步用来查看有没有文件不匹配或缺失,然后安装:
$make install

步骤3,下载MPFR并安装
######################### 下载MPFR,并安装 ###########################
Download MPFR from http://www.mpfr.org/
下载 mpfr-3.1.2.tar.gz ,解压
$tar -xf mpfr-3.1.2.tar.gz
$cd mpfr-3.1.2/
配置:
$./configure –with-gmp-include=/usr/local/include –with-gmp-lib=/usr/local/lib
$make
# make check
接下来安装:
# make install
。。。。装MRC。。。

失败了。。。还是没有安装成功。。。。。折腾了2个多小时。。。。

幸好发现一台服务器GCC版本4.6, 试了一下,make编译一样能够成功!

但是跑程序仍然有问题,好了,我们曝光一下问题。。。:

先看本地虚拟机4.8.2版本的问题:

 jacobxu@jacobxu-ubuntuNode001:~/glove$ bash demo.sh
make: 没有什么可以做的为 `all’。
BUILDING VOCABULARY
Processed 55636 tokens.
Counted 9447 unique words.
Truncating vocabulary at min count 5.
Using vocabulary of size 1179.COUNTING COOCCURRENCES
window size: 15
context: symmetric
max product: 1948568
overflow length: 4753544
Reading vocab from file ”vocab.txt”…loaded 1179 words.
Building lookup table…table contains 1390042 elements.
Processed 55636 tokens.
Writing cooccurrences to disk……2 files in total.
*** Error in `./cooccur’: free(): invalid next size (normal): 0x0000000001c93650 ***
demo.sh: 行 41: 48026 已放弃               (核心已转储) ./cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE
在服务器上 4.6.3版本也是类似的错误:
jackey@ubuntu:~/jacoxu/glove$ ls
cooccur.c  demo.sh  eval  glove.c  LICENSE  makefile  README  shuffle.c  text8  vocab_count.c
jackey@ubuntu:~/jacoxu/glove$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v –with-pkgversion=’Ubuntu/Linaro 4.6.3-1ubuntu5′ –with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs –enable-languages=c,c++,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-4.6 –enable-shared –enable-linker-build-id –with-system-zlib –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –with-gxx-include-dir=/usr/include/c++/4.6 –libdir=/usr/lib –enable-nls –with-sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx-time=yes –enable-gnu-unique-object –enable-plugin –enable-objc-gc –disable-werror –with-arch-32=i686 –with-tune=generic –enable-checking=release –build=x86_64-linux-gnu –host=x86_64-linux-gnu –target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
jackey@ubuntu:~/jacoxu/glove$ bash demo.sh
gcc glove.c -o glove -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
gcc shuffle.c -o shuffle -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
gcc cooccur.c -o cooccur -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
gcc vocab_count.c -o vocab_count -lm -pthread -Ofast -march=native -funroll-loops -Wno-unused-result
BUILDING VOCABULARY
Processed 0 tokens.Processed 55636 tokens.
Counted 9447 unique words.
Truncating vocabulary at min count 5.
Using vocabulary of size 1179.COUNTING COOCCURRENCES
window size: 15
context: symmetric
max product: 13752509
overflow length: 38028356
Reading vocab from file ”vocab.txt”…loaded 1179 words.
Building lookup table…table contains 1390042 elements.
Processing token: 0Processed 55636 tokens.
Writing cooccurrences to disk……2 files in total.
*** glibc detected *** ./cooccur: free(): invalid next size (normal): 0x0000000001d36650 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e846)[0x7fa3354b2846]
/lib/x86_64-linux-gnu/libc.so.6(fclose+0×155)[0x7fa3354a24c5]
./cooccur[0x40368c]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fa33545576d]
./cooccur[0x40107d]
======= Memory map: ========
00400000-00405000 r-xp 00000000 08:01 3014850                            /home/jackey/jacoxu/glove/cooccur
00604000-00605000 r–p 00004000 08:01 3014850                            /home/jackey/jacoxu/glove/cooccur
00605000-00606000 rw-p 00005000 08:01 3014850                            /home/jackey/jacoxu/glove/cooccur
01d21000-01d42000 rw-p 00000000 00:00 0                                  [heap]
7fa30fb23000-7fa30fb38000 r-xp 00000000 08:01 917548                     /lib/x86_64-linux-gnu/libgcc_s.so.1
…. 从简 省略中…
7fa335f2f000-7fa335f31000 rw-p 00023000 08:01 945633                     /lib/x86_64-linux-gnu/ld-2.15.so
7fff4518b000-7fff451ac000 rw-p 00000000 00:00 0                          [stack]
7fff451ff000-7fff45200000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
demo.sh: line 41: 23140 Aborted                 (core dumped) ./cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE
jackey@ubuntu:~/jacoxu/glove$

经过一番折腾,中间分别求助过…Shaohua Li(@asker2), Zhendong Du(@杜振东-GloVe), Tianze Shi, Siwei Lai(@licstar) 几位大牛。。。不过 他们竟然没有遇到过。。。。
不过感谢Tianze Shi 提到GloVe的Google Groups上讨论过此问题,见这里(很重要)!

主要修改的为两个地方:
1. In line 324 of coocur.c: if (lookup == NULL) should be: if (bigram_table == NULL)
2. On line ~310 in cooccur.c
lookup = (long long *)calloc( vocab_size , sizeof(long long) );
should be
lookup = (long long *)calloc( vocab_size+1 , sizeof(long long) );

修改后,cooccur可以正常执行了,但是 glove 又报出了错误。。。我在64G内存的服务器和2G内存的虚拟机上跑了下,都是在这里报错,然后发现默认申请的4.0G内存有问题,改为0.2则OK,。。。。。64G内存服务器。。居然只要申请0.2G空间。。。暂时不去看源码的问题了。先跑起来。

改为0.2之后正常运行。。。。

这么看来GCC版本在4.6以上的应该都没问题,不过-memory $MEMORY 参数是怎么回事,待查看了。

===============================================END,结束啦==================================================

回到问题之初,GloVec下有那些文件,主要用到的是这四个(摘自:http://blog.csdn.net/adooadoo/article/details/38505497):
1.vocab_count:用于计算原文本的单词统计(生成vocab.txt,每一行为:单词 词频)
2.cooccur:用于统计词与词的共现,目测类似与word2vec的窗口内的任意两个词(生成的是cooccurrence.bin,二进制文件,呵呵)
3. shuffle:对于2中的共现结果重新整理(一看到shuffle瞬间想到hadoop,生成的也是二进制文件cooccurrence.shuf.bin)
4.glove:glove算法的训练模型,会运用到之前生成的相关文件(1&3),最终会输出vectors.txt和vectors.bin(前者直接可以打开,下文主要针对它做研究,后者还是二进制文件)

额。。突然地,有点肚子疼。。这大圣诞节的,想想最近12小时之内做什么了。。回想跑题中。。额。。大家圣诞节快乐啊(如果你能看到,这算彩蛋吗~哈哈,我不是钞票运输员,所以没办法撒钱啦)。。。。

=================================================================
回来继续,我们知道Mikilov的Word2vec中参数很多,那么GloVe有那些参数呢
vi demo.sh

可以看到主要的参数都在这里了:
./glove -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE

没有过多的说明,那么我们就设置自己的参数吧:
-min-count 1 -window-size 10 -threads 10 -iter 200 -vector-size 50 -binary 0 -verbose 2

-binary 0 只存文本格式,1只存二进制格式,2同时存文本和二进制格式
-verbose 2是做什么的?好像就是多输出了一些信息吧,多打印了一些啰嗦的话。2为最啰嗦,0为屏蔽了一些啰嗦的话。。。

更多关于GloVe V.S. Word2vec的性能对比报告可以看:

1. @刘知远THU 老师的学生Tianze Shi的对比报告:http://arxiv.org/abs/1411.5595

2. @RadimRehurek GloVe与Word2Vec的评测对比:http://radimrehurek.com/2014/12/making-sense-of-word2vec/

备注:

1. Python版GloVe:https://github.com/maciejkula/glove-python/

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>