Slide 1

Slide 1 text

kagglerのための AllenNLPチュートリアル @tamaki_730

Slide 2

Slide 2 text

自己紹介 Studio Ousia エンジニア twitter: @tamaki_730 機械学習/自然言語処理周り を担当 お客様のところにいったりも 最近kaggleできてない

Slide 3

Slide 3 text

このLT何? AllenNLPを使って過去の自然言語処理のコンペを 解いてみる AllenNLPがどんな感じか伝わればいいな LT10分しかないので理論よりの話はしません kaggle kernelとgithubにコードあげてるので 後ほどゆっくりみてください

Slide 4

Slide 4 text

kaggleでよくあるNLPタスク

Slide 5

Slide 5 text

テキスト分類

Slide 6

Slide 6 text

ここ最近のkaggleのNLPコンペ一覧 ● Quora Questions Pairs ● Toxic Comment Classification Challenge ● Quora Insincere Question Classification ● Gendered Pronoun Resolution ● Jigsaw Unintended Bias in Toxicity Classification comment_text: ボーダーコリーは賢い NLP Pipeline toxic: 0 テキストが与えられて、そのテキストが有害かどうかを判定するタスク

Slide 7

Slide 7 text

AllenNLPでの実装

Slide 8

Slide 8 text

AllenNLPって何? 最新の自然言語処理のモデルを ● 簡単に実装する ● 実験しやすくする ● 再現性があるようにする ためのPyTorchで作られたライブラリ(多分). 各モジュールがうまく分割されていて再利用性が高い. 基本的にはDatasetReader, Model, Predictorを実装するだけでよい (このLTではPredictorの説明はしません)

Slide 9

Slide 9 text

NLP Pipeline 文を分割し、 ID列に変換 前処理 機械学習モデル ID列を受け取り、 予測値を返す Input: ボーダーコリーは賢い Output: [15, 31, 67] Input: [15, 31, 67] Output: 0~1

Slide 10

Slide 10 text

AllenNLP Pipeline DatasetReader 前処理 機械学習モデル Model

Slide 11

Slide 11 text

AllenNLP Pipeline DatasetReader 前処理 機械学習モデル Model

Slide 12

Slide 12 text

DatasetReaderの役割 CSV, JSON等のテキストファイルを読み込み、Instanceのリストを返す input: {“comment_text”: “ボーダーコリーは賢い”, “toxic”: 0}... output: {'tokens': tensor([15, 31, 67], ...) ‘label’: 0, ...} “ボーダーコリー”, “は”, “賢い” 15, 31, 67 単語分割 IDに変換

Slide 13

Slide 13 text

AllenNLP Pipeline DatasetReader 前処理 機械学習モデル Model

Slide 14

Slide 14 text

Model ● torch.nn.Moduleのサブクラス→PyTorchで普通に書くのと大体一緒 ● Modelを抽象的に書くことができ、他の機能を試すのが楽 ● allennlp.modulesを組み合わせてModelを書いてもいいし、自分でmodule を作ってもいい model実装例: https://github.com/allenai/allennlp/tree/master/allennlp/models module実装例: https://github.com/allenai/allennlp/tree/master/allennlp/modules

Slide 15

Slide 15 text

よくあるPytorchのモデルとAllenNLPのモデル

Slide 16

Slide 16 text

よくあるPytorchのモデルとAllenNLPのモデル

Slide 17

Slide 17 text

抽象的にかけると何が嬉しいか? ● 簡単にmoduleを置き換えられるため比較実験がしやすい ○ TextFieldEmbedderをword2vecからBERTに変える等 ○ 単純なモデルから実験を始められる ここはword2vec以外にgloveや elmo, BERTといった他の単語埋め 込みの機能をもつモジュールが使え る

Slide 18

Slide 18 text

テキスト分類モデル 単語埋め込み 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

Slide 19

Slide 19 text

テキスト分類モデル 単語埋め込み 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

Slide 20

Slide 20 text

単語埋め込み 単語idをd 次元のベクトルで表現する 1単語につき1つのベクトルに変換 ● word2vec, GloVe, fastText等 文脈により単語のベクトルが変化 ● ELMo, BERT等 ボーダーコリー は 賢い

Slide 21

Slide 21 text

テキスト分類モデル 単語埋め込み 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

Slide 22

Slide 22 text

テキスト分類モデル Token Embedder 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

Slide 23

Slide 23 text

テキスト分類モデル Token Embedder 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

Slide 24

Slide 24 text

系列変換 単語ベクトル列から単語ベクトル列を作る 前後の単語を考慮し変換 ● LSTM ● self-attention ● 何もしない

