Meta Learning for LSTM
项目从搭建RNNs和MetaRNNs开始,首先用Jupyter测试RNNs和MetaRNNs的输入输出,然后用MNIST数据集测试RNNs和MetaRNNs的性能, 这些测试都是为了保证实现的RNNs和MetaRNNs基本正确,接着在CoNLL-2003数据集上进行NER实验,在这个过程中,需要保证RNNs性能和 Pytorch库提供的RNNs性能相差不大。之后的实验慢慢迁移到多任务,用的数据集是公开的医学数据集。
注:我用PyCharm运行项目,远程连接服务器。如果直接通过命令行运行文件可能不行,会出现找不到包的问题。
感谢作者们的辛苦付出,让我有幸搬砖 :-P
- (1)[代码] pytorch_workplace/rnn
- (2)[文档] Pytorch Doc
- (3)[论文] HyperNetworks
- (4)[代码] supercell
- (5)[论文] Meta Multi-Task Learning for Sequence Modeling
- (6)[论文] Optimization As a Model For Few-Shot Learning
- (7)[代码] NCRF++
- (8)[论文] Recurrent Batch Normalization
- (9)[代码] batch_normalized_LSTM
- (10)[论文] Optimal Hyperparameters for Deep LSTM-Networks for Sequence Labeling Tasks
- (11)[数据集] MTL-Bioinformatics-2016
- (12)[代码] BioNLP-2016
- (13)[论文] How to Train good Word Embeddings for Biomedical NLP
- (14)[论文] A Neural Network Multi-Task Learning Approach to Biomedical Named Entity Recognitio
- (15)[论文] Effective Neural Solution for Multi-Criteria Word Segmentation
- (16)[代码] multi-criteria-cws
- (17)[代码] CoVe
- (18)[论文] Learned in Translation: Contextualized Word Vectors
pip install -r requirements.txt
本地目录还包括data/,models/,完整目录如下:
metaLSTM
----data
----conll2003(保存CoNLL-2003,用BMES标注)
----embedding(词向量目录)
----cellular(有关细胞的数据集)
----BioNLP13CG-IOBES
----BioNLP13PC-IOBES
----CRAFT-IOBES
----jointCellulars(用于加标签的多任务学习的数据集)
----multiDatasets(从资料11中下载的数据集)
----images (图片)
----MNIST(在MNIST数据集上测试RNNs)
----models(保存训练好的模型)
----Modules(RNNs, MetaRNNs, NormLSTM...)
----NER(主要实验的目录)
----Module(char, encoder, crf, ner)
----Tests(测试Optimizers/Normalizations...)
----cellulars(在3个cellular数据集上测试多任务性能)
----utils(配置文件,功能函数)
- metaRNNs
- 简单测试RNNs和MetaRNNs
- 在MNIST上测试RNNs
- 在MNIST上测试MetaRNNs
- 在CoNLL-2003上测试RNNs
- 在CoNLL-2003上测试MetaRNNs
- NER冲刺state of the art
- MetaLSTM的迁移能力
5.1和5.2用于测试RNNs的性能,没有调整超参,所以效果并不好,等5.3完成后,再更新图片
MNIST是一个手写数字数据集,训练集有60,000个例子,测试集有10,000个例子。
- 实验结果
- 实验结果
- 实验结果
CoNLL-2003是一个命名实体识别数据集,包含4类实体:PER, LOC, ORG, MISC
- 实验结果
注:RNN图很快停止是因为训练时出现了NAN
- 实验结果
- 实验结果
注:MetaRNN图很快停止是因为训练时出现了NAN
- 梯度更新方法(SGD, Adagrad, Adadelta, Adam, Nadam ...)
- 归一化方法(Dropout, Batch, Layer)
- 词向量(cove)
- 多任务学习(加标签)
- 注意力机制(待学习)
- 元学习(学习率更新)
- 双向
- 超参数
Model | Hidden_size | LR Method | Bidirectional | F1 |
---|---|---|---|---|
BaseLSTM | 200 | SGD(0.015) | True | 91.18 |
LSTM | 200 | SGD(0.015) | True | 91.04/91.20(drop_lstm) |
MetaLSTM | 200 | SGD(0.015) | True | 90.97/90.54(drop_lstm) |
结论
- 使用Adam,Loss下降最快
- SGD训练结果最好
- 我选择SGD
实验结果
- Loss of Optimizers
- F1 of Optimizers{train}
- F1 of Optimizers{dev}
- F1 of Optimizers{test}
Method | Detail |
---|---|
Dropout | 在encoder的输出加dropout |
Batch Norm | Batch Norm LSTM |
Model | Hidden_size | Layer | Embed Dict | F1 |
---|---|---|---|---|
LSTM | 600 | 2 | golve.840B.300d | 90.35 |
LSTM | 600 | 2 | CoVe | 87.57 |
- 实验结果
Dataset | STM | MTM |
---|---|---|
BioNLP13CG | 77.65 | 78.45 |
BioNLP13PC | 83.28 | 82.49 |
CRAFT | 76.59 | 78.61 |
加标签
将BioNLP13CG、BioNLP13PC和CRAFT三个数据集合并成一个,通过在句子首尾加标签的方式进行区分,例如:
<BioNLP13CG> S-BioNLP13CG
This O
may O
reflect O
a O
transition O
...
</BioNLP13CG> S-BioNLP13CG
在打分的时候,将这些标签去掉。
- 实验结果
- 补充实验
Cellular component group
Dataset | STM | MTM |
---|---|---|
BioNLP13CG-cc | 74.72 | 70.81 |
BioNLP13PC-cc | 88.17 | 81.17 |
CRAFT-cc | 64.24 | 65.65 |
Cell group
Dataset | STM | MTM |
---|---|---|
BioNLP13CG-cell | 85.61 | 81.75 |
CRAFT-cell | 89.33 | 88.79 |
Chemical group
Dataset | STM | MTM |
---|---|---|
BC4CHEMD | 82.90 | 82.10 |
BC5CDR-chem | 84.80 | 87.32 |
BioNLP11ID-chem | 64.89 | 58.30 |
BioNLP13CG-chem | 66.15 | 72.78 |
BioNLP13PC-chem | 74.27 | 70.80 |
CRAFT-chem | 80.48 | 79.34 |
Disease group
Dataset | STM | MTM |
---|---|---|
BC5CDR-disease | 78.18 | 78.25 |
NCBI-disease | 85.62 | 83.44 |
Species group
Dataset | STM | MTM |
---|---|---|
BioNLP11ID-species | 68.80 | 66.93 |
BioNLP13CG-species | 79.80 | 80.08 |
CRAFT-species | 97.84 | 97.99 |
Linnaeus | 86.23 | 85.96 |
- 实验结果
- 实验结果
- SGD训练,学习率lr设置很重要,过大容易训练不了
- LSTM比RNN及其变种更容易训练,即使学习率lr设置过大
- RNN在训练过程中,Loss容易变成NAN,而无法进一步训练
- 对于NER任务,加CRF,双向LSTM效果显著(2~3个点),hidden_emb有些许的提升(1个点)