版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WUUUSHAO/article/details/88422117
开始的话:
从基础做起,不断学习,坚持不懈,加油。
一位爱生活爱技术来自火星的程序汪
讲完
word2vec ,接下来我们就要讲讲
ELMo了,来自论文:Deep contextualized word representations,而
ELMo是表示
Embeddings
from
Language
Models的意思。
Step
1.
train
如下图所示:
在训练过程中,
ELMo有两个输入,一个正向的
ids,以及一个反向的
ids_
reverse。需要特别注意的是:这两个
id是 没有任何关系 的,也就是说不是同一个输入文本的正向
id和反向
id。
训练阶段也比较简单:
- 对于
ids,扔进一个如上图所示的一个
multiRNNCell,如果对这个结构不是很了解,请看我之前的
blog。
- 对于
ids_
reverse,同样扔进一个
multiRNNCell。
- 拿到这两个
multiRNNCell的输出,分别进行
loss计算(
sampled_
softmax_
loss ,然后求和求平均得到最终的loss。
当训练结束后,会得到几个很重要的文件,这些文件就是我们在
down
stream
task中需要用的:
-
options.json 训练的参数文件
-
vocab_
embedding.hdf5 训练完语言模型之后的
Embeddings
-
weights.hdf5 训练完之后各层的参数
-
vocab.txt 词表文件
Step
2.
predict
在预测阶段,对于一个输入的
ids会进行如下操作:
- 在
forward中输入
ids,有两层
LSTMCell,保存两个结果;
- 在
backward中输入
ids_
reverse,有两层
LSTMCell,保存两个结果;
- 这样我们就能拿到三个结果:
- 对上述每一层,设置了可训练的权重参数
W和统一
scale参数
gamma。
这样在下游的不同任务中,不同层的权重则可训练为不同的值,从而适应性更强,这也就是相对于
word2vec固定的
vector的优势所在了。
在预测阶段的各层的参数是直接用
weights.hdf5中的参数,而这些参数在下游任务中,是不参与训练过程的,也就是不会
fine-
tune的,作为词向量参与训练的只有
W和
gamma。
更多的细节和代码注释请查看我的
github,有很详细的代码注释说明。
这里只是对于一些重要的地方做一个学习笔记。
另外在
github中还有
NER中加入
ELMo的实践,以及更多个人的一些项目。
谢谢
更多代码请移步我的个人
github,会不定期更新。
欢迎关注