Transfer Learning for Sequence Tagging with Hierarchical Recurrent Networks
Switch branches/tags
Nothing to show
Clone or download
Latest commit 695cca9 Sep 8, 2017
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
LICENSE Create LICENSE Sep 7, 2017
README.md Update README.md Sep 7, 2017
chunking.py add code Sep 7, 2017
cnn_rnn.py add code Sep 7, 2017
genia.py add code Sep 7, 2017
joint.py add code Sep 7, 2017
lang.joint.py add code Sep 7, 2017
ner.py add code Sep 7, 2017
ner_ned.py add code Sep 7, 2017
ner_span.py add code Sep 7, 2017
pos.py add code Sep 7, 2017
sample.py add code Sep 7, 2017
twitter_ner.py add code Sep 7, 2017
twitter_pos.py add code Sep 7, 2017

README.md

Transfer Learning for Sequence Tagging with Hierarchical Recurrent Networks

Intro

This is an implementation of the paper

Transfer Learning for Sequence Tagging with Hierarchical Recurrent Networks
Zhilin Yang, Ruslan Salakhutdinov, William W. Cohen
ICLR 2017

You might also want to refer to

Multi-Task Cross-Lingual Sequence Tagging from Scratch
Zhilin Yang, Ruslan Salakhutdinov, William W. Cohen
Preprint, 2016

Requirements

Lasagne, Theano. Python 2.7.

Install Lasagne and Theano with the instructions here: https://github.com/Lasagne/Lasagne#installation

Get data

Publicly Available Data

Some of the datasets are publicly available, which can be downloaded from our server.

wget http://kimi.ml.cmu.edu/transfer/data.tar.gz
tar -xvzf data.tar.gz

The above command will download the Genia and Twitter datasets, along with the Senna embeddings and an English gazeteer.

Other datasets require a LDC license; please contact your institution to access the below datasets.

Get Chunking Dataset

Get the CoNLL 2000 chunking dataset using a LDC license, and organize the files with the following structure:

transfer/chunking/train.txt
transfer/chunking/test.txt

Get POS Dataset

Get the PennTreebank 2003 dataset using a LDC license, and organize the files with the following structure:

transfer/pos_tree/dev.txt
transfer/pos_tree/test.txt
transfer/pos_tree/train.txt

Get Spanish NER Dataset

Get the CoNLL 2003 Spanish NER dataset using a LDC license, and organize the files with the following structure:

transfer/span/esp.testa
transfer/span/esp.testb
transfer/span/esp.train

Get English NER dataset

Get the CoNLL 2003 English NER dataset using a LDC license, and organize the files with the following structure:

transfer/eng.testa.old
transfer/eng.testb.old
transfer/eng.train

Labeling Rates and Data Splits

For each dataset, we first concatenate the training set and the dev set (training set always first). And then use the following function (in sample.py) to sample a list of indices that are used for training.

def create_sample_index(rate, len):
    np.random.seed(13)
    return np.random.choice(len, int(rate * len))

where rate is the labeling rate, and len is the number of instances (training+dev). The function will return an np array of indices; other instances not in the list will be discarded during training.

You can use the above function to reproduce the data splits for comparison of different models.

Transfer Learning with Our Model

The transfer learning scripts are in joint.py and lang.joint.py, where joint.py is used for transfer learning within one language, and lang.joint.py is used to cross-lingual transfer learning.

joint.py accepts the following input formats:

python2 joint.py --tasks <target_task_name> <source_task_name> --labeling_rates <labeling_rate_for_target_task> <labeling_rate_for_source_task> [--very_top_joint]

where task names come from the list

[genia, pos, ner, chunking, ner_span, twitter_ner, twitter_pos]

and labeling rates are float numbers. The flag very_top_joint indicates whether to share the parameters of the CRF layer or not.

Below are examples of the transfer learning settings used in our paper (Fig. 2):

# transfer from PTB to Genia
python2 joint.py --tasks genia pos --labeling_rates <labeling_rate> 1.0 --very_top_joint

# transfer from CoNLL 2003 NER to Genia
python2 joint.py --tasks genia ner --labeling_rates <labeling_rate> 1.0

