Kaggleの ROGII - Wellbore Geology Prediction が終了しました。
石油・ガス開発における水平井の地質位置を予測するコンペで、最終的には 6,125チーム、161,975件の提出 がありました。
コンペ終了後には、上位入賞者の方々がSolution Writeupを公開してくださっています。
1位から10位までを読んでみると、U-Net、Particle Filter、HMM、独自のAnchorCNN、合成データ、LightGBMによる候補選択など、かなり異なる方法が使われていました。
この記事では、公開してくださったWriteupを中心に、
「それぞれのチームが、どのような方法でROGIIを解いたのか」
を1位から順番に整理してみます。
上位解法を惜しみなく公開してくださった参加者の皆さまに感謝します。
私自身が参加中に試したことは、地層を追いかけるKaggleコンペに参加: ROGII Wellbore Geology Predictionにまとめています。
そもそもROGIIは何を予測するコンペだったのか
まず、このコンペ自体を簡単に振り返ります。
地下の油層・ガス層を掘削するとき、井戸は必ずしも真下へ伸びるわけではありません。
地下まで降りたあと、目的とする地層に沿って横方向へ長く掘り進む水平井があります。
ROGIIでは、その水平井が地層に対してどこを通っているかを表す TVT を予測します。主催者は、この予測を通して水平井掘削の自動化・改善につなげることをコンペの目的として説明しています。
水平井側には、
MD、X、Y、Z、GR、途中まで正解が分かっている TVT_input
などがあります。
さらに、それぞれの水平井には比較対象となる typewell があり、こちらには地層方向の TVT と GR があります。
そのため一つの手掛かりになるのが、
水平井のGR波形
↓
typewellのGR波形と比較
↓
どの位置に対応しているかを推定
↓
TVTを求める
という考え方です。
ただし、ここで話は簡単には終わりません。
GRにはノイズや欠損があり、水平井とtypewellで波形が完全には一致しません。
さらに、似たGRパターンが別の位置にも現れます。
そのため、
この辺かもしれない
候補A ──────
候補B ──────
候補C ──────
と複数の対応が考えられます。
終了後に公開された解法を読むと、この曖昧な対応関係をどう表現し、どう追跡し、どう最終予測へ落とし込むかについて、さまざまな方法が試されていました。
1位から10位まで
最終Leaderboard上位は次の通りでした。公式Leaderboardは6,125チームの最終順位を公開しており、1位Ruby氏が5.639、2位Bilzard氏が5.802、3位tereka & Takoiが5.836と続いています。
| 順位 | チーム | Private Score | 公開Writeupの主な構成 |
|---|---|---|---|
| 1 | Ruby | 5.639 | 2D U-Net、Particle Filter、XY近傍情報 |
| 2 | Bilzard | 5.802 | AnchorCNN |
| 3 | tereka & Takoi | 5.836 | HMM、PF、複数NN、SoftMax Gating |
| 4 | L & J & A & A | 5.870 | 複数visionモデル、1Dモデル、大規模合成データ |
| 5 | daimaru | 5.94前後 | Synthetic-Data-Centric CNN |
| 6 | k256.dev | 5.984 | 91本のParticle Filter、row-level bagging |
| 7 | roglike | 6.057 | HMM、U-Net、refiner |
| 8 | 富士山 | 6.18前後 | PF ranker、Synthetic-Pretrained U-Net |
| 9 | tremors | 6.251 | whole-well U-Net、HMM、beam search |
| 10 | Can | 6.269 | 物理候補、2Dモデル、selector、TCN |
スコア・順位は最終Leaderboardに基づきます。解法構成は各Solution Writeupおよび公開解法を横断して整理した記事を照合しています。
ここから一つずつ見ていきます。
1位 Ruby:GRの対応関係を2次元で扱う
公開Writeup: 1st Place Solution
1位のRuby氏の中心モデルは、ConvNeXtをbackboneとした2D U-Netです。
さらにParticle Filterの出力や、XY座標から得られる近隣井戸の情報など、多種類の情報を別チャネルとしてU-Netへ渡しています。ConvNeXtについてもLayerNormをBatchNormへ置き換えるなど、細かな検証が行われています。
まず興味深いのが、問題の表現方法です。
水平井の位置を横軸、typewell側の位置を縦軸として、
水平井のMD →
typewell
TVT
↓
░ ░ ▒ ▓ █ ▒ ░
░ ▒ ▓ █ ▒ ░ ░
▒ ▓ █ ▒ ░ ░ ░
▓ █ ▒ ░ ░ ▒ ▓
のような2次元の対応関係を作れます。
それぞれのセルは、
「この水平井の地点と、このtypewellの地点はどれくらい対応しそうか」
を表します。
正しいTVTの系列は、この2次元空間の中を通る一本の線として表現できます。
一点ずつTVTを回帰するのではなく、周囲も含めた対応パターンを画像として扱います。
1位解法ではここにGRだけではなく、
この井戸の近くでは
地層はどちらへ傾いているか
という空間的な情報も補助材料として利用しています。
2D U-Net単体というより、
GRの対応、逐次追跡、空間情報を2次元モデルへ集める
構成になっています。
2位 Bilzard:AnchorCNNという独自の経路モデル
公開Writeup: 2nd Place Solution: AnchorCNN — Conditional Probabilistic Path Modeling
2位のBilzard氏は AnchorCNN という独自のモデルを構築しています。
これは今回の上位解法の中でも、問題の定式化そのものが特徴的です。
通常の回帰なら、
このMDのTVT = 121.4
と予測します。
AnchorCNNでは、現在位置となるanchorを与えたうえで、そこからのmove distributionを予測します。
概念的には、
現在位置 = 120
次の位置
117 低い
118 少し高い
119 高い
120 とても高い
121 高い
122 少し高い
のような分布です。
Writeupでは、anchorの位置に条件付けて移動分布を読み出すモデルとして説明され、学習時には正解経路上のanchorを使うteacher forcingが採用されています。
これは「TVTを一点として予測する」こととは少し違います。
GRだけから候補を一つ決めにくいのであれば、
現在位置がここなら、この先はどこへ動きそうか
という条件付き分布として表現することもできます。
またWriteupでは、RMSEに強く影響する一部の大外れした井戸、いわゆるcatastrophic wellsも意識したモデル評価が行われています。
単に新しいCNNアーキテクチャを使ったというより、今回の問題に合わせて予測の出し方そのものを設計しているところが興味深い解法です。
3位 tereka & Takoi:物理モデルとニューラルネットを別々に作ってから混ぜる
公開Writeup: 3rd Place Solution
3位のtereka氏・Takoi氏は、まずGRと井戸形状から物理的にあり得るTVT trajectoryを複数生成するところから始めています。
そのために使われているのが、
HMM(Hidden Markov Model)とParticle Filter
です。
さらに、それとは別に3種類のニューラルネットを学習し、最後にSoftMax Gatingで統合しています。
全体像は、
┌─ HMM
│
GR・坑井形状 ──────┼─ Particle Filter
│
├─ Neural Network A
├─ Neural Network B
└─ Neural Network C
↓
SoftMax Gating
↓
TVT
という構成です。
ここでHMMやParticle Filterが扱っているのは、TVTを一行ずつ独立に求める問題ではありません。
現在位置から次の位置へ移る際、
前の位置と大きく矛盾していないか
GRはtypewellと合っているか
井戸の形状として不自然ではないか
を見ながらtrajectoryを作ります。
その一方で、ニューラルネットは別の方法で予測します。
それぞれを最初から一つにまとめるのではなく、独立した予測として持ったあと、どの予測をどれだけ使うかをSoftMax Gateで学習する構成になっています。
公開Writeupの冒頭にある「複数のphysically plausible TVT trajectoriesを作る」という説明が、この解法をとても分かりやすく表していると思います。
4位 L & J & A & A:複数pipelineと50万本規模の合成データ
公開Writeup: 4th Place Solution
4位はL & J & A & Aチームです。
こちらは単一のU-Netだけではなく、複数のpipelineから成るteam solutionです。
公開解法を横断して確認した記事では、
- U-Net系
- ConvNeXt V2 Large + Feature Pyramid
- 1D Squeezeformer
などが含まれていることが整理されています。
そして特に目を引くのが合成データの規模です。
約50万本規模のsynthetic dataで事前学習し、その後もフィルタしたsynthetic dataを利用しています。
今回の実データは有限です。
一方で、
地層の傾き
GR波形
井戸の軌跡
GRのずれ
などを変化させた人工的な学習例を作れば、実データだけでは十分に現れないパターンもモデルに経験させられます。
4位解法では、それをかなり大きな規模で行っています。
また、2次元vision modelだけでなく1Dモデルまで含む複数pipelineになっているため、「U-Net解法」と一言で括ってしまうと大事な部分を落としてしまいそうです。
異なる表現方法を持つモデルを組み合わせている点も含めて読む必要のある解法でした。
5位 daimaru:Synthetic-Data-Centric CNN
公開Writeup: 5th Place Solution
5位のdaimaru氏は、Writeupの副題をそのまま借りると Synthetic-Data-Centric CNN です。
名前の通り、synthetic dataが解法の中心にあります。
合成データで25 epoch事前学習したあと、実データでfine-tuningします。
実データ側は8 epoch学習していますが、Writeupによればbest epochはほぼepoch 2だったそうです。
これは興味深い結果です。
単純に、
合成データ
↓
初期値を少し良くする
↓
あとは実データで長く学習
という使い方ではありません。
むしろ、
Synthetic Data
↓
対応関係を十分に学習
↓
Real Data
↓
短時間で実データへ適応
という構成になっています。
公開された横断整理では、MaxViT、EfficientNetV2、HRNet-W18などをbackbone候補とするU-Net型モデル、SDFとrow classificationの2 head、14 channelの入力なども報告されています。
「どのbackboneを選ぶか」だけでなく、モデルが学習する世界そのものを先に作るというアプローチが印象に残る解法でした。
6位 k256.dev:Particle Filterを91本使う
公開Writeup: 6th Place - PF, PF, PF, PF, Physics and Row-Level Bagging
6位のk256.dev氏は、上位の中でもかなり独特なアプローチです。
タイトルがそのまま、
PF, PF, PF, PF, Physics and Row-Level Bagging
となっています。
最終的には91本のParticle Filter候補を作り、それをニューラルネットで行ごとに統合しています。本人はこれを「row-level bagging」と表現しています。
イメージすると、
PF 01 ──────────
PF 02 ────────
PF 03 ───────────
PF 04 ─────
...
PF 91 ─────────
↓
Neural Network
↓
最終TVT
となります。
Particle FilterはパラメータやGRの表現方法を変えれば、異なるtrajectoryを作ります。
一つの設定を選び抜く代わりに、多様なPFの出力を残したまま次のモデルへ渡す方法です。
91という数字だけ見ると力技にも見えますが、本人の日本語での振り返りを読むと、モデルそのものの複雑化よりデータ分析を重視していたことも書かれています。
他の上位解法とはかなり異なる経路で6位へ到達していて、同じ問題にも別の攻め方があることがよく分かるWriteupです。
7位 roglike:一度予測してからU-Netでもう一度直す
公開Writeup: [7th Place Solution] HMM + UNet (agent is all you need)
7位のroglikeチームではHMMとU-Netを組み合わせています。
さらに特徴的なのが refiner です。
最初のモデルが出した予測を、そのまま最終回答にはしません。
入力
↓
First-pass prediction
↓
予測結果を追加情報として入力
↓
Refiner U-Net
↓
修正後のTVT
というもう一段のモデルを持っています。
そしてrefinerを学習するために、約6,000本のsynthetic wellsを作り、first-passが誤った状態を人工的に用意しています。
ここでsynthetic dataの使い方が4位や5位とは少し違います。
4位・5位では、モデルにさまざまな井戸や対応関係を学ばせるためのsynthetic dataが中心でした。
7位では、
「既にある程度予測されたものが、どのように間違えるか」
まで作っています。
つまり、
正しいtrajectory
↓
わざと誤ったfirst-passを作る
↓
どう直せばよいか学習する
という学習です。
さらにrefiner同士の不一致をconfidenceとして利用する設計も報告されています。
モデルに最初から完璧な答えを要求せず、一度出した答えを修正する工程を明示的に分けるのが面白いところです。
8位 富士山:PFを選ぶモデルとU-Netを並行して作る
公開Writeup: 8th place - PF ranker + Synthetic-Pretrained U-Net
8位の富士山チームも一つのモデルだけではありません。
大きく二つの系統があります。
一つは約20種類のParticle Filter + supervised rankerです。
Writeupでは、20種類のPFと、位置・地質などの特徴量を使ったrankerを構築したと説明されています。
PF 1 ─┐
PF 2 ─┤
PF 3 ─┤
... ├→ Ranker
PF 20 ┘
つまり、
「どのPFを作るか」
だけではなく、
作ったPF候補をどう評価するか
まで学習対象になっています。
もう一つの系統が Synthetic-Pretrained U-Net です。
こちらはResNet34 U-Net、9 input channelsで、synthetic dataを使った事前学習を行っています。
したがって同じチームの中に、
Particle Filterで複数候補を作って選ぶ
方法と、
GR対応を2次元モデルとして学習する
方法が共存しています。
最終的に性質の違う二つの系統を持てたことも、この解法を読むうえで興味深いところです。
9位 tremors:whole-well U-Net、HMM、beam search
公開Writeup: 9th Place Solution
9位のtremorsチームでも複数の方法が使われています。
公開解法の整理では、
- whole-well U-Net
- HMM
- beam search
- NNLSによる統合
という構成が報告されています。
U-Net側も井戸全体を扱う形で、ResNet34 U-Net、relief coordinate、10-view TTA、entropyを使った重み付けなどが行われています。HMMとは位置に応じたblendが行われています。
ここで出てくるbeam searchも、今回の問題に合った考え方です。
例えば各地点で、
┌─ trajectory A
現在位置 ─┼─ trajectory B
└─ trajectory C
と複数の経路を残します。
先へ進むにつれて評価の低い経路を落とし、有望な経路を残していきます。
Particle FilterやHMMとはアルゴリズムが違いますが、一地点のGR一致だけではなくtrajectoryとしての整合性を見る点では共通する部分があります。
9位解法では、それらをwhole-well U-Netとも組み合わせています。
10位 Can:候補を作る処理と選ぶ処理を段階的につなぐ
公開Writeup: 10th Place Solution: A Compass, Not a Map
10位のCan氏のWriteupタイトルは A Compass, Not a Map です。
Publicでは21位、Privateで10位となっています。
この解法もかなり段階的です。
公開情報では、
- physics-based candidate
- 2D U-Net系モデル
- per-well LightGBM selector
- TCNによるrow correction
などが使われています。
特にselectorでは、一つの候補をただ平均するのではなく、各candidate curveについて複数の特徴を作り、LightGBMで評価します。
その後にもTCNによる補正があり、Writeupでは各段階を追加したときのCV改善まで記録されています。
候補trajectoryを作る
↓
2Dモデルでも候補を作る
↓
LightGBMで候補を評価
↓
trajectoryを決める
↓
TCNで行単位の補正
と、役割の異なる処理を順番につないでいる解法です。
ここまで読んで、何が共通していたのか
1位から10位まで見ると、決して一つの「正解アーキテクチャ」があったわけではありません。
2位のAnchorCNNと6位の91 PFなどは、かなり違うアプローチです。
それでも公開された解法を横に並べると、何度か繰り返し登場する考え方があります。
1. GRの一点ではなく「対応関係」を見る
まず目立つのが2D U-Netです。
終了後に20位以内の公開Writeupを調査した記事では、確認できた解法のうち、少なくとも1・4・5・7・8・9・10・11・14・18・20位でU-NetまたはU-Net型の2D encoder-decoderが使われていました。
これは、
GR = 67だからTVTはいくつ
ではなく、
Horizontal GRとTypewell GRの
どの部分同士が対応しているか
を見る方法です。
2次元化すると、一点だけでなく周辺の波形もCNNから見ることができます。
そのため今回の問題に対する一つの自然な表現方法になっていたようです。
ただし、同じU-Netでも中身はかなり違います。
1位はPFやXY近傍など多くの入力チャネルを持ち、4位・5位は大規模なsynthetic dataを使い、7位はrefinerとしてもU-Netを利用し、10位は候補選択pipelineの一部として使っています。
「U-Netが強かった」で終わらせるより、そのU-Netへ何を入力し、何を予測させ、どの段階で使ったのかを見る方が面白そうです。
2. Particle FilterやHMMもかなり残っている
一方で、CNNだけに置き換わったわけでもありません。
1位ではParticle Filter、3位ではHMMとPF、6位では91本のPF、7位ではHMM、8位では約20種類のPF、9位ではHMMとbeam searchが使われています。
これらの方法は、GRの一致度だけでなく、
前の位置
↓
現在位置
↓
次の位置
という連続性を扱えます。
水平井に沿ったTVTは系列なので、一点だけ見ればGRが似ていても、
そこへ移動するにはTVTが突然大きく飛ぶ
なら別の候補を考える余地があります。
ニューラルネットが強かったコンペでありながら、こうした逐次推定・探索手法も上位解法の中で何度も登場しているのは興味深いところです。
3. 「複数候補を作る」と「候補を選ぶ」が分かれている
特に面白かったのがここです。
例えば6位では91本のPF。
8位では約20種類のPF。
3位ではHMM・PF・複数NN。
10位ではphysics candidateと2Dモデル。
いずれも、
一つのモデル
↓
一つの答え
だけではなく、
候補A
候補B
候補C
候補D
↓
評価・統合
↓
最終予測
という構造を持っています。
候補生成と候補選択が別の問題になり得ることについて、192位の解法を公開したFusicの記事にも興味深い実験があります。
1坑あたり4,444本のcandidate trajectoryを作ったところ、候補集合の中から正解に最も近いものを選べると仮定したoracle RMSEは3.18でした。
つまり、候補集合の中にはかなり良いtrajectoryが存在していました。
しかし実際のenergyで候補を順位付けすると、大きく外した井戸では正解に近い候補が1,000位以下まで落ちるケースがありました。
これは、
よい候補を作れることと、よい候補を見分けられることは同じではない
という例として非常に分かりやすいと思います。
8位のrankerや10位のselector、3位のSoftMax Gateが別工程として存在する理由も理解しやすくなります。
4. 合成データの使い方がかなり多様だった
もう一つ、上位解法を読んでいると何度も出てくるのがsynthetic dataです。
ただし、全部同じ目的で使われているわけではありません。
4位では約50万本規模のデータで事前学習。
5位ではsynthetic dataでCNNを十分に事前学習したあと、real dataで短くfine-tune。
7位では約6,000本の間違ったfirst-passを作り、refinerを学習。
8位ではsynthetic-pretrained U-Netを別のPF ranker系統と組み合わせています。
同じ「合成データ」でも、
地質パターンを増やす
場合もあれば、
GRの対応パターンを増やす
場合もあり、
モデルが失敗した状態を人工的に作る
場合もあります。
この違いはかなり重要だと思いました。
「データが少ないからaugmentationする」という一言では収まらず、どんな経験をモデルにさせたいのかを考えてsynthetic dataを設計していることが、公開解法から見えてきます。
5. 似たモデルを平均するだけではないアンサンブル
一般的なKaggleのアンサンブルでは、
LightGBM
XGBoost
CatBoost
Neural Network
↓
平均
のような構成もよくあります。
ROGIIの上位解法では、それとは少し違う組み合わせも多く見られました。
例えば3位は、
HMM
PF
NN
↓
SoftMax Gate
6位は、
91種類のPF
↓
NN
8位は、
PF + Ranker
+
Synthetic U-Net
10位は、
Physics candidates
+
2D Model
↓
LightGBM selector
↓
TCN
です。
同じ種類のモデルのseed違いだけではなく、かなり異なる方法で作ったTVT trajectoryを組み合わせる例が複数あります。
このコンペでは、GRから正しい対応を一意に決めにくいケースがあるため、異なる方法で候補を持つことにも意味があったのだろうと読み取れます。
これはあくまで公開解法を横断して見た私の整理ですが、それぞれのWriteupを読んだあとに並べると理解しやすい部分でした。
6. モデルだけでなく検証も難しかった
ROGIIはLeaderboardの変動も大きいコンペでした。
最終Leaderboardを見ると、1位Ruby氏はPublicから30ランク、2位Bilzard氏は41ランク、3位tereka & Takoiは39ランク上昇しています。反対にPublicから大きく順位を落とした上位チームもあります。
10位のCan氏もWriteupのタイトル部分で 21st public to 10th private と記載しています。
2位のWriteupではcatastrophic wellsを意識した評価が行われていますし、他の公開WriteupでもGroup CVや空間的な検証、Public LBとの差について多く議論されています。
RMSEでは、大きく外した一部の井戸の二乗誤差が強く効きます。
そのため、
平均して少し良くなった
だけではなく、
特定の井戸だけ極端に悪化していないか
を見ることも重要だったようです。
アルゴリズムだけでなく、どの改善を採用してよいと判断するかも難しいコンペだったことがWriteupから伝わってきます。
上位解法を役割ごとに並べ直してみる
最後に、1位から10位の手法をアルゴリズム名ではなく役割で整理してみます。
| 役割 | 公開解法で使われていたもの |
|---|---|
| GRの対応関係を表現する | 2D U-Net、CNN、AnchorCNN |
| 連続したTVTを追う | Particle Filter、HMM、beam search |
| 候補を増やす | 複数PF、複数NN、physics candidate |
| 候補を評価する | ranker、LightGBM selector、SoftMax Gate |
| 一度出した予測を直す | U-Net refiner、TCN |
| 学習例を増やす | synthetic wells、synthetic trajectories、synthetic errors |
| 空間情報を追加する | XY neighbor features |
| 異なる予測をまとめる | gating、bagging、blend、NNLS |
この表を見ると、
U-NetとParticle Filterのどちらが優れていたか
という見方だけでは、このコンペの上位解法を十分には説明できません。
例えば1位では両方が使われています。
3位ではHMM・PFとNN。
8位ではPF rankerとU-Net。
それぞれ異なる役割を担当させています。
おわりに
ROGIIの上位Solution Writeupを1位から順番に読んでみると、同じデータに対してかなり多くの表現方法があったことが分かりました。
Ruby氏はGRの対応を2次元へ展開し、Particle FilterやXY近傍情報までU-Netへ取り込みました。
Bilzard氏はAnchorCNNという独自の確率的経路モデルを作りました。
tereka氏・Takoi氏は物理モデルと複数NNを独立に作り、SoftMax Gateで統合しました。
4位・5位では大規模なsynthetic dataが重要な役割を持っています。
k256.dev氏は91本ものParticle Filterを作り、row-level baggingしました。
roglikeチームは一度出した予測をrefinerでもう一度修正しています。
富士山チームはPF候補をrankerで評価する系統とsynthetic-pretrained U-Netを並行して作りました。
tremorsチームはwhole-well U-Net、HMM、beam searchを組み合わせています。
Can氏は候補生成、selector、row correctionを段階的につないでいます。
終了後にこうして並べられるのは、参加者の方々が試行錯誤や実装をWriteupとして公開してくださったからです。
結果だけを見ると、
1位 5.639
2位 5.802
3位 5.836
...
という数字しか残りません。
しかしWriteupを読むと、その数字の後ろに、
問題をどう表現するか
どんな候補を作るか
どんなデータを学習させるか
どう候補を比較するか
どう失敗を検出するか
という、それぞれ異なる考え方があります。
個人的には、ROGIIの上位解法を読む面白さは「優勝モデルのアーキテクチャを知る」ことだけではなく、同じ曖昧な地下の観測データに対して、これだけ違う解き方が成立していたことを知れるところにあるように思いました。
コンペ中には見えていなかった方法も多く、公開してくださったWriteupは今後も読み返したい資料になりそうです。
参考にしたもの
- 1位 Ruby: 1st Place Solution
- 2位 Bilzard: 2nd Place Solution: AnchorCNN — Conditional Probabilistic Path Modeling
- 3位 tereka & Takoi: 3rd Place Solution
- 4位 L & J & A & A: 4th Place Solution
- 5位 daimaru: 5th Place Solution
- 6位 k256.dev: 6th Place - PF, PF, PF, PF, Physics and Row-Level Bagging
- 7位 roglike: [7th Place Solution] HMM + UNet (agent is all you need)
- 8位 富士山: 8th place - PF ranker + Synthetic-Pretrained U-Net
- 9位 tremors: 9th Place Solution
- 10位 Can: 10th Place Solution: A Compass, Not a Map
上位解法を横断して確認する際には、以下の記事も参考にしました。