Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

8c3fa7bf2f8e5cec057c886d19a5d35c?s=128

RyujiTamaki

July 13, 2019
Tweet

Transcript

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

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

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

  4. kaggleでよくあるNLPタスク

  5. テキスト分類

  6. ここ最近の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 テキストが与えられて、そのテキストが有害かどうかを判定するタスク
  7. AllenNLPでの実装

  8. AllenNLPって何? 最新の自然言語処理のモデルを • 簡単に実装する • 実験しやすくする • 再現性があるようにする ためのPyTorchで作られたライブラリ(多分). 各モジュールがうまく分割されていて再利用性が高い.

    基本的にはDatasetReader, Model, Predictorを実装するだけでよい (このLTではPredictorの説明はしません)
  9. NLP Pipeline 文を分割し、 ID列に変換 前処理 機械学習モデル ID列を受け取り、 予測値を返す Input: ボーダーコリーは賢い

    Output: [15, 31, 67] Input: [15, 31, 67] Output: 0~1
  10. AllenNLP Pipeline DatasetReader 前処理 機械学習モデル Model

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

  12. DatasetReaderの役割 CSV, JSON等のテキストファイルを読み込み、Instanceのリストを返す input: {“comment_text”: “ボーダーコリーは賢い”, “toxic”: 0}... output: {'tokens':

    tensor([15, 31, 67], ...) ‘label’: 0, ...} “ボーダーコリー”, “は”, “賢い” 15, 31, 67 単語分割 IDに変換
  13. AllenNLP Pipeline DatasetReader 前処理 機械学習モデル Model

  14. 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
  15. よくあるPytorchのモデルとAllenNLPのモデル

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

  17. 抽象的にかけると何が嬉しいか? • 簡単にmoduleを置き換えられるため比較実験がしやすい ◦ TextFieldEmbedderをword2vecからBERTに変える等 ◦ 単純なモデルから実験を始められる ここはword2vec以外にgloveや elmo, BERTといった他の単語埋め

    込みの機能をもつモジュールが使え る
  18. テキスト分類モデル 単語埋め込み 文埋め込み 予測 系列変換 ボーダーコリー は 賢い

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

  20. 単語埋め込み 単語idをd 次元のベクトルで表現する 1単語につき1つのベクトルに変換 • word2vec, GloVe, fastText等 文脈により単語のベクトルが変化 •

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

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

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

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

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

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

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

  28. 文埋め込み 単語ベクトル列から文ベクトルを作る • Bag of Embedding • CNN + pooling

    • LSTM(の最後の出力)
  29. テキスト分類モデル Token Embedder 文埋め込み 予測 Seq2Seq Encoder ボーダーコリー は 賢い

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

    賢い
  31. 実際にjigsaw toxic comment classification challengeやってみる

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

    Bag of Embedding best validation loss: 0.1658
  33. 次に試すモデル 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
  34. JSONで実験の設定を記述

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

  36. 次に試すモデル 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
  37. 最後に試すモデル 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
  38. 最後に試すモデル 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に出てくる上位のシングルモデルに負けるぐらいのモデル
  39. まとめ AllenNLPはいいぞ NLPコンペ出よう

  40. 参考にしたサイト "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/
  41. このLTの実装 kaggle karnel: https://www.kaggle.com/decoflight/allennlp-example github: https://github.com/RyujiTamaki/kaggle_allennlp

  42. Appendix

  43. DatasetReaderの実装 read: テキストをファイルから読み込 んでパースし、text_to_instanceに 渡す text_to_instance: readからの入力 からInstanceを返す。Instanceはいく つかのFieldsを持つ。 例)

    TextField: Tokenizerで分割された文字や単語をいれる ArrayField: 配列をいれる