ELMo运用到下游任务中

1.通过allennlp来跑elmo

其中需要下载训练好的参数和模型: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的用法

 

2.通过tensorflow_hub来跑elmo

其实上面的代码是基于这个

 

这个看上去像是句向量的形式

(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个多小时)

3.ELMo应用到下游任务

最近想把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的一些操作,进行分段截取操作。

 

4.ELMo作者的一些说明

(1)elmo是从字符卷积来的,所以主创强调它实际上不是word embedding,而是character-based,详见博客

 

 

(2)elmo的使用,网络参数可以微调

最后一句话想说——但它是为了embed句子而构建的,后面链接给的是论文

 

5.Elmo的缺点(详见

(1)不真正双向:对于一个序列,前向遍历一遍获得左边的LSTM,后向遍历一遍获得右边的LSTM,最后得到的隐层向量直接拼接得到结果向量,并且在最后的Loss function中也是前向和后向的loss function直接相加,并非完全同时的双向计算。

(2)自己能看见自己

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值