nissy.dev

Kaggle Google QUEST Q&A Labeling 反省

03/10/2020
9 min read
Table of Contents

初めて真面目に Kaggle に参加した (2 週間前チャレンジ...) ので、その備忘録です。

コンペ振り返り

やったこと

基本的に以下でやったことはほとんど全てうまくいかなかった。。。
Bert なにもわからない。。。

  • NLP での基本的な文章ベクトルによる回帰 → Bert よりかなり精度が悪かった
    • 全てのラベルについて、カーネルのコメントにあった Post Process も行ってみた
  • 公開カーネルの Bert モデルのチューニング → 精度改善はしなかった
    • 出力層に近い層での Dense 層を増やす
    • 全データ学習
    • focal loss (不均衡データに対する損失)
      • Twitter でもあまりうまくいくケースがないみたいな話をみた
    • multi task モデル
    • カテゴリを Embedding して、Concat する
  • Bert のアンサンブル → 唯一効いた
    • rank average ensemble

やらなかったこと

  • XLNET や Roberta などの大きなモデルの準備
    • Colab では Bert の学習の倍の時間がかかるため撤退
  • Question のラベルと Answer のラベルを分けてモデリング
    • 時間がなかった...
    • 上位はモデルを工夫していると思っていた...

反省

NLP の基本

文章の前処理 (英語、分割前)

以下のカーネルがかなり参考になる
https://www.kaggle.com/theoviel/improve-your-score-with-some-text-preprocessing
https://www.kaggle.com/sudalairajkumar/getting-started-with-text-preprocessing

  1. HTML の除去
  2. URL の除去
  3. 数字の除去 (基本的に数字は役に立たないことが多いので省く)
  4. 大文字を小文字へ (Embedding 側も同じ変換をしてあげる)
  5. 短縮系への変換
  6. 特殊文字を消す (もしくは変換する)
  7. スペルミスの変換

以下はタスクによって考える
特に、文章の分散表現を得る場合はやらないことが多かった (文が不自然になるから...?)

  1. stopwords の除去
  2. Lemmatization, Stemming (活用形を統一する, running, run, ran などを統一)
  3. 絵文字の変換
  4. 頻出単語やレアな単語の削除 (7 である程度行なっている & タスクによっては除かない方がいいケースも)

日本語はかなりブログが出てくるので割愛

文章と単語のベクトル化

参考資料:https://www.ogis-ri.co.jp/otc/hiroba/technical/similar-document-search/part1.html

文章のベクトル化 (古典的な手法)

基礎は単語の出現回数によってベクトル化する手法。表現力にはかなり限界がある。
またかなり次元が大きくなるので、Kaggle などでは SVD などで次元圧縮する人が多い

  • Bag of Words (BOW)
    • 一番基礎
    • 形態素解析と呼ばれる処理で単語単位に分割を行い、文章毎に各単語が何回出現したかを数え上げ
    • 長さが語彙数となるベクトル
    • 化学で言う部分構造数え上げみたいなもの
  • TF-IDF
    • ここら辺から実際使われる
    • TF と IDF の積
    • TF:ある単語(t)がある文書(d)中で何回出現したか
    • IDF:ある単語(t)が全文書集合(D)中のどれだけの文書で出現したかの逆数

単語のベクトル化

数え上げだけではなく、ここからは単語の持つ意味的な情報を用いる手法が出てくる。
単語の分散表現の取得。基本的には、fasttext で良い気がする。

文章のベクトル化

基本的には以下の 4 つが順当な予感。SWEM が一番楽だし、ベースラインとして利用できそう。

検証している人:
https://qiita.com/nekoumei/items/1f5ec09e422a4be99810
文書分散表現 SCDV と他の分散表現を比較してみた

Bert

Bert 入門記事
https://qiita.com/Kosuke-Szk/items/4b74b5cce84f423b7125
https://www.slideshare.net/matsukenbook/bert-217710964
https://www.ogis-ri.co.jp/otc/hiroba/technical/similar-document-search/part3.html

論文
https://arxiv.org/pdf/1810.04805

  • モデル
  • 学習方法
    • データは大規模コーパス (Wikipedia)
    • 教師なし学習で事前学習
      • 文の単語の穴埋めタスクと文が連続するかを予測するタスク
    • 各タスクで Fine Tuning
      • 各タスクのモデルも少しづつ異なる
        • Q&A のタスクだと入力の最後の数単語の Embedding を使う
      • ほとんどのタスクで SOTA
  • FineTuning
    • 実装は huggingface/transformers を使う
    • 前処理はあんまり必要ではない
      • html タグを除くくらいで十分らしい
    • 主に 「入力の作り方」、「モデルの構造」の 2 つのポイントで改良できる
      • モデルの方はあんまり精度に影響は与えないかも...