データ分析メモ

主にデータ分析のことについて書きます。

Jigsaw Rate Severity of Toxic Comments 振り返り

はじめに

2022年参加した分析コンペの記録 第2弾です。 前回に引き続き、成績としては芳しくない結果でしたが何かの参考になれば幸いです。 (Private 452th)

Jigsaw Rate Severity of Toxic Comments とは

Jigsaw Rate Severity of Toxic Comments | Kaggle

Alphabet参加のJigsaw/Conversation AIが主催したKaggleでは4回目のコンペです。 過去3回のコンペの中には、WikipediaTalk pageに書かれている有害なコメントを分類するタスクなどがありました。

これまでは既にコメントに対して、有害かそうでないかのアノテーションがされていましたが 今回のJigsawコンペではアノテーション済みの学習データは存在しないことが特徴的でした。

与えられていたデータは評価用の[validation_data.csv] で、アノテータがどちらの文章が有害かを判定した結果です。 1つの文章の組み合わせに複数人のアノテータが評価をしており、必ずしもアノテータ全員の結果が一致するとは限りません。(以下、アノテータによる評価が一致しない例)

worker less toxic more toxic
A ######## ********
B ######## ********
C ******** ########

よって、validation_data.csvでの評価が less < more で全て一致することはあり得ず、理論上の正解限界値は0.824であることがDiscussionで指摘されてました。該当Discussion

参加者が取り組むタスクは、テストデータとして与えられているtextデータに対して有害度をRankingにすることです。

Rankingをもとに、テストのtextデータの組み合わせに対してアノテータの評価と一致するかどうかを競います。

コンペホストからは、モデルの学習に役立つ可能性のあるデータとして過去のJigsawコンペのデータやRudditのデータが推薦されていました。

また、このコンペの特徴としてLBの結果に使われるデータがテストデータの5%しかないことが挙げられます。 テストではトータルで200,000件の組み合わせ評価がされるので、10,000件の組み合わせ結果がLB上に表示されます。 validation_data.csvは30,000件の組み合わせが存在しており、Trust CVが試されるコンペでした。

やったこと

Solution図

f:id:forcelog:20220208185156p:plain
jigsaw_solution

コンペ序盤~中盤

PetFinder2で惨敗した私としては、過去データセットが重要であると睨んでいました。

また、昨年参加したNLP系のコンペ CommonLitの1st solutionでも外部データセットを用いた解法が紹介されていましたので 過去のデータ&類似した外部データ での学習に重点的に取り組みました。

外部データはHateSpeechDataを基に、英語のデータセットWikiSNSでのデータをいくつかピックアップして使用することにしました。(以下、使用したデータセット)

DataSet Target 概要 Link
Ruddit Offensive Redditから抽出されたコメント github
wiki-attack attack 英語版Wikipediaの100k以上のコメント github
toxic-spans all toxic or not toxic SemEval2021で使われたデータセット github

さらに過去コンペで既に学習されたモデルがHuggingFaceにあげられていたのでそちらも活用しました。 unitary/toxic-bert

この時点で作成したモデルのCVの結果はこちらです。

BackBone Dataset CV
unitary/toxic-bert jigsaw-classification 0.693337
unitary/toxic-roberta jigsaw-unbiased 0.699714
unitary/toxic-xlmroberta jigsaw-multilingual 0.697921
unitary/toxic-albert jigsaw-classification 0.694334
unitary/toxic-albert jigsaw-unbiased 0.685897
unitary/toxic-bert Ruddit 0.647270
roberta-base jigsaw-unbiased 0.697124
deberta-base jigsaw-unbiased 0.698585
Luke-base wiki-attack 0.687126
TFIDF x Ridge wiki-attack 0.678956
TFIDF x Ridge jigsaw-classification 0.689053
TFIDF x Ridge Ruddit 0.632490

ここまでを単純平均したEnsembleでは CV: 0.707849 LB: 0.77870 でした。

LB上では0.8はおろか、0.9を超えるチームもあり外部データを軸にしたこの作戦では厳しいのかと思い始めていました。

ただこの結果がPrivateでは0.81181で一番高かったので、ここから作戦を変えたのが大きな敗因だと考えています。

コンペ終盤

中盤まで試していた結果から、validation_data.csvで less < moreが成り立たないものに着目しました。 BERT系のモデルからはLast LayerのAttentionも出力し、なぜ当たらないのかの考察をしたところ

  • Toxicと思われる単語にAttentionが強い
  • 当たっていない文章はToxicと思われる単語が入っていないことがあり、皮肉やアカウントBANされたことへの謝罪などが入っている

と目星をつけていきました。

※実際にアノテータのless < more多数決と予測値の傾向が一致しなかった例.

