【Kaggle Advent Calendar day19】NLP初手はどれ?〜Kaggle Notebookの人気ランキングと簡単な精度比較〜

Kaggle Advent Calendar 19日目の記事です。Kaggle Advent Calendar初参加ということで、お手柔らかにお願いします。

qiita.com

前日の記事は sinchir0 さん

日本は他の国のKagglerよりTwitterが活発なのか - sinchir0のブログ

翌日は upura さん

【Weekly Kaggle News 2周年】クリック記事ランキング2021 - u++の備忘録

です。
いきなり余談かつ私事で申し訳ないですが、日頃から大変お世話になっているお二人に挟まれて嬉しさと恐縮さがないまぜになっております。

申し遅れました、Kaggle Competitons Expertの増田と申します、よろしくお願いします。お笑い鑑賞が好きで、本日のM-1グランプリ決勝もとても楽しみです。

この記事は何?

一言で言うと、

NLPコンペにおける「初手」を考えるためのヒントとして、KaggleのNLPコンペにおける人気の手法を集計してランキングを眺めてみよう!

という主旨になります。「Kaggleノートブックでよく使われているということは実践で有効なはずだ!」という仮説に基づいていることになります。テーブルではLightGBM、画像分類では SwinTransformer/EfficientNet/ResNet などとある程度定番の初手が広く認知されているのに対して、NLPでは「やっぱりBERTかな?」と思いつつも、初手の知見を聞くことが相対的に少ないような??と感じたのが調査開始のきっかけとなりました。もちろん、「良いモデル」の選び方は解きたい問題にも大いに依存するでしょうし、モデル以外の改善ポイントもたくさんあるとは思いますが、そのあたりの調査はまたの機会にということで。

ありふれたテーマですが、意外と日本語記事で全く同じことをしている方は見つからなかったので、自身の実装力の向上も兼ねて挑んでみることにしました。

TL; DR

LSTM (/RNN/GRU)・BERT・RoBERTaの3強で、簡単な実験ではCNNも強かった。しかしながら、やはりアンサンブル前提で複数試すべき。

この記事からは得られないこと

論文ではないので、精度比較に対する詳細でサイエンティフィックな考察は述べていません。特に結果の解釈が難しくなりがちな領域だと個人的に思っているので、詳しい方がいらっしゃいましたらぜひコメント等で補足いただけると嬉しいです。

また、それぞれの手法の技術的な解説はせず、各種書籍や技術ブログ等に委ねます。気になった方は、せっかくKaggle Advent Calendarなので「NotebookをForkして動かしてみよう!」という学び方も素敵ですね。

最後にもう1点、筆者はNLPコンペ経験が極めて少ない(現在のJigsawコンペが初参戦)ため、上位入賞経験を踏まえた解説も残念ながらありません。。。(精進します)

先行調査についてご説明

この記事のモチベーションは下記のnekoumeiさんのQiita記事での精度比較実験とよく似ています。

[Python]文書分類における文書ベクトル表現手法の精度比較 - Qiita

本記事との相違点としては以下が挙げられます。

・本記事はあくまでKaggleでよく見る特徴量・モデルにフォーカスしていること

・その結果として、本記事ではCNN/LSTM/BERTなどNN系の実験が多くなったこと

・本記事では英語データセットを使っていること(Kaggleでよく出る英語で勝ちたい!🔥という意図から)

調査のやり方

8つのNLPコンペのCode(Notebook)のタイトル一覧からモデル・特徴量のキーワードについて雑に目grepし、使われていた回数が20回以上のものをランキング形式で紹介したいと思います。タイトルに入っていないが使用している場合もあると思いますが、そういうケースは取り逃がしている点ご了承ください(真面目にやるなら中のコードを見てimportしているライブラリを集計するとかになるかと思います)。

8つのコンペとは以下です。

・Jigsaw Rate Severity of Toxic Comments

・Jigsaw Multilingual Classification

・Jigsaw Unintended Bias in Toxicity Classification

・Toxic Comment Classification Challenge

