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

AutoGluon-Tabular を用いたアンサンブルによる日本語質問応答システムの構築 /...

AutoGluon-Tabular を用いたアンサンブルによる日本語質問応答システムの構築 / AIO solution by AutoGluon-Tabular

言語処理学会第27回年次大会(NLP2021)ワークショップ2「AI王 〜クイズAI日本一決定戦〜」での発表資料
https://sites.google.com/view/nlp2021-aio/

Shotaro Ishihara

March 19, 2021
Tweet

More Decks by Shotaro Ishihara

Other Decks in Research

Transcript

  1. Atsunori Fujita & Shotaro Ishihara チーム: fujita&u++ 言語処理学会第27回年次大会(NLP2021) ワークショップ 2

    「 AI 王 〜クイズ AI 日本一決定戦〜」 2021 年 3 月 19 日 AutoGluon-Tabular を用いたアンサンブル による日本語質問応答システムの構築
  2. • 藤田 充矩(Amazon Web Services) ◦ クイズは苦手です • 石原 祥太郎(日本経済新聞社)

    ◦ (一時期の)高難易度時代の高校生クイズで活躍していた愛知県・東海高校出身 ◦ YouTube カプリティオチャンネルが好き 自己紹介 2
  3. 最終モデルの概要 3 1. cl-tohoku/bert-base-japanese-whole-word-masking 2. cl-tohoku/bert-base-japanese-whole-word-masking & noun filter 3.

    cl-tohoku/bert-large-japanese-whole-word-masking 4. cl-tohoku/bert-base-japanese-char-whole-word-masking 5. nict_bert_32k 7. nict_bert_32k & cosine similarity & head-tail 6. nict_bert_32k & noun filter 8. nict_bert_100k 9. char n-gram Optimized for dev1 and dev2 Averaging 10. tf-idf 11. bm25 AutoGluon-Tabular × 3
  4. • 文献 [鈴木ら 2020] に倣い、BERT [Devlin et al. 2019] の事前学習済みモデルを初

    期値とし、学習用データで fine-tuning して、クイズ解答用のモデルを学習 • 事前学習済み言語モデル ◦ huggingface/transformers: https://github.com/huggingface/transformers ◦ NICT BERT 日本語 Pre-trained モデル: https://alaginrc.nict.go.jp/nict-bert/index.html • 運営によるベースラインコードからの差分 ◦ 学習時に利用する選択肢の数を 5 から 20 に変更 ▪ bert-large のみメモリの問題で選択肢 5 (正解 + ランダム 4、学習の中で抽出) ◦ all_candidate.json をベクトル化(TFIDF->SVD)して得られた256次元を最終層に結合 ◦ 「dev1を含めて学習しdev2で検証」「dev2を含めて学習しdev1で検証」の2種類を用意 BERT全体共通 4
  5. • question と context を TFIDF でベクトル化しコサイン類似度を算出し、 BERT の入力として活用 ◦

    解答候補20をコーパスにして question をベクトル化→コサイン類似度を各 context とのペア で計算 工夫② コサイン類似度の計算(cosine similarity) 6
  6. • 機械学習モデルを探索する AutoML の OSS ライブラリ [Erickson et al. 2020]

    • 各モデルの dev1, dev2, test に対する予測値を入力として利用 • LightGBM、CatBoost、Random Forests、Extremely Randomized Trees、k- Nearest Neighbors、AutoGluon-Tabular NN model などのラッパー https://pages.awscloud.com/rs/112-TZM-766/images/1.AWS_AutoML_AutoGluon.pdf 工夫④ AutoGluon-Tabularによるアンサンブル 8
  7. 各モデルの実験結果 9 Model Acc with dev1 Acc with dev2 1.

    cl-tohoku/bert-base-japanese-whole-word-masking 0.8665 0.8713 2. cl-tohoku/bert-base-japanese-whole-word-masking & noun filter 0.8365 0.8402 3. cl-tohoku/bert-large-japanese-whole-word-masking ※1: 0.8544 ※1: 0.8544 4. cl-tohoku/bert-base-japanese-char-whole-word-masking 0.8425 0.8310 5. nict_bert_32k 0.8655 0.8723 6. nict_bert_32k & noun filter 0.8655 0.8643 7. nict_bert_32k & cosine similarity & head-tail 0.8736 0.8703 8. nict_bert_100k 0.8886 0.8763 9. char n-gram - - 10. tf-idf - - 11. bm25 - - Ensembling by AutoGluon-Tabular 0.9267 0.9266 ※1: dev1とdev2の平均値を表示
  8. 参加者の方に聞きたいこと • 土地名、国名などコンテキストに広いトピックが含まれる解答候補に苦戦しました。どう対応しました か? • 論理的な問題は解けませんでした。どう対応されましたか? • 解答候補の単語の意味だけが重要でコンテキストには質問に必要な情報が含まれていない問題に 苦戦しました。どう対応されましたか? •

    問題文を加工する工夫をしましたか?「蘭学者の宇田川玄随や稲村三伯らを輩出した、大槻玄沢が 江戸に開いた、当時の蘭学研究の中心であった私塾は何?」だと、問題文を読点で分割して最後の 部分を使うなどの処理ができそうですが、上手くいきませんでした。 11
  9. 参考文献 • [鈴木ら 2020] 鈴木正敏, 鈴木潤, 松田耕史, ⻄田京介, 井之上直也. “JAQKET:クイズを題材にした日本語QAデータセットの

    構築”. 言語処理学会第26回年次大会(NLP2020)発表論文集 • [Devlin et al. 2019] Jacob Devlin, Ming-Wei Chang, Kenton Lee, and KristinaToutanova. BERT: Pre-training of Deep Bidirectional Trans-formers for Language Understanding. InNAACL, volume 1,pages 4171–4186, 2019. • [Sun et al. 2019] Chi Sun, Xipeng Qiu, Yige Xu, Xuanjing Huang. How to Fine-Tune BERT for Text Classification?. arXiv [cs.CL]. arXiv. http://arxiv.org/abs/1905.05583, 2019. • [Erickson et al. 2020] Nick Erickson, Jonas Mueller, Alexander Shirkov, Hang Zhang, Pedro Larroy, Mu Li, Alexander Smola. AutoGluon-Tabular: Robust and Accurate AutoML for Structured Data. arXiv [cs.LG]. arXiv. https://arxiv.org/abs/2003.06505, 2020. 12
  10. from scipy.optimize import minimize def f(x): pred = 0 for

    i, d in enumerate(dfs_dev1): if i < len(x): pred += d * x[i] else: pred += d * ( 1 - sum(x)) score = log_loss(df_dev1[ 'ground_truth_idx' ], pred) return score init_state = [ round(1 / len(dfs_dev1), 3) for _ in range(len(dfs_dev1) - 1)] result = minimize(f, init_state, method= 'Nelder-Mead' ) print('optimized CV: ' , result['fun']) print('w: ', result['x']) 工夫: 検証用データでの性能を最適化する重みの計算 16