$30 off During Our Annual Pro Sale. View Details »

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

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

RyujiTamaki

July 13, 2019
Tweet

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. テキスト分類

    View Slide

  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
    テキストが与えられて、そのテキストが有害かどうかを判定するタスク

    View Slide

  7. AllenNLPでの実装

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    View Slide

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

    賢い

    View Slide

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

    賢い

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  34. JSONで実験の設定を記述

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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に出てくる上位のシングルモデルに負けるぐらいのモデル

    View Slide

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

    View Slide

  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/

    View Slide

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

    View Slide

  42. Appendix

    View Slide

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

    View Slide