※生のデータを載せますので、不快に思われる可能性のあるテキストが含まれます

-------------------- less toxic --------------------

LOL; charles, you are a real fag aren't you? siding with chinks?? 
go fuck yourself, asswipe! we don't need no chinks in here. 
FAG
-------------------- more toxic --------------------
"
I'm not the one who added that source, neither had I actually read it before hand. On the subject of ""that you or any other Cradle fan made"" - that sounds fairly ridiculous, as you could just as well say that about any topic on Wikipedia. I'm not arguing this because I think there's a source that was added that proves it, it seems to be fairly obvious as the only difference was the back ground (at one point there was a picture of the original on Wikipedia, which was linked from this article, but it got deleted). It's like saying that the Sigil of Baphomet requires a source to say it was based off a pentagram. ≈  "


-------------------- less toxic --------------------
Wesley Bartz likes to suck cock. Loves that cock. He can't live without the cock
-------------------- more toxic --------------------
Yay! Here's a cookie... oh wait I ate them all. ^_^; Well, rain check on that cookie. )  

そこで、これは過去のデータだけを学んでいては当たらないのではと考え、validation_data.csvで学習するように作戦変更をしました。 モデルも中盤まで試していた中で、RoBERTa-BaseとDeBERTa-Baseが良さそうだったことも踏まえ

使用するモデルはBytePairTokenのTokenizerを使っているRoBERTaと、WordPieceTokenのDeBERTaを軸にアンサンブルする方向で考えモデルを作成するに至りました。

validation_data.csv の学習

validation_data.csvの学習をするにあたり、重要なのはCross Validationの方法です。

例えばWorker(アノテータ)でStratifiedKFoldをするとFold間で同じ文章の組み合わせが出現することになるので、

Fold間で同じ文章の組み合わせが出現しないようなCross Validationを考える必要があります。

幸いにも公開CodeでGrandMasterのtitoさんがFold間での同じ文章の組み合わせが出ないような戦略を共有してくれていたので、そちらを使用しました。Jigsaw CV strategy

あとは less < moreの関係性を学ばせるためにMarginRankingLossを使用し、moreとlessでmarginだけ離すように学習をしています。

モデルはBytePairTokenベースでRoBERTaに加えてGPT2も回し始めるに至ったのですが、GPT2は学習がうまく進まなかったので別Taskと合わせて学習させるようにマルチヘッドにしました。

この時、別Taskで解かせていたのはDetoxifyを使った予測値を学習させるようにしています。

また、過去のJigsawコンペ解法を参考に最終層のEmbeddingだけでなく最終から4層分のEmbeddingをConcatするなども同時に試しております。参考

最終から4層分のEmbeddingを入れるのは層ごとに異なるレベルの文章表現を学習していると言われているからであり、下層には表面的な特徴、中層には構文的な特徴、そして上層には意味的な特徴があると考えられています。

今回は特に単語などの表面的ではなく構文的な特徴なども加味したかったので上記方法を取るに至りました。

validation_data.csvを上記方法で学習するようになった結果、CV Scoreは大きく前進しこの方法でいけると信じ切っていましたので中盤まで使っていた別データセットのモデルはすべて使わないと判断しました.....

Model CV
RoBERTa-Base 0.72898
DeBERTa-Base 0.73502
GPT-2 0.74409
GPT-2(Concat Layer) 0.75203

今思うと、ここでのマルチヘッドでの学習が何かリークしていたのかCVが高く出過ぎていたなと思います。

他にチームメンバーが試していたこと

私が試したこととその経緯については上記で書いたとおりですが、チームメンバーが試したこともざっくり紹介します。

  • 過去コンペでのMLM(Masked-Language Modeling)による事前学習 → validation_data.csvによる学習
  • 過去コンペとRudditデータでそれぞれTF-IDF x Ridgeによる線形モデルでの学習

最終的なスコアは以下の通りです。

Model CV
RoBERTa-Base 0.72898
DeBERTa-Base 0.73502
GPT-2 0.74409
GPT-2(Concat Layer) 0.75203
RoBERTa-Base w/ MLM 0.70403
TFIDF x Ridge mean 0.69214
Ensemble 0.74223

結果

453thで惨敗です。中盤まで試していた外部データセットも混ぜた結果をEnsembleしておけば良かったと反省をしております。

所感

NLP系のモデルの学習や、MarginRankingLossなど新たな学びも多くありましたのでこれがまた自分の糧になっているとポジティブに考えることにします。

運要素が強いなど言われておりましたが、信じられるCVを作ることができるかやモデルが良くなっていると信じ抜くことが非常に重要だったと思います。

上位に入った皆様の考えや試したことなども今後まとめていきたいと思います。