Google QUEST Q&A Labeling

・Gendered Pronoun Resolution

・CommonLit Readability Prize

・chaii - Hindi and Tamil Question Answering

筆者が把握しているNLPコンペを寄せ集めただけなので、漏れがあると思います。また、ちょうど記事執筆中に最新のNLPコンペ「Feedback Prize - Evaluating Student Writing」が始まりましたが、こちらはまだほとんどモデリングのノートブックが公開されていないため対象外としています。

※筆者の手作業によるため、間違いなく真値とのズレが生じていると思います。ざっくり人気傾向を見たかっただけなのでこのような簡易的な集計法になっている点、ご了承ください。
(略称の書き方なども多岐にわたるため、自動集計しようとしても正規表現を考えるのもそれなりに骨が折れると思い、やめました。また、自分が知らなかった名前も拾えるだろうという思惑で目grepを選びましたが、結果的に聞いたことのあるものがほとんどで、見知らぬ手法は上位にランクインしませんでした。本当に見知らぬ手法名を取り逃がしている可能性は否めませんが、流石にそんな奴らの獲得票数はそこまで多くないはず…)

データセットとしては、トイデータにはなりますが学習時間が短くて済むため「News Aggregator Data Set」の記事タイトルからジャンルを分類するものを使わせていただきました。(画像でいうところのMNIST的なデータセットだと思います)

UCI Machine Learning Repository: News Aggregator Data Set

データセットのダウンロードや整形はこちらを参考にしました。

【PyTorch】BERTを用いた文書分類入門 - Qiita

ハイパラまでチューニングしだすとキリがないので、原則としてモデルのデフォルト値を使います。NN系のアーキテクチャについては、KaggleノートブックでUpvoteの高いものを拝借させていただく形を取りました。train,valid,testは8:1:1で分割しています。

精度比較実験のコードは、Jupyter notebookの非常に簡易的で整備されていないもので恐縮ですがGitHubにアップしておりますので、ご自由にお使いください。現状のリポジトリは決して完成系でなく、綺麗なコードに直したり、複数データセットで比較したり、学習・検証データでk-fold CVを切ったり、複数シードでの中央値を比較対象にしたりなど随時アップデートしていきたいと思います。

GitHub - taro-masuda/nlp_modeling_comparison

※「精度比較なんてPapers with Codeで十分なのでは?」という声が聞こえてきそうですが、あえて自分で手を動かすことが自分の財産になると思ったのでこのような試みを始めています。入門者を温かく見守る感じでご覧ください。

調査結果(人気ランキング)

〜モデル部門〜

1位:LSTM、RNN、GRU(276票)

BERT以前から広く使われてきていたLSTM系が堂々の第1位でした。これら3つは親戚のような手法であるとともに、集計途中で明らかにトップレベルに使われていそうだったので、集計を楽にするためにまとめてしまっています。評価実験では代表としてLSTM選手に登場していただきますが、3種類全ての実験結果も後日追加しようと思います。

しかしながら、1位とはいえ最近のコンペでは2,3位のBERT系に押され気味なのが気になります。開催中の「Jigsaw Rate Severity of Toxic Comments」では14個ということでまだまだ現役である感はありますが、「chaii」では1つも登場しませんでした。

2位:BERT(247票)

はい、さすが2018年に現れてから「自然言語処理の王様」と名高いだけありますね。1位が3種のチームマージ優勝だったので、BERTはソロ部門の優勝ですね。まさに王様。やはり上位は驚きのない結果が続きます。

3位:RoBERTa(203票)

Jigsaw Multilingualコンペ、chaiiコンペで多言語を扱うべく「XLM-RoBERTa」が、CommonLitコンペでベースのRoBERTaがそれぞれ圧倒的人気を誇りTop3にランクインしました。この記事の実験では多言語タスクは解かないため、ベースのRoBERTaとの合体票とさせていただきました。こちらも色々なノートブックでよく見るモデルなのでしっかり押さえたいところです。

