はじめに
2020年8月5日(水)〜2020年8月26日(水)に開催されたSIGNATE Student Cup 2020の予測部門に,8月10日くらいから参加してました. スコアが良かったBERTをfine-tuningしたモデルに関しては,Qiitaの記事(【PyTorch】BERTのfine-tuningを試してみた(SIGNATE Student Cup 2020))にまとめたので,こっちでは他にどういったことを試したかや,学んだこと,感想などを書いておこうと思います.
参加のきっかけ
夏休み前に,Transformer, BERTを「つくりながら学ぶ!PyTorchによる発展ディープラーニング」を参考に,一から勉強し直したこともあって,実際にBERTを使ってみたいなと思っていたタイミングで,英語のテキストデータの分類予測コンペを見つけたので参加することにしました.
SIGNATE Student Cup 2020の概要
SIGNATEでは,様々なデータ解析のコンペがこれまでも開催されてきたようです.
SIGNATE Student Cup 2020の概要
SIGNATE Student Cupは、データサイエンススキルを持った学生の発掘、および企業と学生の交流を支援するために、SIGNATEが定期的に開催している学生限定のコンペティションです。
本年は新型コロナウイルスにより社会全体が大きな影響を受け、対面での人的交流が困難な状況ですが、そのような状況下でも「次世代を担う」学生が将来のキャリア形成に自身のスキルを生かし、企業とも活発に情報交換していく場が必要だと考えています。
そこで本年は、コンペティションおよびアフターイベント(表彰式&入賞者プレゼン&協賛企業との交流)を完全オンラインで実施いたします※。
参加条件はずばり「学生であること」1点のみ。理系も文系も関係なく、平等にスキルを競い合えるコンペティションですので、興味がある学生の方はこの機会に是非チャレンジして下さい!!
タスク説明
英語圏の求人情報に含まれるテキストデータ(職務内容に関する記述)をもとに,その職務内容が
①データサイエンティスト(DS)
②機械学習エンジニア(ML Engineer)
③ソフトウェアエンジニア(Software Engineer)
④コンサルタント(Consultant)
のどの職種に該当するものかを判別する.
ざっくりポイントをまとめると
英語圏の求人情報であるため,テキストデータは英語.
テキストを用いた4値分類.
学習データは2931あるが,テキストが短いものが多いと感じた.
また,学習データのラベルが不均衡.(1: 624, 2: 348, 3: 1376, 4: 583)
評価はF1Score(Macro).
試した手法
参加のきっかけにも書いた通り,BERT使ってみたかったので,初日はBERTのモデルを実装しました. 詳しくは,Qiitaの記事(【PyTorch】BERTのfine-tuningを試してみた(SIGNATE Student Cup 2020))にまとめたのでそちらを参考にしてもらえたら幸いです.
工夫した点は,不均衡なデータだったので,学習データのラベルの出現頻度を使って,損失関数にweightを与えました.
後は特に工夫したりとかはしませんでしたが,それでもpublic score = 0.4617170, private score = 0.4617170と,ともに良好な結果でした.
提出時のpublic LBでは,14位でした.
昨日登録して、とりあえず1sub!
— たかいと (@takaito0423) 2020年8月11日
ここから頑張っていきたいけど、論文の査読結果が返ってきて、照会事項に追加実験が必要なものが多く期限も短いから、どこまでやれるか(´・ω・) pic.twitter.com/51l2gndVrE
その後試したのは,学習データの単語をランダムに置換しながらBERTをfine-tuningさせてみたり,BERTの出力をBiLSTMに入力してみたりを試してみましたが,public score,private scoreともに042~0.46くらいで大差なかったです.どのモデルも,trainデータのlossは順調に落ちていきますが,validationデータのlossは途中から下がらなくなるので,過学習には注意が必要だなと思いました.
英語→他言語→英語の再翻訳を用いたdata augmentationは,時間なくて試せなったです.
このあたり,入賞者プレゼンテーション聞くのが楽しみです. 2020年9月4日(金)13:00~15:00にアフターイベントで,学んだことは,後で記事に追記できたらと思っています. また,コンペ参加者以外も参加できるようです.
BERT以外に試した手法は,
文字列レベルのBiLSTM
tfidfを特徴量としたlightGBM
tfidfを主成分分析したものを特徴量としたlightGBM
tfidfをLatent Semantic Indexingしたものを特徴量としたSVC
どれもイマイチ良好な結果を得ることができませんでした. 後はこれらの手法の出力結果を単純にweight付けてマージしたり,lightGBMにBERTのhidden state vecとか混ぜ混ぜしたりと実装に時間がかからなそうなとこを毎日少し試してはいました.
単体のモデルではスコアの改善はできませんでしたが,なんだかんだ25日には,14位くらいに戻ってきてました.
なんとか14位まで戻ってきたけど、0.500までは遠い(´・ω・) pic.twitter.com/YyMdXbpnOS
— たかいと (@takaito0423) 2020年8月24日
今回のコンペでの失敗
16日ごろにフォーラムにあがっていた「スコアハックの方法」を見つけて,こうやってスコア伸ばすこともできるのかと,適当なtfidfを特徴量にしたモデルとかに適用してみたら,スコアがとても上がったので,みんなこうやってスコア伸ばしてるのかと思い,スコアハックをちょこちょこ使い始めました.
ただ,jobflagを全て同じflagにして提出し,未知のデータのflagの出現確率として利用するのは,コンペの趣旨的に大丈夫なのかなと思っていましたが,過去のコンペ解法勉強しているときに,public LB の情報を用いて優れたensembleの重みを近似計算する"Linear Quiz Blending"といった手法みたいなもの使ったものがあったことや,他のユーザや運営が特に何もコメントしてなかったので,特に質問することもなく最終日になりました.
最終日,これまでの傾向として,必ずではないもののスコアハックがpublic scoreの結果を良くしていたので,これまで作成したモデルの出力を混ぜて,hackしたものを最終サブに選んでいました. しかし,コンペが終わるに近づき,何もしてないのにpublic scoreの自分の順位が上がっていきました.(確認した感じ最終的に12位くらいまで上がってた) なんでだろうと思っていたら,フォーラムにあがっていた「スコアハックの方法」に,「この方法はpublic lbが存在しない未知データに対しては適用不可能なので、コンペのレギュレーションを満たしていないです」との投稿者からのコメントがあり,そういうことかと思いました. 何人かの方がスコアハックした提出以外を選び変えたことに気づき,自分も慌ててスコアハックしてない提出に選択し直しましたが,時間も数分しかなかったのとコメントあまり残してなかったこともあり,CVのスコアとか見直す時間なく,しょうもないスコアのものを選択してしまい最終順位102位でした(´;ω;`)
感想
今回のコンペで,学んだことは気になったことは質問するべきだなと思いました.
「聞くは一時の恥,聞かぬは一生の恥」
まだまだ,学生で学んでいる段階なので,臆せずにわからないこと,疑問に思ったことは質問していくべきだなと思いました.4月からは社会人になるので,そのときに生かしていければいいなと思っています.
ただ,正直な感想としては,できれば運営の方から,コメントとかあったら良かったのかなと思います.最終的には,スコアハックは「本コンペのルール違反にまでは当たらない」とのことで,使用は問題がない?ようです.
いつかそんなの関係なく,つよつよなスコア出せるようになりたいので,わからないことはしっかり質問しながら,他のコンペでも少しずつ学んでいけたらと思います.
最後に,言語情報研究室に所属しているせいで,NLP関係のコンペは何とか結果を残さないとまずいなとプレッシャーを感じてましたが,結果として全然勝てないので,割り切っていろいろな手法を学んで行こうと改めて思いました.NLP初めてって人に,負け続けて気負いがなくなりました.(優秀な人は何をやっても優秀)
いくつかのコンペに参加して,分野に関係なくコンペにおいて自分に足りてないスキルがわかってきたので,少しずつ勉強していけたらと思います.
とりあえず,入賞者プレゼンテーション楽しみです.
明日からは切り替えて,論文の回答書作成に集中します.
最後まで読んでいただきありがとうございました.