# transfer from Spanish NER to Genia
python2 lang.joint.py --tasks genia ner_span --labeling_rates <labeling_rate> 1.0

# transfer from PTB to Twitter POS tagging
python2 joint.py --tasks twitter_pos pos --labeling_rates <labeling_rate> 1.0

# transfer from CoNLL 2003 to Twitter NER
python2 joint.py --tasks twitter_ner ner --labeling_rates <labeling_rate> 1.0

# transfer from CoNLL 2003 NER to PTB POS tagging
python2 joint.py --tasks pos ner --labeling_rates <labeling_rate> 1.0

# transfer from PTB POS tagging to CoNLL 2000 chunking
python2 joint.py --tasks chunking pos --labeling_rates <labeling_rate> 1.0

# transfer from PTB POS tagging to CoNLL 2003 NER
python2 joint.py --tasks ner pos --labeling_rates <labeling_rate> 1.0

# transfer from CoNLL 2003 English NER to Spanish NER
python2 lang.joint.py --tasks ner_span ner --labeling_rates <labeling_rate> 1.0

# transfer from Spanish NER to CoNLL 2003 English NER
python2 lang.joint.py --tasks ner ner_span --labeling_rates <labeling_rate> 1.0

Our Results (With More Results Than in the Paper)

Target Source Labeling Rate With Transfer Without Transfer
genia PTB 0.0 0.840899499608 N/A
genia PTB 0.001 0.916581258415 0.832640019292
genia PTB 0.01 0.963083539318 0.935592130383
genia PTB 0.1 0.981953738872 0.978035007335
genia PTB 1.0 0.990092642833 0.990655332489
genia Eng NER 0.001 0.87471269687 0.832640019292
genia Eng NER 0.01 0.941942485079 0.935592130383
genia Eng NER 0.1 0.979944132956 0.978035007335
genia Eng NER 1.0 0.989951970419 0.990655332489
genia Span NER 0.001 0.843853620305 0.832640019292
genia Span NER 0.01 0.93111070919 0.935592130383
genia Span NER 0.1 0.978718273347 0.978035007335
genia Span NER 1.0 0.989550049235 0.990655332489
PTB Eng NER 0.001 0.87471269687 0.841578354698
PTB Eng NER 0.01 0.949326669443 0.942871025961
PTB Eng NER 0.1 0.967891464976 0.965916979037
PTB Eng NER 1.0 0.974470513829 0.975334351428
Eng NER PTB 0.001 0.346473029046 0.335092085615
Eng NER PTB 0.01 0.749249658936 0.686385971674
Eng NER PTB 0.1 0.870218090812 0.86219588832
Eng NER PTB 1.0 0.91264717787 0.91208817241
Chunking PTB 0.001 0.622235477654 0.58375524895
Chunking PTB 0.01 0.867262565155 0.834900974403
Chunking PTB 0.1 0.927242176013 0.90649356106
Chunking PTB 1.0 0.953936031606 0.945709723506
Eng NER Span NER 0.001 0.346253229974 0.335092085615
Eng NER Span NER 0.01 0.726148735929 0.686385971674
Eng NER Span NER 0.1 0.865126276196 0.86219588832
Eng NER Span NER 1.0 0.912161558395 0.91208817241
Span NER Eng NER 0.001 0.164485165794 0.115025161754
Span NER Eng NER 0.01 0.604273247066 0.598373003917
Span NER Eng NER 0.1 0.765227337718 0.745397008055
Span NER Eng NER 1.0 0.848126232742 0.846034214619
Twitter POS PTB 0.001 0.020282728949 0.00860479409957
Twitter POS PTB 0.01 0.646588813768 0.503380454825
Twitter POS PTB 0.1 0.836508912108 0.748002458513
Twitter POS PTB 1.0 0.907191149355 0.893054701905
Twitter NER Eng NER 0.001 0.0137931034483 0.00950118764846
Twitter NER Eng NER 0.01 0.24154589372 0.0963855421687
Twitter NER Eng NER 0.1 0.432432432432 0.346534653465
Twitter NER Eng NER 1.0 0.6473029045 0.63829787234