今回のモデルの中で一番大きくて回すのが大変な印象がありますが、ColabでランタイムをTPUにすればすぐに回し終えることができました。BERT系の実験はこちらのノートブックを拝借させていただきました。

Jigsaw TPU: XLM-Roberta | Kaggle

同じくらいの時期に「ALBERT」もBERTの進化系として話題になったはずですが、Kaggleノートブック人気はあまりないようでした。その辺りの考察ができたらまた記事を書きたいと思っています。

4位:LightGBM、XGBoost(72票)

テーブルコンペの初手でお馴染みLGBMさんですが、テキストデータ界隈ではこの位置に来ました。それでもよく使われることに変わりはないので、比較対象に入れてみましょう。XGBさんも親戚なので合体票とさせていただきました。後述の「特徴表現部門」の色々な特徴量のパターンを試してみようと思います。

5位:CNN(70票)

画像で効果的であるというイメージばかり先行していたので、ここまでNLPで人気だというのは個人的には意外でした。しっかり自分の武器の1つにしたいと思います。こちらのノートブックを参考にします。

CNN GLOVE300 3-OOF 3 epochs | Kaggle

6位:Logistic Regression(ロジスティック回帰)(62票)

いわゆる枯れたモデルですが、特に昔のコンペに行く程よく使われていたためTop10にランクインしました。使い方も難しくなく計算も速いので、比較としてはとても試しやすいですね(有り難い。。。)そういう手軽さや、挙動が分かりやすいところが人気の理由なのかもしれません。とはいえ、こちらも最近のコンペでは下火のようです。

7位:SVMSupport Vector Machine, サポートベクタマシン)(48票)

SVR, SVCといった表記の合体票です。Twitterではしばしば「SVMが実践で役立ったことはない」とディスられがちなSVMさんですが、意外にもノートブック人気は高いです。本当に使えないのかどうか、比較対象にしてみましょう。

8位:DistilBERT(38票)

蒸留により軽量化されたBERTですね。計算が速くなり実験のイテレーションも多く回せるのが人気の秘訣でしょうか。

9位:ナイーブベイズ(Naive Bayes)(34票)

6位「Logistic Regression」と全く同じことが言えます。笑

10位:Ridge/Lasso Regression(リッジ回帰, ラッソ回帰)(23票)

せっかくランクインしていただいたRidge/Lassoさん達ですが、今回は一旦分類問題を解かせるということで実験対象からは外しています😢  今後時間を見つけて回帰でも比較実験をしてみたいところです。最近ですとCommonLitがデータ規模小さめの回帰タスクだと話題を呼んでいたためうってつけですね。

〜特徴表現部門〜

1位:GloVe(48票)
2位:Word2Vec(CBOW, skip-gram, doc2vecなど)(35票)
3位:FastText(22票)

これらに加え、TF-IDFさんも数多く使用されていたため、比較対象に入れます(いちいちカウントするのは面倒になってやめました、すみません)。

なお、TF-IDFは万単位の高次元ベクトルに達することが多いため、SVD(Singular Value Decomposition; 特異値分解)で300次元に圧縮して使用することにします。その他の特徴量も300次元がデフォルトの場合が多くなるべく次元数を揃えたかったところですが、BERTのembeddingは768次元がデフォルトになっているものをそのまま使いました。また、ナイーブベイズに対してだけは、次元圧縮せずそのまま突っ込むということと、負のベクトルを入れるべきでないという事情からTFIDFのみを特徴ベクトルとして使います。

単語毎に特徴ベクトルが算出されるembeddingについて、系列として扱わないモデルにはSWEM-averageで単純な平均プーリング特徴を突っ込むことにします。こちらのコードを拝借します。

GitHub - yagays/swem: Python implementation of SWEM (Simple Word-Embedding-based Methods)

精度比較結果

f:id:taro_masuda:20211219014055p:plain

結果は表のようになりました。val_accやtest_accを高くできた優勝者はCNNで、AUCやloglossも含め総合的に良い値を叩き出せているのはCNNに加えてLSTMとBERTでした。まさに深層学習最盛期を象徴するような結果ですね。

