Generative Flow Networks (GFlowNets)
生成フローネットワーク (GFlowNets) が確率モデリングを用いて、多様で高報酬な離散オブジェクトをサンプリングし、創薬や因果学習に活用する方法をご紹介します。
生成フローネットワーク、すなわちGFlowNetsは、確率モデリングと償却サンプリングを目的とする強力な機械学習フレームワークです。生成プロセスを逐次的な意思決定タスクとして扱うことで、離散的で合成的なオブジェクトの生成に優れています。従来の強化学習で一般的な報酬の単純な最大化とは異なり、GFlowNetsは事前に定義された報酬関数に比例する確率でオブジェクトをサンプリングするよう学習します。これにより、非常に大きなサンプル空間から高報酬の候補を多様な形で発見でき、敵対的生成ネットワーク(GANs)などのほかの生成アーキテクチャでよく発生するモデル崩壊を効果的に軽減できます。
中核となる原則とメカニズム#
GFlowNetsは構造化された環境内を移動し、構成要素をステップごとに追加して最終的なオブジェクトを構築します。
- 順方向ポリシーと逆方向ポリシー: ニューラルネットワークが順方向ポリシーを予測し、特定の状態から実行可能な各アクションの確率分布を定めます。これらの状態を通る軌跡を対応付けることで、モデルは確率の「フロー」を学習します。
- 軌跡バランス損失: 学習では、特定のオブジェクトを生成する確率が観測された報酬と密接に一致するようにする、軌跡バランス損失などの最適化目標がよく用いられます。学習中にこの損失関数を安定させるには、適切なハイパーパラメーター調整が不可欠です。
- 比例サンプリング: 絶対的な最大値だけを求めるのではなく、報酬に比例してサンプリングすることで、GFlowNetsは自然に多様性を確保します。これは複雑な組み合わせ空間を探索するうえで重要です。
GFlowNetsとその他の生成AIの比較#
生成AIには多くの手法が含まれますが、GFlowNetsは独自の領域を占めています。標準的な拡散モデルやフローマッチングなどの手法は、通常、連続的なノイズ分布をデータに変換します。一方、GFlowNetsは、グラフやシーケンスなどの離散構造を生成するために特化して設計されています。さらに、標準的な強化学習エージェントはマルコフ決定過程 (MDP)を通じて単一の最適経路を見つけようとしますが、GFlowNetsは報酬の高い複数の経路を描き出し、生成結果の幅広い多様性を確保します。
実際のアプリケーション#
多様で高度に最適化された候補を生成できるため、GFlowNetsは科学分野や構造設計分野で特に有用です。
- 創薬と分子設計: 医薬品研究では、GFlowNetsを用いて新規の治療用ペプチドや分子グラフを生成します。Atomic GFlowNets (A-GFN) などの最近の進歩では、結合親和性や合成容易性などの特性を最適化するため、原子を1つずつ組み立てて分子を構築します。このプロセスにより、事前定義されたフラグメントに依存する手法と比べて、多様な創薬候補を作成できます。
- 因果構造学習: GFlowNetsは、因果関係を表すベイジアンネットワークの構造の発見にも応用されます。有向非巡回グラフ (DAGs)上の事後分布を近似することで、複雑なデータ間の関係をモデル化する際に、研究者が現実的な認識的不確実性を維持できるよう支援します。
フォワードポリシーの実装#
GFlowNetを構築する際、フォワードポリシーは次に取り得るステップの確率分布を予測する必要があります。次のPyTorchスニペットでは、シンプルなポリシーレイヤーを定義してアクションをサンプリングする方法を示します。Ultralytics YOLO26のようなビジョンモデルの構築ではバウンディングボックスの座標を予測しますが、GFlowNetではカテゴリ分布を使用して生成経路上の次の状態を選択します。
import torch
import torch.nn as nn
from torch.distributions import Categorical
# A simple linear policy mapping a 64-dim state to 4 possible actions
policy_network = nn.Sequential(nn.Linear(64, 4), nn.Softmax(dim=-1))
# Given a random state vector, compute action probabilities and sample
state = torch.randn(1, 64)
action_probs = policy_network(state)
sampled_action = Categorical(action_probs).sample()
print(f"Sampled Action: {sampled_action.item()}")Pythonで複雑なAIソリューションを開発する場合、Ultralytics Platformを使用して、データセットのアノテーション、モデルの学習、デプロイをシームレスに行えます。高速な物体検出タスクに取り組む場合も、生成アーキテクチャを探求する場合も、モデルを効果的にスケールするには、堅牢な機械学習運用 (MLOps)パイプラインが不可欠です。









