0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 5 微分可能タンクモデルをPyTorchで実装する

0
Last updated at Posted at 2026-09-06

LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 5 微分可能タンクモデルをPyTorchで実装する

はじめに

前回のStep 4では、物理モデル出力をXGBoostやLSTMで後処理する構成を作成しました。

今回はさらに発展させて、タンクモデル自体をPyTorchで微分可能に実装します。

作成するプロトタイプ名は以下です。

RainfallRunoffDifferentiableTank_r001

参考のために、ZIPファイルを置いておきますので、ダウンロードして活用してください。

今回の位置づけは以下です。

第5段階:
  将来的に微分可能水文モデルや物理制約付きLSTMへ発展させる

内容:
  PyTorchで微分可能な降雨流出タンクモデル

微分可能水文モデルとは

微分可能水文モデルとは、タンクモデルやHBVのような物理・概念モデルを、PyTorchなどの自動微分フレームワーク上で実装し、観測流量との誤差を使ってモデルパラメータを学習できるようにしたモデルです。

ChatGPT Image 2026年7月6日 09_08_20.png

通常のタンクモデルでは、流出係数や浸透係数を手動で調整します。

一方、微分可能タンクモデルでは、以下のような係数をPyTorchの学習可能パラメータとして扱います。

k_quick
k_perc
k_slow
evap_factor
upper_storage
lower_storage

今回のモデル構成

今回も、簡易2段タンクモデルを使います。

ChatGPT Image 2026年7月5日 17_26_22.png

最終流量は以下です。

Q_total = Q_quick + Q_slow

通常のタンクモデルとの違い

項目 通常のタンクモデル 微分可能タンクモデル
パラメータ調整 手動キャリブレーション 勾配降下法で学習
実装 Python / Fortranなど PyTorch
物理構造 残る 残る
自動微分 なし あり
深層学習との接続 難しい 接続しやすい

学習対象パラメータ

今回学習するパラメータは以下です。

パラメータ 内容
k_quick 上段タンクからの速い流出係数
k_perc 上段タンクから下段タンクへの浸透係数
k_slow 下段タンクからの遅い流出係数
evap_factor 可能蒸発散量をどの程度反映するか
upper_storage 上段タンクの初期貯留量
lower_storage 下段タンクの初期貯留量

物理制約の入れ方

今回のプロトタイプでは、パラメータを直接自由に学習させず、範囲を設定します。

bounds:
  k_quick: [0.01, 0.90]
  k_perc: [0.001, 0.50]
  k_slow: [0.001, 0.30]
  evap_factor: [0.00, 1.20]
  upper_storage: [0.00, 300.0]
  lower_storage: [0.00, 500.0]

内部では、学習可能なrawパラメータを sigmoid で範囲内に写像します。

これにより、流出係数や貯留量が極端な値になりにくくなります。

また、流量や貯留量は負にならないように制約します。


フォルダー構成

RainfallRunoffDifferentiableTank_r001/
├─ docker/
│  ├─ Dockerfile
│  └─ requirements.txt
├─ docker-compose.yml
├─ .env
├─ configs/
│  ├─ diff_tank_config.yaml
│  └─ diff_tank_config_quick.yaml
├─ data/
│  ├─ raw/
│  └─ processed/
├─ src/
│  ├─ generate_sample_data.py
│  ├─ preprocess.py
│  ├─ model_reference_tank.py
│  ├─ model_differentiable_tank.py
│  ├─ train_differentiable_tank.py
│  ├─ evaluate.py
│  ├─ metrics.py
│  └─ utils.py
├─ outputs/
│  ├─ models/
│  ├─ figures/
│  ├─ metrics/
│  └─ predictions/
├─ scripts/
└─ docs/

実行方法

Docker起動

docker compose up --build

JupyterLabは以下です。

http://localhost:8888

簡易テスト

docker compose run --rm differentiable-tank bash scripts/run_quick_test.sh

このスクリプトでは以下を実行します。

1. サンプルデータ作成
2. 前処理
3. 微分可能タンクモデルの学習
4. 評価

個別実行

docker compose run --rm differentiable-tank python src/generate_sample_data.py
docker compose run --rm differentiable-tank python src/preprocess.py --config configs/diff_tank_config.yaml
docker compose run --rm differentiable-tank python src/train_differentiable_tank.py --config configs/diff_tank_config.yaml
docker compose run --rm differentiable-tank python src/evaluate.py --config configs/diff_tank_config.yaml

出力ファイル