今回のEmbedding-SWEM系の敗因としては、他の手法との条件を揃えるためストップワードの除去など丁寧な前処理なしの重みなし平均プーリングしており、分類にとって重要でない単語の特徴がノイズになったのではないかと考えられます。

対照的に、TFIDF系であれば重要でない単語の寄与度が減ってくるため、そこそこいい精度を出せています。BERTについては、self-attentionを使ってどういう単語に注意を向けるかが学習できていたのだと思いますが、同様のことが言えるRoBERTaが9割超えならずとなったのはあまり腑に落ちない結果となりました。逆の話で、LSTMにとっては必ずしも長期記憶の強みが発揮されるとは言いにくい短いテキストだったはずですが、ここまで良くなった理由も今のところはっきり分かっていません。

LSTMでは異なる種類の分散表現でも軒並み高い精度を出せたのですが、LightGBMではw2v << GloVe < TFIDF < FastText とかなり精度に差が出ているところが気になります。はっきりとした原因はわかっていませんが、SWEMでの平均プーリング操作への頑健性の差が出たのでしょうか。実際のコンペではdo everything精神で全て試してみる方が良さそうに思います。

また、GBDT系の2つのモデル(LGBM vs XGB)を比べてみると、あらかたLGBMの方が勝利していることもわかります。ハイパラ調整で結果も変わってきそうではありますが、この辺りの「手のかからなさ」が理由でLGBMがより持て囃されているのだろうと推測されます。今回の場合は、分散表現の中では最近寄りに提案されたfasttextとコンビを組むと決して悪くない結果を出せていると思います。

ナイーブベイズやロジスティック回帰など、古典的な手法も割と侮れないほど結果を出してきているところにも注目したいです。最近の実戦のコンペではより複雑で大規模なデータと格闘しなければならないため、それ相応の表現力を持ったものが好まれているのだと推測しました。SVMについては、BERT embeddingを使った場合は素晴らしい精度を出せていましたが、下馬評通りあまりかっこいいところが見せられていない結果も多いです。チューニング芸に長けている方なら色々なシーンで性能を引き出せるのかもしれませんが、素人が初手として選ぶようなモデルではない気がしました。

その他の参考文献

テーブルデータ向けの自然言語特徴抽出術

文章の埋め込みモデル: Sparse Composite Document Vectors を読んで実装してみた - nykergoto’s blog 

Kaggle Grandmasterに学ぶ 機械学習 実践アプローチ | マイナビブックス

いずれも、具体的な特徴抽出の実装コードを参考にさせていただきました。この場を借りて深い感謝を申し上げます。

おわりに

本記事では、NLPコンペにおける「初手」を考えるためのヒントとして、KaggleのNLPコンペにおける(ここ数年の)人気の手法を集計してごく簡単な精度比較実験をしてみました。結論としてはBERTやRoBERTa、LSTM系が初手の候補になり得ると思います。今回の実験で活躍したCNNも味方になってくれそうです。

しかし、バラエティに富んだモデリング手法がノートブックで公開されていることや、最近のコンペの解法でも多くのモデルのアンサンブルがその強力さゆえに盛んに用いられていることから、様々なモデルを自分の道具としてストックしておくことも重要だと考えています。サクッと複数のモデル学習を回す力を養っておけば、コンペで差がつくと思われる前処理・後処理やオリジナルの特徴抽出などを考えるために割ける時間が増えることでしょう(と今後の自分の成長に期待)。集計作業は地味で大変なものでしたが、その分この分野でホットな手法を俯瞰することができたので、今ではやって良かったと思っています。しかしながらなにぶん進歩の早い業界なので、また数年後にランキング集計からやり直すことも求められそうです😇

皆さんがモデリングするにあたってこの記事が少しでも参考になっていれば幸いです。

ブログのコメント欄はもちろん、Twitter, GitHubでのフィードバックも随時歓迎しています!よろしくお願いいたします。

Taro Masuda (@ml_taro) | Twitter