其中需要下载训练好的参数和模型:options_file和weight_file可在官网下载,其中cuda_service是设置GPU的参数。
(1)在12号节点上(centos)失败的尝试
我在centos运行此程序时,在第一行import就报错了,原因是说glibc_2.14 not found,我看了下本机上最高的glibc版本是2.12(因为centos太老的缘故),故而想要升级glibc。但是在安装之前configure时一直报error,说是gcc的版本不对,我本机上的版本是7.3.0,于是乎我升级为了最新的9.1.0(花了接近一个小时make -j4),但是仍旧在configure时说gcc的版本不对。我又去逛了下论坛,大家警告说不要轻易升级glibc,不然很容易崩溃。我当时先暂时打住了,在下文中又遇到glibc 2.17 not found错误,忍不住又去升级了下,最终差点把机器搞挂...
(2)在18号节点上(Ubuntu)成功的尝试
我用官网的small试了一下,最终elmo_embedding是一个2*3*4*256维向量,2为batch_size,3为LSTM内部层各个状态,4为句子对齐的长度,256为向量维度
1)batch_to_embeddings的用法
2)embed_sentences()的用法
为了对三层LSTM的中间值取平均值,可用:
3)embed_sentence的用法
其实上面的代码是基于这个
这个看上去像是句向量的形式
(1)失败的尝试
在导入tensorflow_hub时报错,师兄说是必须要TensorFlow在1.7.0版本以上才行,我正好是1.6.0
故而升级到1.8.0,使用命令pip install tensorflow==1.8.0,再跑程序,又报了这个错误
重新回到我之前的1.6.0版本,同样又报了这个错误,我原来的能跑通的程序都跑不了了...我的内心是崩溃的...
又参考了一篇博文解答报错glibc_2.17 not found的原因,说是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
于是
cd /usr/lib64
cp /root/gcc-9.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.26 ./
然后删除掉之前的动态链接库,有这么多...
然后将默认库的软连接指向最新动态库:ln -s libstdc++.so.6.0.22 libstdc++.so.6
再用以下命令检查动态库:strings /usr/lib64/libstdc++.so.6 | grep GLIBC
我发现我把libstdc++.so.*的所有版本都试了,里面的glibc基本都是在2.2.5,然后就是3.*,没有2.12-2.17这个区域的,还是没有成功,于是乎我又按照前面编译glibc.2.14的步骤来编译glibc.2.17,在configure的时候报了一个错误,LD_LIBRARY_PATH shouldn’t contain the current directory when building glibc,于是用命令LD_LIBRARY_PATH= 将变量设置为空,编译安装成功后重新添加 LD_LIBRARY_PATH。之后就是进行make操作了,结果突然就报了很严重的错误...差点机器都要被我毁掉,最后执行了这些操作才复原,还删除了/usr/local下的glibc-2.17,才使得ls等命令重新正常使用。
LD_PRELOAD=/lib64/libc-2.12.so ln -s /usr/local/glibc-2.17/lib/libc-2.17.so /lib64/libc.so.6
export LD_PRELOAD=/lib64/libc-2.12.so
真的万分惊险,12号还有许多同学的资料在上面,如果我把12号搞挂了那就凉凉了...
(2)成功的尝试
,在qqp_baseline基础上直接加上如上embedding class,报了错,应该是输入形式的问题
将输入的格式从索引变成了string形式,以便传入hub定义的elmo之中
接下来,又在input layer 报了这个错
看了帖子,说是在顺序模型中一般不用input层,故而去掉
然后,又报了这个错误
将顺序模型改为和示例当中一样的结构
然后又报错
这是因为LSTM的输入必须是三维输入(batch_size, timesteps, data_dim),可以参见
然后我用tf.reshape()变换了下性状,还是报错
是不是在下游任务中再用LSTM维度确实难搞,我见GitHub上好像把下游任务用在elmo上都是直接加dense层,如下,参见
于是我干脆也把baseline_qqp和elmo_qqp全部更换为此种结构
以下是baseline的结果,比之前用LSTM要低很多
以下是elmo的结果:(训练时间长达6个多小时)
最近想把ELMo词向量运用到下游任务之中,与glove的baseline比较下结果。
主要有两种做法
(1)在原架构基础上,将train_x和test_x替换为elmo的向量表示,直接输入到第一层,可以参考这个
(2)在原架构基础上,加一个elmoEmbedding层,在此层当中生成动态词向量表示,可以参考这个
我的模型主要是想参考做法1,得到动态的词向量表示[x_t , x_t + x_t_plus , x_t - x_t_sub]或是[x_t ,x_t , x_t],然后再在LSTM中去改inputs的一些操作,进行分段截取操作。
(1)elmo是从字符卷积来的,所以主创强调它实际上不是word embedding,而是character-based,详见博客
(2)elmo的使用,网络参数可以微调
最后一句话想说——但它是为了embed句子而构建的,后面链接给的是论文
5.Elmo的缺点(详见)
(1)不真正双向:对于一个序列,前向遍历一遍获得左边的LSTM,后向遍历一遍获得右边的LSTM,最后得到的隐层向量直接拼接得到结果向量,并且在最后的Loss function中也是前向和后向的loss function直接相加,并非完全同时的双向计算。
(2)自己能看见自己