Kaggleの『G2Net』コンペティションで金メダル(8位/936チーム)を獲得しました!
はじめに
こんにちは、エムシーデジタルでデータサイエンティストをしている齋藤です。
今回、KaggleのG2Net Detecting Continuous Gravitational Wavesに弊社4人チームで参加し、8位/936チームで金メダルを獲得できました。 本コンペの結果により、エムシーデジタルでは Kaggle Master が4人、Expert が1人となりました。 Kaggleに投稿したSolutionはこちら
ここでは以下について簡単にご紹介したいと思います。
- コンペ概要
- 我々の取り組み
- 上位チームの解法
コンペ概要
コンペティションタイトルにある通り、continuous gravitational wave(連続重力波)を検出するコンペです。世界に何箇所か存在する重力波観測所で取得された波形をshort-time Fourier transformしたスペクトルが与えられ、その中に連続重力波が存在しているかどうかを判定します。ただし、現時点では連続重力波の観測には成功していないため、データセットに含まれる重力波は全て人工的に生成されたものとなっています。 評価指標はArea Under the ROCでした。また、本コンペはカーネルコンペ(推論コードを提出する形式)ではなく、推論した結果であるCSVを提出するタイプのコンペでした。
本コンペの特徴として、評価用データに対する学習用データの割合が非常に少ないコンペとなっていました。ホストが公開している信号生成ライブラリPyFstatをもとに参加者側でデータを生成することを期待していたようです。 学習用データ : 約600個 (うち信号あり:約400個) 評価用データ : 約8000個
我々の取り組み
コンペ序盤(開始一ヶ月程度)はKaggle上でベースラインが公開されていたこともあり、パワースペクトルを画像と見なしたCNN(Convolutional neural network)による分類問題として学習を進めていました。 しかし、以下の点からCNNではない解法の検討を始めました。
- LB(Leaderboard:順位表)上位に競技プログラミングあるいは最適化に強そうな方が複数チームいたことから、CNNとは全く事なるアプローチの存在を予想していた
- 連続重力波のCNNでの検出に挑戦している論文はいくつかあったが、いずれも古典的手法(=matched filter)と比べてそれほど優れた結果にはなっていなかった
- 学習用データが少ないことに加えてPyFstatでのデータ生成がうまく行っていなかったことからCNNベースの改善に限界を感じていた
- CNNでのCV-LB(学習用データでのスコアとLBのスコア)の相関が十分ではなかった(下図)
matched filter
ここで注目したのがmatched filterです。
- matched filterとは 重力波信号の特徴を司る主要なパラメータとしてf0, f1, alpha, deltaがあります。f0とf1は信号の周波数とその時間変化を表し、alphaとdeltaは信号の発信源である中性子星が天球のどこに位置しているかを表します。これらのパラメータを定めると、地球上で観測できる重力波信号をシミュレートすることで、実際に観測された信号とどの程度似ているかのスコアを計算できます。重力波が実際に観測されており、かつ、与えたパラメータが真のパラメータと十分に近ければ、このスコアが高くなるため、信号が入っていると解釈できます。
コンペでは波形生成ライブラリとして紹介されていたPyFstatですが、同ライブラリではmatched filterインターフェースが提供されていたことから、これを活用することにしました。 コンペで提供されているデータをPyFstatに対応した形式に変換した後、Optunaを使ってスコアを最大化するようにこれらのパラメータを探索しました。 学習用データで探索してみた結果、CNNを上回るvalidation scoreになっていました。
ここでの問題点は探索時間であり、我々のセットアップでは1つのサンプルの探索に10時間程度かかっていました。 評価用データの約8000サンプルを探索すると80000時間がかかることになり、探索に9年かかる計算でした。 今回はGCPで96vCPUのマシンを使うことと、適切に探索を打ち切ることによりおよそ二週間で探索を終えました。 弊社のKaggle支援制度(月10万円まで)により、GCP費用についての我々の個人負担はありませんでした。
CNN
我々の実験の範囲ではmatched filterはCNNの完全上位互換というわけではなく、CNNとアンサンブルすることでさらにLBの改善がありました。 主な工夫:
- matched filterによるpseudo-label 学習データでのprecisionが100%になるようなthresholdを決め、それ以上のmatched filterスコアを持つ評価用データを正例として学習に加えた
- 画像生成 学習データに含まれる2つの画像を合成することで新たなサンプルとした
上位チームの解法
上位の解法を見ると、信号処理ベースの解法とCNNベースの解法が混在していました。金メダルチームの中では半々程度の割合だったようです。
- 1st 観測される重力波は地球の自転や公転によって時間依存の変化をしていますが、その依存性を打ち消すことで重力波はスペクトログラム上に直線として現れることを利用しているようです。
- 2nd 波形パラメータ(f0, f1, alpha, delta)を探索してスコアが高ければ信号ありと判定するのはmatched filterと同様ですが、GPU実装をすることで、全サンプルを数日程度で探索できていたようです。
- 3rd 複数のCNNモデルをオンラインでの波形生成により学習させ、それらをアンサンブルしています。また、一部のサンプルで使い回されているノイズを発見することで、信号だけを取り出すことにも成功していたようです。
振り返り
Foursquareコンペに引き続き、社内でチームを組んで楽しく参加することができました。 CNNだけではなくmatched filterの検討をできたことは良い判断だったと思っている一方、CNNだけで上位に入っているチームもあったことから、もう少しCNNを突き詰めることはできたと思っています。また、我々はPyFstatのmatched filterをブラックボックス的にそのまま使っていましたが、信号処理と重力波に対する本質的な理解があればもっと効率と精度の良いアルゴリズムにできたかもしれません。
チームメンバーからのコメント
- (瀬川)MCDとして金メダルを獲得できて非常に嬉しいです。自分はCNNを担当してあまりスコアに寄与できなかったですが、MCDは最適化アルゴリズムに強いメンバーがたくさんいる環境なので色々教えてもらいながら引き続き技術力研鑽を続けて行きたいと思います。
- (Artem)MCDチームとしては半年以内の2回目の金で大変嬉しいです。会社支援もとても助かりました。引き続き頑張りたいと思います!
- (佐藤) 重力波検出は学生時代に触れたテーマだったこともあり、社内Slackでコンペを知り初めてKaggleに参加しました。残念ながらあまり作業時間が取れず、齋藤さんはじめチームの方々に頭が上がりません。今回でKaggleの心理的障壁が大きく下がったので、近い将来リベンジしたいです。
We are hiring!
エムシーデジタルではデータサイエンティストをはじめ様々な職種の方を募集しています。