🔉
Geophysical Waveform Inversion 上位解法MEMO
※ 個人用メモです。が間違っていたらご指摘ください🙏
コンペの概要
- 目的:物理モデルと機械学習を融合し、地震波から地下構造を高精度に再構成する Full Waveform Inversion(FWI)の新手法を開発する。
- 予測対象:地震波(seismic waveform)から地下の速度マップを予測
- 評価指標:全予測点における MAE(Mean Absolute Error)。誤差の絶対値の平均で評価される。
- Yale/UNC-CH - Geophysical Waveform Inversion
(割と)共通している手法
- 上位陣はほぼ全員が Vision Transformer(ViT) を使用
- 全てのチームがデータを生成して学習に使用
- vel-to-seisを用いてテストデータを直接最適化
- vel-to-seisを用いてpseudo-labelを生成し学習に使用
-
HFlip(水平反転)を使用してデータ拡張
- 中央のchは非対称なので、別途forward modelingを用いて再計算
各解法の特徴的な手法
1st Place Solution
- モデル関連
- 地震波データ
(5, 1000, 70)
を(1, 350, 350)
に reshape - Unet は不採用として、ViT を encoder+decoder 構成で繰り返す構造に変更
- logits に sigmoid を適用し、最終的に出力される値は1500〜4500にスケーリング
- HFlip, TTA, EMA を使用
- 地震波データ
- データ拡張関連
-
FiveCrop + 5x RandomAffine
により既存 velocity model から 4.7M サンプル生成(10x拡張) - 各エポック後に予測結果を forward modeling → 新たな入力データとして次エポックで再学習するサイクルを回す
- 高スコアに貢献した以下4種にデータを限定して再学習
"CurveFault_B", "CurveVel_B", "Style_A", "Style_B"
-
3rd Place Solution
- モデル関連
- Vision Transformer(ViT)ベースで構築。
- backboneは
eva02_base_patch16_clip_224
から始まり、最終的にeva02_large_patch14_clip_224
を3段階のステージで学習。 - 入力データ
(N, 5, 1000, 70)
を(N, 5, 250, 280)
にreshape後、補間して(N, 5, patch_size×18, patch_size×18)
に変換しViTへ入力。 - ViT出力は16次元 → PixelShuffle →
(N, 1, 72, 72)
→ Cropして(N, 1, 70, 70)
。出力はsigmoid() * 6000
で変換。 - optimizer変更でMAEが 9.x → 7.x に劇的改善
- Linear層のみAdamW →
MuonWithAuxAdam
に変更 - それ以外はAdamWを適用。
- Linear層のみAdamW →
- Forward modeling を @manatoyo氏の実装(Gemini協力)をベースに改良し、学習用データを生成
4th Place Solution
-
データ生成
- 合計で 1,000万以上のサンプルを作成
- モデル構造
- ViT + 2D Conv ブロックを28層交互に重ねた構成。
- 入力
(5, 288, 70)
→ パッチ化(18×18×384)
→ モデル → 出力(70×70×1)
に変換。 - 損失関数は MAE + confidence loss。
- confidence loss =
MAE(confidence, MAE(targets, preds))
- confidence loss =
-
アンサンブル戦略:
- 最初は Flip Aug + TTA を使ったモデル
- Flip Augmentation ではなく完全に反転したデータを使った別モデル
- 中央のseisのみ再計算
- 最終週に Style B に弱いことに気づき、Styleに特化したモデルを作成
- 3つのモデルをファミリ別に重み付けしてアンサンブル
5th Place Solution
- データ生成
- forwardモデルでseis を生成
- 独自再実装により複雑な拡張が可能に(CutMix, MixUp, 縦横ストレッチ, 歪み, 人工Faultなど)
- Style A/B は Perlin ノイズ+ガウス平滑+勾配で再現。大量生成可能
- モデル構造・学習
- 構造:ConvFormer / CaFormer + Unet(public or modified)
- 入力の解像度が高いほど精度向上(144が最もパフォーマンスが良かった)
- まず小さい解像度(例:72×72)でモデルを学習し、解像度を大きくしたモデル(例:144×144)を再学習(fine-tuning)
- アンサンブル
- hill-climb ensembling を使用:局所的な改善を繰り返して最適化し有意な改善がなくなるまで繰り返す
- PyTorch で differentiable な vel-to-seis 実装を構築し、最終的な予測(vel_pred)が、現実の地震波(seis_true)を正しく再現できるよう微調整
- Classifier モデルの活用
- 予測をファミリごとに分類する Classifier を学習
- Style系 / Discrete系の判別 → ファミリ別の最適後処理を適用
- アンサンブルの重み決定にも使用(family-wise hill-climb ensemble)
6th Place Solution
- データ生成(Synthetic Training Data)
- 合計 約1,000万サンプルの合成データを生成。
- 入力は
(5, 500, 70)
にダウンサンプリングし、np.float16
で保存してストレージ最適化。 - 合成データの内訳:
- 40%:ガウスノイズ・ランダム回転・スケーリング・シフト
- 40%:Mixup 拡張
- 20%:DDIM(Denoising Diffusion Implicit Models) による生成
- model
-
ConvNeXtV2-Base
(convnextv2_base.fcmae_ft_in22k_in1k_384
) -
CaFormer-B36
(caformer_b36.sail_in22k_ft_in1k_384
)
-
- 学習
- Stage 1: 合成データ上で 60エポック学習
- Stage 2:テストデータをベースにした合成データでさらに2エポック学習
- テストデータに対してモデル出力(予測)→ forward modeling(y→x)を適用
- HFlip による拡張
9th Place Solution
-
使用モデル:
caformer_b36.sail_in22k_ft_in1k
-
convnextv2_huge.fcmae
(サイズ拡大版)
-
学習
- 学習率
0.0005
を固定し、中断した学習を継続できる設計。 - MAEの収束が遅いため、既存学習の再利用を重視。
- 学習率
-
データ生成
- データ拡張とそれに伴う再計算。
- 拡張後の
vel
に対して seisデータを生成する。- Custom CUDA Kernel を自作しデータ生成を超高速化(CPU版の約100倍速)
-
推論戦略
- コンペ締切2日前、保存済み checkpoint に 150エポック追加学習(Cosine LR)
- 難しいクラスにサンプル重みを加えて重点学習
- 3エポックごとに予測を保存 → 最後の10回分を中央値で集約
10th Place Solution
-
model
- ベース:Berthly氏の ConvNeXt + UNet 構造
- ConvNeXt Small → ConvNeXt Large にバックボーンを変更
-
学習(1st Stage)
- OpenFWI データセットを使用して学習
- テストデータに forward model(FWM)を適用して pseudo-label(速度マップ)を作成
- 作成した pseudo-label を次段階の学習に追加
-
学習(2nd Stage)
- pseudo-label を元の訓練データに追加し、fine-tune。
- 3回のサイクルで学習を繰り返し、モデルを改善。
-
Iterative Optimization(逐次最適化)
-
backprop可能な forward modeling 実装を使って、各テストサンプルごとに個別に最適化
- モデルの予測(velocity)→ FWM → seismic 再構成
- seismic の再構成誤差(loss)を最小化するようにモデルを backprop で更新
-
backprop可能な forward modeling 実装を使って、各テストサンプルごとに個別に最適化
12th Place Solution
- データ生成
- Stable Diffusion による vel-to-seis 生成モデルを学習
- vel-to-seis のforward関数を高速化再実装(5090で毎秒120サンプル生成可能)
- この関数により、オンラインでデータ拡張しながら訓練が可能に
- 学習データとテストデータを混合
- テストデータの velocity ラベルは上記関数で生成
- 学習
- 学習済みモデルをベースに、テストデータのみでミニバッチ fine-tuning
- 検証は seis 再構成誤差で直接評価
- 最後に、StyleA/B ファミリに対してモデルを使わずに velocity を直接最適化
- モデルの出力を初期値にして、gradient-enabled FWM関数で勾配最適化
- 学習済みモデルをベースに、テストデータのみでミニバッチ fine-tuning
関連書籍
- Kaggleで勝つデータ分析の技術
- Kaggleに挑む深層学習プログラミングの極意 (KS情報科学専門書)
- 実践Data Scienceシリーズ PythonではじめるKaggleスタートブック (KS情報科学専門書)
以上
Discussion