outputs/
├─ models/
│  ├─ differentiable_tank_best.pth
│  ├─ training_history.csv
│  └─ learned_parameters.csv
├─ figures/
│  ├─ loss_curve_differentiable_tank.png
│  ├─ hydrograph_differentiable_tank_test.png
│  ├─ runoff_components_differentiable_tank.png
│  ├─ storage_states_differentiable_tank.png
│  └─ scatter_obs_pred_differentiable_tank.png
├─ metrics/
│  ├─ test_metrics_differentiable_tank.csv
│  └─ learned_parameters_summary.csv
└─ predictions/
   └─ test_predictions_differentiable_tank.csv

今回のポイント

Step 5のポイントは、物理モデルを後処理するだけでなく、物理モデル自体を学習対象にすることです。

Step 4:
  Q_phys をXGBoostやLSTMで補正する

Step 5:
  タンクモデルのパラメータ自体をPyTorchで学習する

つまり、LSTM単独のブラックボックスモデルではなく、物理構造を残したままデータに適応させる方向です。


注意点

今回のモデルは、かなり簡略化した微分可能タンクモデルです。

実務適用には、以下の検討が必要です。

  • 実流域データでの検証
  • 流域ごとのパラメータ範囲の設定
  • 多段タンクモデルへの拡張
  • 水収支制約の強化
  • 積雪・融雪過程の追加
  • 地下水・蒸発散の詳細化
  • 洪水イベント別評価
  • 未経験豪雨への外挿性確認
  • 物理制約付きLSTMとの比較

まとめ

今回は、Step 5として、PyTorchで微分可能な降雨流出タンクモデルを作成しました。

RainfallRunoffDifferentiableTank_r001

このモデルでは、タンクモデルの構造を残しながら、流出係数・浸透係数・初期貯留量を自動微分で学習します。

次の発展としては、以下が考えられます。

1. 多段タンクモデルへの拡張する
2. 水収支制約をより強く入れる
3. 積雪・融雪過程を追加する
4. 流域属性からパラメータを推定する
5. 物理制約付きLSTMへ拡張する
6. 複数流域で学習する

最後にstep 0~ step 5までの記事を紹介しておきます。

  1. LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 1 LSTM単独モデルを実装する
  2. LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 2 水文特徴量を追加する
  3. LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 3 タンクモデル + LSTM残差補正を実装する
  4. LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 4 物理モデル出力をXGBoost / LSTMで後処理する
  5. LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 5 微分可能タンクモデルをPyTorchで実装する

参考リンク

本記事に関連する資料として、タンクモデル、PyTorchの自動微分、降雨流出LSTM、微分可能水文モデル、複数流域データセットを中心にまとめました。

  1. Sugawara, M. (1985) - Tank Model: For the Derivation of River Discharge from Rainfall
    タンクモデルの基本的な考え方を確認できる資料です。

  2. PyTorch - Automatic differentiation package: torch.autograd
    PyTorchで自動微分を扱うための公式ドキュメントです。

  3. PyTorch - Sigmoid
    学習パラメータを一定範囲へ写像するときに使用するSigmoid関数の公式ドキュメントです。

  4. Kratzert et al. (2018) - Rainfall-runoff modelling using Long Short-Term Memory (LSTM) networks
    LSTMを降雨流出解析へ適用した代表的な研究です。

  5. Feng et al. (2022) - Differentiable, Learnable, Regionalized Process-Based Models With Multiphysical Outputs can Approach State-Of-The-Art Hydrologic Prediction Accuracy
    HBVをベースに、物理モデルとニューラルネットワークを微分可能な形で組み合わせた研究です。

  6. Shen et al. (2023) - Differentiable modelling to unify machine learning and physical models for geosciences
    微分可能モデルを、物理モデルと機械学習をつなぐ枠組みとして整理したレビュー・展望論文です。

  7. Feng et al. (2023) - The suitability of differentiable, physics-informed machine learning hydrologic models for ungauged regions and climate change impact assessment
    未観測流域や気候変化条件への適用可能性を検討した研究です。

  8. Song et al. (2024) - When ancient numerical demons meet physics-informed machine learning: adjoint-based gradients for implicit differentiable modeling
    微分可能水文モデルを、陰解法や随伴法まで拡張した研究です。

  9. NeuralHydrology Documentation
    LSTMをはじめとした深層学習による水文モデルを扱うオープンソースフレームワークの公式ドキュメントです。

  10. NCAR - CAMELS: Catchment Attributes and Meteorology for Large-sample Studies
    米国671流域の気象・流量・流域属性を収録した代表的な大規模水文データセットです。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?