如何在AllenNLP简易分类任务中接入ELMo并修改对应配置文件
配置修改步骤
你不需要调整已经写好的模型代码,只需要对现有jsonnet配置做三处修改即可适配ELMo嵌入:
- 替换dataset_reader中的token_indexers配置
原来的single_id索引器是给普通词嵌入使用的,需要换成ELMo专用的字符索引器:
"dataset_reader" : { "type": "classification-tsv", "token_indexers": { "elmo": { "type": "elmo_characters" } } },
- 替换embedder中的token_embedders配置
把原来的普通embedding层替换为ELMo嵌入层,填入你本地存储的ELMo预训练配置和权重路径即可:
"embedder": { "token_embedders": { "elmo": { "type": "elmo", "options_file": "本地ELMo配置文件路径", "weight_file": "本地ELMo权重文件路径", "num_output_representations": 1, "dropout": 0.2 } } },
- 调整encoder的输入维度
ELMo的输出维度为1024,需要把encoder的embedding_dim参数同步修改为1024:
"encoder": { "type": "bag_of_embeddings", "embedding_dim": 1024 }
完整修改后配置参考
{ "dataset_reader" : { "type": "classification-tsv", "token_indexers": { "elmo": { "type": "elmo_characters" } } }, "train_data_path": "data/movie_review/train.tsv", "validation_data_path": "data/movie_review/dev.tsv", "model": { "type": "simple_classifier", "embedder": { "token_embedders": { "elmo": { "type": "elmo", "options_file": "本地ELMo配置文件路径", "weight_file": "本地ELMo权重文件路径", "num_output_representations": 1, "dropout": 0.2 } } }, "encoder": { "type": "bag_of_embeddings", "embedding_dim": 1024 } }, "data_loader": { "batch_size": 8, "shuffle": true }, "trainer": { "optimizer": "adam", "num_epochs": 5 } }
注意事项
- 运行前需要先安装allennlp-models依赖,执行
pip install allennlp-models即可 - 你当前模型中的四层全连接层是适配低维普通嵌入的,换成ELMo之后可以适当减少全连接层数,或者调小全连接层的维度,避免出现过拟合问题。
内容的提问来源于stack exchange,提问作者ShingoKato
相关产品推荐
相关产品推荐