Slide 25

Slide 25 text

テキスト分類モデル Token Embedder 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

Slide 26

Slide 26 text

テキスト分類モデル Token Embedder 文埋め込み 予測 Seq2Seq Encoder ボーダーコリー は 賢い

Slide 27

Slide 27 text

テキスト分類モデル Token Embedder 文埋め込み 予測 Seq2Seq Encoder ボーダーコリー は 賢い

Slide 28

Slide 28 text

文埋め込み 単語ベクトル列から文ベクトルを作る ● Bag of Embedding ● CNN + pooling ● LSTM(の最後の出力)

Slide 29

Slide 29 text

テキスト分類モデル Token Embedder 文埋め込み 予測 Seq2Seq Encoder ボーダーコリー は 賢い

Slide 30

Slide 30 text

テキスト分類モデル Token Embedder Seq2Vec Encoder 予測 Seq2Seq Encoder ボーダーコリー は 賢い

Slide 31

Slide 31 text

実際にjigsaw toxic comment classification challengeやってみる

Slide 32

Slide 32 text

最初に試すモデル 単語ベクトルを単純に平均して文ベクトルを作り、 その文ベクトルから予測するモデル TokenEmbedder: Embedding(glove + fastText) Seq2SeqEncoder: なし Seq2VecEncoder: Bag of Embedding best validation loss: 0.1658

Slide 33

Slide 33 text

次に試すモデル Seq2VecEncoderクラスを継承してSWEMEncoderを実装する SWEM (Simple Word-Embedding-based Methods) ACL2018 “Baseline Needs More Love: On Simple Word-Embedding-Based Models and Associated Pooling Mechanisms” TokenEmbedder: Embedding(glove + fastText) Seq2SeqEncoder: なし Seq2VecEncoder: SWEMEncoder(concat) best validation loss: 0.1658 -> 0.1373

Slide 34

Slide 34 text

JSONで実験の設定を記述

Slide 35

Slide 35 text

JSONでモデルを変更 抽象的に書いた部分はJSONで変更することができる 実験の管理のしやすさからも基本的にはこちらをおすすめ

Slide 36

Slide 36 text

次に試すモデル Toxicコンペからよく使われているモデルのアーキテクチャ(厳密には少し違う) https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52644 TokenEmbedder: Embedding(glove + fastText) Seq2SeqEncoder: 2層のLSTM Seq2VecEncoder: SWEMEncoder(concat) best validation loss: 0.1373 -> 0.0489

Slide 37

Slide 37 text

最後に試すモデル BERT. ここ最近のベースライン(重くて辛い) BERT (Bidirectional Encoder Representations from Transformers) NAACL 2019”BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding” TokenEmbedder: PretrainedBertEmbedder Seq2SeqEncoder: なし Seq2VecEncoder: BertPooler ...にしたかったが動かなかったのでほぼ同じモデルで代用 参考: https://github.com/allenai/allennlp/blob/master/allennlp/models/bert_for_classification.py

Slide 38

Slide 38 text

最後に試すモデル BERT. ここ最近のベースライン(重くて辛い) BERT (Bidirectional Encoder Representations from Transformers) NAACL 2019”BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding” best validation loss: 0.0489 -> 0.0392 Private Score(AUC): 0.9839 Public Score(AUC): 0.9845 公開されているkernelのシングルモデルの中では一番AUCが高いが、 Discussionに出てくる上位のシングルモデルに負けるぐらいのモデル

Slide 39

Slide 39 text

まとめ AllenNLPはいいぞ NLPコンペ出よう

Slide 40

Slide 40 text

参考にしたサイト "Writing code for NLP Research" Tutorial at EMNLP 2018 https://docs.google.com/presentation/d/17NoJY2SnC2UMbVegaRCWA7Oca7UCZ3vHnMqBV4SUayc/ “An In-Depth Tutorial to AllenNLP (From Basics to ELMo and BERT)” http://mlexplained.com/2019/01/30/an-in-depth-tutorial-to-allennlp-from-basics-to-elmo-and-bert/

Slide 41

Slide 41 text

このLTの実装 kaggle karnel: https://www.kaggle.com/decoflight/allennlp-example github: https://github.com/RyujiTamaki/kaggle_allennlp

Slide 42

Slide 42 text

Appendix

Slide 43

Slide 43 text

DatasetReaderの実装 read: テキストをファイルから読み込 んでパースし、text_to_instanceに 渡す text_to_instance: readからの入力 からInstanceを返す。Instanceはいく つかのFieldsを持つ。 例) TextField: Tokenizerで分割された文字や単語をいれる ArrayField: 配列をいれる