首页 > 试题

model怎么读

更新时间:2022-12-09 04:06:10 阅读: 评论:0

免费学初中数学软件-几十


2022年12月9日发(作者:美国斗牛梗)

ELMo模型解读

在反复的看了ELMo源码和参考⽹上各路⼤神的经验之后,终于对ELMo的架构有了⽐较清楚的认识。总结⼀下⾃⼰对ELMo的理解,其实

还有很多细节没有搞清楚。

⼀.模型架构

下⾯是我画的⼀个架构简图,对于ELMo不管你输⼊的是词还是字符,它都会以字符的单位进⾏后续的字符卷积,对与词的索引是根据词典

序号索引的,⽽字符论⽂说英⽂的字符加上⼀些特殊的标记字符总共不会超过262个,所以对字符的索引是通过utf-8编码来索引的,⽐如

单词“word"的utf-8编码是{119,111,114,100},通过这些编码就可以找到某⼀个固定的字符。对于整个模型的输⼊(这⾥只考虑最⼩单

位的输⼊,也就是模型的每⼀个样本)的话由于是语⾔模型,⽽作者在train_elmo⽂件中定义的时间步(unroll_steps)是20,也就是⼀个

样本就是X=20个词,对应的Y=20个对应的下⼀个词。这就是我们之前常说的⼀个样本X:Y。

在得到我们的样本之后,初始化⼀个262*16的字符嵌⼊矩阵(或者⼆维数组),这个16就是每⼀个字符向量的纬度可以⾃⼰定义,通过

索引可以找到每个词对应字符的向量,然后进⾏字符卷积,这其中包括最池化,然后在经过2个highwaylayers。进⼊BiLSTM。这⼀层总

共有20个LSTMCell,分别对应20个词的向量的输⼊,论⽂中的4096也就是源码中的lstm_dim其实就是隐藏层最原始的h,c的纬度。或者

说就是单个LSTMCell⾥⾯单个门的sigmoid单元的个数,这个参数其实就是tensorflow中_ll(num_units)中的第

⼀个参数。注意不同地⽅的命名不⼀样,⾮常容易混淆。源码中的名字也换了好⼏次。

两层LSTM之间还有⼀个残差连接,其实就是把第⼀层LSTM的输⼊加到LSTM的输出上。

最后就是⼀个softmax,但是这个⽤的是Sampled_softmax,这个我开始读源码的时候并没有注意到,知道看到

n_negtive_samples_batch这个参数时才开始注意它。在⽹上找了很多资料感觉都是把论⽂的东西重复了⼀遍,并没有讲的很清楚,这⾥

感觉是⽤了负采样的思想,在计算softmax的时候,只需要找⼀些负样本,并不需要计算所有的可能的词。但是这只是训练的时候才会⽤

到,⽽真正在预测的时候还是要遍历词典,计算softmax分母的和,就是那个当词典很⼤的时候⾮常耗费时间的那部分。

注意:

我上⾯所说的中间有20个词输⼊是源码中的中的实现⽅式,是通过_rnn()实现的。就是这个BiLSTM的长度是固定

的,不管你的句⼦长度有多少,他都会凑成20个词。这⾥只是在训练权重的时候时间步设置为20,这⾥训练就是训练模型的共享参数,因

为rnn的参数在时间步上是共享的,这⼀点要注意。

但是在中也是最初⽣成词向量的结构中,rnn是⽤c_rnn()实现的,感觉这⾥才是真正的语⾔模型,在训练好参

数之后,这⾥⽣成⽂件中每⼀⾏句⼦的词向量,这⾥的动态rnn,每⼀词输⼊的个数就是每⼀⾏句⼦的长度,⽽每⼀个批量的时间步就是这

个批量中最⼤句⼦的长度,这个批量中长度不够的,⽤‘0’来进⾏填补。

下⾯是我⽤Notepad++打开的作者使⽤的训练⽂件部分截图,作者使⽤的训练⽂件是已经分词好了的,将单词和标点符号以及特殊的’s都

⽤空格分开。难怪源码中没有进⾏分词处理,只是通过空格分开了每⼀个词。

为了更加清楚的认识输⼊和输出,我打印了2个训练样本{X:Y}如下图所⽰。

但是在中确⽤了另⼀种实现⽅式,c_rnn(),这种⽅式的BiLSTM的长度不是固定的,⽽且每⼀个批量的都不⼀定

⼀样,它是根据输⼊的句⼦长度来进⾏调整的,我不知⼤这个是⽤来⼲嘛的,他后⾯并没有调⽤。如果知道的可以讨论⼀下。

模型搞清楚之后,就是跑代码了,由于这个模型对设备要求较⾼,我只⽤了⼀个⼩型的数据train⽂件和词典⽂件跑了⼀下。得到了3个ckpt

⽂件和⼀个权重⽂件,这个权重⽂件包含了ELMo的所有模型参数,⽤HDFexplorer打开后可以查看参数的结构。

有了模型结构ckpt⽂件和模型参数weights.h5⽂件我就可以算出特定句⼦中词的3层组合向量,也就是作者所说的与上下⽂相关的词向量。

⼆.动态词向量(contextdependent)词向量的是⽣成

其实ELMo模型最⼤的创新之处就是这个,⽣成与上下⽂相关的词向量。作者先⽤20个时间步的模型训练共享参数,这个上⾯讲过使⽤

静态rnn实现的,然后在计算动态词向量的时候⽤了动态rnn,这个时候给定任意长度的句⼦,⽤之前预训练好的模型,可以算出这个句⼦

的每个词的3层向量,这3层向量由⼀层是与上下⽂⽆关的向量,这个也是模型中BiLSTM的输⼊,另外两层的向量是lstm的输出,当然模

型最后的输出是经过投影之后的。⽣成动态词向量的函数是dump_bilm_embeddings(),这个函数把训练⽂件中每个字的词向量保存为h5格

式的⽂件。3层动态词向量就是代码中的lm_embeddings这个4阶张量。当我们获取这个3层动态词向量之后,为了检验词向量的质量,必

须搭建下游模型⽐如⽂本分类等。输⼊下游模型的词向量可以是这3层词向量的任意组合,也可以是单个层的输⼊到下游模型中。当然这个

组合权重论⽂中也提到,也可以加⼊每层的组合权重来体现每层的向量在不同任务时所发挥的⽐重。代码中的

dump_token_embeddings()保存的其实是与上下⽂⽆关的词向量。很明显他是⽤词典⽂件⽣成的,每⼀个词的词向量是唯⼀

的,dump_bilm_embeddings()才是真正的动态的词向量

本文发布于:2022-12-09 04:06:10,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/70238.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:椭圆度
标签:model怎么读
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图