attention機構を持つLSTMを用いた含意関係認識
目次
今回はattention機構を持つLSTMを用いて含意認識を行います。
環境はこんな感じ
Ubuntu 16.04 python 2.7 tensorflow-gpu 1.2.0
今回のモデルはこれです。
参考論文は[REASONING ABOUT ENTAILMENT WITH NEURAL ATTENTION] https://arxiv.org/pdf/1509.06664.pdf
実行データのダウンロード
githubにてデータのダウンロードをします。
ここから
右上の緑のClone or Download からダウンロードしてください。
Dataset
今回の含意認識に使うデータセットはスタンフォード大学が提供する
The Stanford Natural Language Inference (SNLI) Corpusです。
コーパスの例
Text | Judgments | Hypothesis |
---|---|---|
A man inspects the uniform of a figure in some East Asian country. | contradiction | The man is sleeping |
An older and younger man smiling. | neutral | Two men are smiling and laughing at the cats playing on the floor. |
A black race car starts up in front of a crowd of people. | contradiction | A man is driving down a lonely road. |
A soccer game with multiple males playing. | entailment | Some men are playing a sport. |
A smiling costumed woman is holding an umbrella. | neutral | A happy woman in a fairy costume holds an umbrella. |
分類はentailment,neutral,contradictionの3種類にわけられ、5人の人間の意見による多数決によってラベル付けされています。
データの規模は57万データあり、すべての文はパースされています。
ダウンロードは下記のURLから
http://nlp.stanford.edu/projects/snli/snli_1.0.zip
ダウンロードしたzipファイルを解凍すると、_MACOSX
とsnli_1.0
のファイルがあるのでsnli_1.0
のフォルダの中身をdata/dataset
に入れる。
(.DS_store
,Icon^M
,README.txt
は入れなくてもOK)
Word2Vect
Word2Vectによって学習済みの単語の分散表現のデータをダウンロードします。
今回はGoogleNewsをもとに学習したデータを使います。
下記からダウンロード
ダウンロードできない人は下記からGoogleNews-vectors-negative300.bin
だけをダウンロードする。
GitHub - mmihaltz/word2vec-GoogleNews-vectors: word2vec Google News model
ダウンロードしたGoogleNews-vectors-negative300.bin
をdata
の中に入れる。
プログラムの変更
githubでダウンロードしたプログラムでは python 2.7 tensorflow-gpu 1.2.0の環境で実行できないので プログラムの中身を変更します。
事前に変更しておいたプログラムがありますので下記からすべてダウンロードし
python
のファイルの中に上書き保存してください。
プログラム実行
実際に動かして行きましょう。まずはterminalにてpython
のあるディレクトリへ移動します。
いくつかのオプションを閲覧するときは下記を実行してください。
python main.py --help
トレーニングを開始するには
python main.py --train
すると、、、 こんな感じでトレーニングが開始します。
ちなみにデフォルトでのハイパーパラメータはこのようになっています。
learning_rate = 0.001 weight_decay = 0. batch_size_train = 24 num_epochs = 45 sequence_length = 20 embedding_dim = 300 num_units = 100