【銀メダル獲得】SIGNATE医学論文の自動仕分けチャレンジの振り返り

はじめに 今回、SIGNATEの『医学論文の自動仕分けチャレンジ』に参加いたしました。こちらのコンペは、論文のタイトル・アブストラクトのテキストデータを用いて…

目次

はじめに

今回、SIGNATEの『医学論文の自動仕分けチャレンジ』に参加いたしました。こちらのコンペは、論文のタイトル・アブストラクトのテキストデータを用いて、システマティックレビューの対象となる文献か否か(2値)を判定するアルゴリズムを作成し、その精度を競うコンペでした。詳しいルールや評価方法などは、公式サイトをご確認ください。

コンペ終了に関する SIGNATEの公式Twitter 2021/10/05

こちらのコンペはリーダーボードスコアと最終スコアの乖離が大きく、順位のシャッフルが結構あるコンペでした。私自身は、リーダーボードスコアでは60位くらいでしたが、最終的に638人中40位で銀メダルを獲得することができました。大体上位6%程度ですかね。まずまずの結果を出せたのかと思います。

今回は、このコンペに参加する中で実践したこと、気づいたことを簡単に書き留めておこうと思います。

モデルの作成

今回はpytorchでニューラルネットワークモデルを構築しました。TensorFlow(keras)でも問題ないかと思うのですが、利用できる事前学習済みのBERT(Bidirectional Encoder Representations from Transformers)モデルの種類がpytorchの方が多いとの話でしたので、pytorchを利用しました。なお、コードの直感的な理解のしやすさで言うと、圧倒的にkerasがオススメです。レイヤーを積み重ねていく感じがとてもわかりやすいと思います。

なお、実際にモデルを作成するときは、こちらのフォーラムを大変参考にさせていただきました。その他、参考にさせていただいた記事を紹介しておきます。

Kaggle : CommonLit Readability Prizeコンペ
こちらはKaggleで開催された自然言語に関するコンペです。同じように文書の分類問題であり、pytorch・TensorFlowを利用してモデルを作成している方が多く、評価が高いものを中心にモデルを真似させていただきました。KaggleではSIGNATEと比べて多くの方がコードを公開してくれているのでとても参考になりますよね。

BERTのfine-tuningに関する記事
こちらの記事はBERTのfine-tuningに関する記事です。記事の後編が9月初め頃に公開されており、事前学習モデルの精度を向上させるための手法を掲載してくれています。こちらの手法を上から順に真似して利用させていただきました。

以上の記事を参考にしつつ、9月中はGoogle Colaboratoryでひたすらモデルを回し続けました。アーリーストップを何回に設定するかにもよりますが、場合によっては1モデルの学習に7時間以上かかることがあるため作業の合間にモデルを回す感じでした。Colab Proを利用していましたが、場合によってはColab Pro+に課金するのもありですね。

結果として、個別のモデルではリーダーボードのスコアで0.915台が限界でした。なお、最終結果を見るとアンダーサンプリングを実施したモデルなどで0.936台になっていました。ただ、リーダーボードスコアは0.90台でしたのでそのモデルを最終提出用に選ぶのは現実的ではありませんね。難しい。。

アンサンブル

パラメータや、モデルのレイヤーを変更したりして、ある程度モデルを作り終えた後に、アンサンブルを実施しました。実はアンサンブルの効果を甘く見ていたのですが、アンサンブルのおかげで安定して高精度の予測を出力することができました。考えてみるとモデルの数が増えれば増えるほどばらつきは小さくなるため、安定して真値に近い予測を出力できますね

ただ、1回モデルを学習させるにつきGoogleドライブが2GB程度圧迫される状況だったため、何も考えずに生成したモデルの大半を削除してしまっていました、、。とりあえず出力結果は全て保存しておくことが無難ですね。結果として20以上のモデルを生成していたのにも関わらず、最終的には5つのモデルのアンサンブルを提出して終了することとなりました。

また、アンサンブルを甘く見ていたため、アンサンブルに費やす時間を十分に確保していなかったことも失敗でした。今回は、5モデルの多数決で判定を行うこととしましたが、スタッキングなどの手法を試すための時間をとっておくべきでした。

反省点

今回のコンペでは、以下の点が甘かったなとつくづく感じています。

  • 探索的データ分析(EDA)・モデル学習・アンサンブルの時間配分・スケジュール管理
  • アンサンブルの過小評価

1つ目の時間配分・スケジュール管理について、初めてpytorchに触ったということもあり、そこまで時間配分を気にせずに取り組んでしまっていました。今振り返ると、時間配分はもちろんのこと、どのようなプロセスが必要かを念頭に置いて作業していれば、誤ってデータを削除するといったこともなかったなと悔やまれます。また、スケジュール管理はコンペに限った話ではなく、プロジェクトを進めるにあたってとても重要な要素ですので、以後気をつけていきたいと思います。

また、2つ目のアンサンブルを過小評価していた点は、自身の経験不足を痛感させられました。次のコンペから活かしていきたいですね。

おわりに

非常にざっくりですが、SIGNATEの論文チャレンジに関する振り返りをこれで終えようと思います。初めてpytorch・BERTを触ったため急ピッチで臨むこととなりましたが、予想以上の結果となり満足しております。ただ、コンペの進め方などを十分に煮詰められておらず、ベストなモデルを提出できなかったことが悔やまれます。。。

Kaggleにてテーブルデータのコンペがいくつか始まっていますので、今回の経験を活かしつつ上位入賞を目指していきたいと思います。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

WordPress.com でサイトを作成
始めてみよう
%d人のブロガーが「いいね」をつけました。