第5章:実世界応用とキャリア - GNN専門家への道

触媒設計、材料探索、産業応用から研究職・エンジニアまで

📖 読了時間: 20-25分 📊 難易度: 上級 💻 コード例: 0個 📝 演習問題: 0問

第5章:実世界応用とキャリア - GNN専門家への道

OC20等の大規模課題でのベストプラクティスを俯瞰します。材料探索や創薬での具体的な活用パターンを学びます。

💡 補足: 学習・推論ともにデータIOが律速になりがち。前処理のキャッシュとロギング設計が効きます。

学習目標

この章を読むことで、以下を習得できます: - 触媒設計(OC20 Challenge)の最新動向を理解できる - 結晶構造予測の実践的手法を学べる - 材料スクリーニングのワークフローを構築できる - GNN専門家のキャリアパスを理解できる - 必要なスキルセットと学習ロードマップを把握できる

読了時間: 15-20分 コード例: 6個 演習問題: 3問


5.1 触媒設計:Open Catalyst 2020 (OC20) Challenge

5.1.1 OC20の概要と重要性

Open Catalyst Project (OCP)は、Meta AI(旧Facebook AI)とCarnegie Mellon大学が主導する大規模触媒探索プロジェクトです。

背景: - 🌍 気候変動対策: 再生可能エネルギー貯蔵(CO2削減、水素製造) - 🔬 触媒の重要性: 化学反応を加速(工業プロセスの90%以上で使用) - 💡 AI加速: DFT計算の100万倍高速化

OC20データセット: - 規模: 130万以上の触媒-吸着物の組み合わせ - 計算時間: 7000万CPUコア時間相当のDFT計算 - 目的: 吸着エネルギーと力の予測

5.1.2 OC20データセットの読み込み

import torch
from torch_geometric.datasets import OC20
from torch_geometric.loader import DataLoader

# OC20データセットをダウンロード(初回のみ、数GB)
# 注意: 完全なデータセットは非常に大きいため、サンプルを使用
dataset_oc20 = OC20(root='./data/OC20', split='train', size='small')

print("===== OC20データセット =====")
print(f"データ数: {len(dataset_oc20)}")
print(f"ノード特徴量次元: {dataset_oc20.num_node_features}")

# 最初のサンプルを確認
data = dataset_oc20[0]
print(f"\n最初のサンプル:")
print(f"  原子数: {data.num_nodes}")
print(f"  原子番号: {data.atomic_numbers[:10]}")  # 最初の10原子
print(f"  座標: {data.pos.shape}")
print(f"  エネルギー: {data.y:.4f} eV")
print(f"  力: {data.force.shape}")

5.1.3 GemNet-OC:OC20専用モデル

GemNet-OCは、OC20で最高性能を達成したGNNアーキテクチャです。

特徴: - 📐 幾何学的埋め込み: 原子間距離、角度、二面角を考慮 - 🔄 E(3)等変性: 回転・平行移動に対して等変 - ⚡ 効率的な計算: SchNetやDimeNetより高速

from torch_geometric.nn.models import GemNetOC

# GemNet-OCモデルのインスタンス化
model_gemnet = GemNetOC(
    num_targets=1,          # エネルギー予測
    num_spherical=7,        # 球面調和関数の次数
    num_radial=128,         # 動径基底関数の数
    num_blocks=4,           # ブロック数
    emb_size_atom=256,      # 原子埋め込み次元
    emb_size_edge=512,      # エッジ埋め込み次元
    emb_size_trip_in=64,    # トリプレット埋め込み(入力)
    emb_size_trip_out=64,   # トリプレット埋め込み(出力)
    emb_size_quad_in=32,    # クアドラプレット埋め込み(入力)
    emb_size_quad_out=32,   # クアドラプレット埋め込み(出力)
    emb_size_aint_in=64,
    emb_size_aint_out=64,
    emb_size_rbf=16,
    emb_size_cbf=16,
    emb_size_sbf=32,
    num_before_skip=2,
    num_after_skip=2,
    num_concat=1,
    num_atom=3,
    cutoff=12.0,            # カットオフ距離(Å)
    max_neighbors=30,
    rbf={'name': 'gaussian'},
    envelope={'name': 'polynomial', 'exponent': 5},
    cbf={'name': 'spherical_harmonics'},
    sbf={'name': 'legendre_outer'},
    extensive=True,
    output_init='HeOrthogonal',
    activation='silu',
)

print("===== GemNet-OC =====")
print(f"パラメータ数: {sum(p.numel() for p in model_gemnet.parameters()):,}")

# サンプルデータで順伝播
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model_gemnet = model_gemnet.to(device)
data = data.to(device)

model_gemnet.eval()
with torch.no_grad():
    energy_pred = model_gemnet(data.z, data.pos, data.batch)
    print(f"\n予測エネルギー: {energy_pred.item():.4f} eV")
    print(f"実測エネルギー: {data.y.item():.4f} eV")
    print(f"誤差: {abs(energy_pred.item() - data.y.item()):.4f} eV")

5.1.4 触媒スクリーニングのワークフロー

import matplotlib.pyplot as plt
import numpy as np

def screen_catalysts(model, catalyst_list, adsorbate='*CO'):
    """
    触媒のスクリーニング

    Parameters:
    -----------
    model : torch.nn.Module
        訓練済みGNNモデル
    catalyst_list : list
        触媒候補のリスト
    adsorbate : str
        吸着物(*CO, *OH, *H など)

    Returns:
    --------
    results : dict
        各触媒の吸着エネルギー
    """
    results = {}

    for catalyst in catalyst_list:
        # 触媒-吸着物の構造を生成
        # (実際にはASEなどで原子配置を作成)
        # ...

        # 吸着エネルギーを予測
        with torch.no_grad():
            energy = model(...)  # 実際の推論
            results[catalyst] = energy.item()

    return results

# 使用例(模擬データ)
catalyst_candidates = ['Pt', 'Pd', 'Cu', 'Ag', 'Au', 'Ni', 'Rh', 'Ir']
adsorption_energies = {
    'Pt': -0.85, 'Pd': -0.92, 'Cu': -0.45,
    'Ag': -0.22, 'Au': -0.18, 'Ni': -1.12,
    'Rh': -0.78, 'Ir': -0.88
}

# 可視化
fig, ax = plt.subplots(figsize=(10, 6))
colors = ['red' if e < -0.8 else 'gray' for e in adsorption_energies.values()]
ax.barh(list(adsorption_energies.keys()), list(adsorption_energies.values()), color=colors)
ax.axvline(x=-0.8, color='blue', linestyle='--', linewidth=2, label='最適範囲')
ax.set_xlabel('吸着エネルギー (eV)', fontsize=12)
ax.set_ylabel('触媒', fontsize=12)
ax.set_title('CO吸着エネルギーによる触媒スクリーニング', fontsize=14)
ax.legend()
ax.grid(True, alpha=0.3, axis='x')
plt.tight_layout()
plt.show()

print("===== 触媒スクリーニング結果 =====")
print("最適な触媒(吸着エネルギー < -0.8 eV):")
for catalyst, energy in adsorption_energies.items():
    if energy < -0.8:
        print(f"  {catalyst}: {energy:.2f} eV")

5.2 結晶構造予測:CGCNN、Matformer、MODNet

5.2.1 Crystal Graph Convolutional Networks(CGCNN)

CGCNNは、結晶構造から材料特性を予測する先駆的なGNNです。

応用例: - 🔋 電池材料: イオン伝導度、電圧 - 🔥 熱電材料: ゼーベック係数 - 💎 超硬材料: ヤング率、体積弾性率

from torch_geometric.nn import CGConv, global_mean_pool
import torch
import torch.nn.functional as F

class CGCNN(torch.nn.Module):
    """
    Crystal Graph Convolutional Neural Network

    Features:
    - エッジ特徴量(原子間距離)を考慮
    - 周期境界条件に対応
    """
    def __init__(self, num_node_features=92, num_classes=1, hidden_channels=64):
        super().__init__()

        # 原子埋め込み(原子番号 → ベクトル)
        self.embedding = torch.nn.Embedding(num_node_features, hidden_channels)

        # Crystal Graph Convolution層
        self.conv1 = CGConv(hidden_channels, dim=1)  # dim=1: エッジ特徴量は距離のみ
        self.conv2 = CGConv(hidden_channels, dim=1)
        self.conv3 = CGConv(hidden_channels, dim=1)

        # 全結合層
        self.lin1 = torch.nn.Linear(hidden_channels, hidden_channels // 2)
        self.lin2 = torch.nn.Linear(hidden_channels // 2, num_classes)

    def forward(self, z, edge_index, edge_attr, batch):
        """
        Parameters:
        -----------
        z : torch.Tensor (num_atoms,)
            原子番号
        edge_index : torch.Tensor (2, num_edges)
            エッジインデックス
        edge_attr : torch.Tensor (num_edges, 1)
            エッジ特徴量(原子間距離)
        batch : torch.Tensor (num_atoms,)
            バッチインデックス
        """
        # 原子埋め込み
        x = self.embedding(z)

        # Crystal Graph Convolution
        x = F.softplus(self.conv1(x, edge_index, edge_attr))
        x = F.softplus(self.conv2(x, edge_index, edge_attr))
        x = F.softplus(self.conv3(x, edge_index, edge_attr))

        # グローバルプーリング
        x = global_mean_pool(x, batch)

        # 全結合層
        x = F.softplus(self.lin1(x))
        x = self.lin2(x)

        return x

# モデルのインスタンス化
model_cgcnn = CGCNN(num_node_features=118, num_classes=1)  # 118元素

print("===== CGCNN =====")
print(model_cgcnn)
print(f"\nパラメータ数: {sum(p.numel() for p in model_cgcnn.parameters()):,}")

5.2.2 Materials Projectデータでの訓練

from pymatgen.ext.matproj import MPRester
from pymatgen.core import Structure
import pandas as pd

# Materials Project APIから結晶データを取得
# 注意: APIキーが必要(https://materialsproject.org で登録)

# サンプルデータ(実際はAPIで取得)
crystal_data = pd.DataFrame({
    'formula': ['Li2O', 'LiFePO4', 'LiCoO2', 'Li4Ti5O12', 'LiMn2O4'],
    'band_gap': [7.5, 1.2, 2.3, 1.8, 0.9],
    'formation_energy': [-2.9, -2.1, -1.8, -2.4, -1.6]
})

print("===== Materials Projectデータ =====")
print(crystal_data)

# 結晶構造をグラフに変換する関数(第3章で定義)
def structure_to_cgcnn_input(structure):
    """
    pymatgen StructureをCGCNN入力に変換
    """
    # 原子番号
    z = torch.tensor([site.specie.Z for site in structure], dtype=torch.long)

    # エッジインデックスとエッジ特徴量(距離)
    edge_indices = []
    edge_attrs = []

    for i, site_i in enumerate(structure):
        for j, site_j in enumerate(structure):
            if i != j:
                distance = structure.get_distance(i, j)
                if distance < 8.0:  # カットオフ
                    edge_indices.append([i, j])
                    edge_attrs.append([distance])

    edge_index = torch.tensor(edge_indices, dtype=torch.long).t().contiguous()
    edge_attr = torch.tensor(edge_attrs, dtype=torch.float)

    return z, edge_index, edge_attr

# 訓練ループ(簡略版)
# 実際にはMaterials ProjectからStructureオブジェクトを取得して訓練

5.2.3 結晶特性予測の性能比較

import matplotlib.pyplot as plt

# 文献値(Materials Projectベンチマーク)
models_performance = {
    'Random Forest': {'Formation Energy MAE': 0.22, 'Band Gap MAE': 0.58},
    'CGCNN': {'Formation Energy MAE': 0.039, 'Band Gap MAE': 0.388},
    'Matformer': {'Formation Energy MAE': 0.032, 'Band Gap MAE': 0.320},
    'MODNet': {'Formation Energy MAE': 0.028, 'Band Gap MAE': 0.305},
}

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 形成エネルギー予測
models = list(models_performance.keys())
formation_mae = [models_performance[m]['Formation Energy MAE'] for m in models]
axes[0].bar(models, formation_mae, color=['gray', 'steelblue', 'forestgreen', 'coral'])
axes[0].set_ylabel('MAE (eV/atom)', fontsize=12)
axes[0].set_title('形成エネルギー予測精度', fontsize=13)
axes[0].tick_params(axis='x', rotation=15)
axes[0].grid(True, alpha=0.3, axis='y')

# バンドギャップ予測
band_gap_mae = [models_performance[m]['Band Gap MAE'] for m in models]
axes[1].bar(models, band_gap_mae, color=['gray', 'steelblue', 'forestgreen', 'coral'])
axes[1].set_ylabel('MAE (eV)', fontsize=12)
axes[1].set_title('バンドギャップ予測精度', fontsize=13)
axes[1].tick_params(axis='x', rotation=15)
axes[1].grid(True, alpha=0.3, axis='y')

plt.tight_layout()
plt.show()

print("===== 結晶特性予測ベンチマーク =====")
print(pd.DataFrame(models_performance).T)

5.3 材料スクリーニング:高速探索ワークフロー

5.3.1 GNN加速の材料探索パイプライン

flowchart TD A[候補材料生成\n1000-10000個] --> B[GNN高速スクリーニング\n1秒/材料] B --> C[上位100候補選択] C --> D[DFT精密計算\n1時間/材料] D --> E[上位10候補選択] E --> F[実験合成・評価\n1週間/材料] F --> G[最終候補3-5個] style A fill:#e3f2fd style B fill:#fff3e0 style C fill:#f3e5f5 style D fill:#e8f5e9 style E fill:#fff9c4 style F fill:#ffccbc style G fill:#c8e6c9

加速効果: - 従来法: 10000材料 × 1時間(DFT)= 10000時間(約1.1年) - GNN加速: 10000材料 × 1秒(GNN)+ 100材料 × 1時間(DFT)= 3時間 - 加速率: 3300倍!

5.3.2 材料スクリーニングの実装

import torch
from torch_geometric.data import Data, DataLoader
import numpy as np
import pandas as pd

def high_throughput_screening(model, candidate_structures, target_property='band_gap', threshold=2.0):
    """
    高スループット材料スクリーニング

    Parameters:
    -----------
    model : torch.nn.Module
        訓練済みGNNモデル
    candidate_structures : list
        候補結晶構造のリスト
    target_property : str
        目的特性
    threshold : float
        閾値(この値以上を選択)

    Returns:
    --------
    promising_candidates : list
        有望な候補のリスト
    """
    model.eval()
    results = []

    with torch.no_grad():
        for i, structure in enumerate(candidate_structures):
            # 構造をグラフに変換
            z, edge_index, edge_attr = structure_to_cgcnn_input(structure)
            batch = torch.zeros(len(z), dtype=torch.long)

            # 特性を予測
            prediction = model(z, edge_index, edge_attr, batch)

            results.append({
                'index': i,
                'formula': structure.composition.reduced_formula,
                'predicted_value': prediction.item()
            })

    # DataFrameに変換
    df_results = pd.DataFrame(results)

    # 閾値でフィルタリング
    promising = df_results[df_results['predicted_value'] >= threshold]

    print(f"===== スクリーニング結果 =====")
    print(f"候補材料数: {len(candidate_structures)}")
    print(f"閾値: {threshold} eV")
    print(f"有望な候補: {len(promising)}個")

    return promising.sort_values('predicted_value', ascending=False)

# 模擬データで実行
# (実際にはpymatgenで大量の結晶構造を生成)
num_candidates = 1000
predicted_values = np.random.normal(1.5, 0.8, num_candidates)

# ヒストグラム
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(predicted_values, bins=50, alpha=0.7, edgecolor='black')
ax.axvline(x=2.0, color='r', linestyle='--', linewidth=2, label='閾値(2.0 eV)')
ax.set_xlabel('予測バンドギャップ (eV)', fontsize=12)
ax.set_ylabel('材料数', fontsize=12)
ax.set_title('1000材料のGNNスクリーニング結果', fontsize=14)
ax.legend()
ax.grid(True, alpha=0.3, axis='y')

# 統計情報
promising_count = np.sum(predicted_values >= 2.0)
ax.text(0.05, 0.95, f'閾値以上: {promising_count}個 ({promising_count/num_candidates*100:.1f}%)',
        transform=ax.transAxes, fontsize=12, verticalalignment='top',
        bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))

plt.tight_layout()
plt.show()

print(f"\n上位10候補:")
top_10_indices = np.argsort(predicted_values)[-10:][::-1]
for rank, idx in enumerate(top_10_indices, 1):
    print(f"  {rank}. 材料#{idx}: {predicted_values[idx]:.3f} eV")

5.3.3 実験との連携(クローズドループ)

def closed_loop_optimization(model, initial_candidates, num_iterations=10, batch_size=5):
    """
    クローズドループ最適化
    GNN予測 → DFT計算 → 実験 → モデル更新 → 次の候補提案

    Parameters:
    -----------
    model : torch.nn.Module
        初期モデル
    initial_candidates : list
        初期候補
    num_iterations : int
        最適化の反復回数
    batch_size : int
        各反復で評価する候補数

    Returns:
    --------
    best_material : dict
        最良の材料
    """
    all_evaluated = []
    current_best = None

    for iteration in range(num_iterations):
        print(f"\n===== Iteration {iteration + 1}/{num_iterations} =====")

        # ステップ1: GNNで候補をランク付け
        predictions = []
        for candidate in initial_candidates:
            # ... GNN予測 ...
            score = np.random.rand()  # 模擬
            predictions.append((candidate, score))

        predictions.sort(key=lambda x: x[1], reverse=True)

        # ステップ2: 上位batch_size個をDFT計算
        batch = predictions[:batch_size]
        dft_results = []

        for candidate, gnn_score in batch:
            # DFT計算(実際にはVASPなどを実行)
            dft_value = gnn_score + np.random.normal(0, 0.1)  # 模擬
            dft_results.append({
                'candidate': candidate,
                'gnn_pred': gnn_score,
                'dft_value': dft_value
            })

            all_evaluated.append(dft_results[-1])

        # ステップ3: 最良候補を更新
        best_in_batch = max(dft_results, key=lambda x: x['dft_value'])
        if current_best is None or best_in_batch['dft_value'] > current_best['dft_value']:
            current_best = best_in_batch
            print(f"新しい最良候補: DFT値 = {current_best['dft_value']:.4f}")

        # ステップ4: モデルを再訓練(新しいDFTデータを追加)
        # ... model.train() ...

    print(f"\n===== 最終結果 =====")
    print(f"評価した材料数: {len(all_evaluated)}")
    print(f"最良の材料: DFT値 = {current_best['dft_value']:.4f}")

    return current_best

# 使用例(概念実証)
# best = closed_loop_optimization(model_cgcnn, candidate_list)

5.4 産業応用事例

5.4.1 電池材料の探索

ケーススタディ: 全固体電池の電解質材料

課題: - 高いイオン伝導度(> 10⁻³ S/cm) - 化学的安定性 - リチウム金属との界面安定性

GNN活用: 1. 候補生成: 既知の結晶構造から1万種類の変種を生成 2. GNNスクリーニング: イオン伝導度を予測(3時間) 3. DFT検証: 上位100候補を精密計算(100時間) 4. 実験合成: 上位5候補を実際に合成・評価(5週間)

成果: - 従来法(ランダム探索): 3年で5候補発見 - GNN加速: 3ヶ月で10候補発見(12倍高速化)

5.4.2 触媒プロセスの最適化

ケーススタディ: CO2還元触媒

課題: - CO2 → COの選択性向上 - 過電圧の低減 - 触媒の長期安定性

GNN活用: 1. 吸着エネルギー予測: CO、H2、COOH吸着状態をGNNで予測 2. volcano plotの構築: 理論的な最適触媒組成を特定 3. 合金探索: 2元系、3元系合金を1000種類スクリーニング

成果: - CuAg合金でCO選択性90%達成(従来比1.5倍) - 過電圧0.3 V削減

5.4.3 製薬業界での分子設計

ケーススタディ: 創薬(薬物動態予測)

課題: - ADMET特性の予測(吸収、分布、代謝、排泄、毒性) - 合成可能性の評価 - 特許回避

GNN活用: 1. 分子特性予測: 溶解度、膜透過性、毒性をGNNで高速予測 2. 生成モデル: VAE/GAN + GNNで新規分子を生成 3. 最適化: ベイズ最適化とGNNを組み合わせ

成果: - リード化合物の最適化期間が2年 → 6ヶ月に短縮 - 合成成功率70% → 85%に向上


5.5 GNN専門家のキャリアパス

5.5.1 キャリアの選択肢

flowchart TD A[GNN基礎習得] --> B{キャリア選択} B --> C[アカデミア\n研究者] B --> D[産業界\nR&Dエンジニア] B --> E[スタートアップ\n創業・参画] C --> C1[助教・准教授\n大学・研究機関] C --> C2[ポスドク\n海外研究室] C --> C3[国研\nNIMS, 産総研] D --> D1[材料メーカー\n新素材開発] D --> D2[製薬企業\n創薬AI] D --> D3[Tech企業\nMeta, Google, DeepMind] E --> E1[Materials AI\nスタートアップ] E --> E2[CTO/Tech Lead] E --> E3[コンサルタント] style A fill:#e3f2fd style C fill:#c8e6c9 style D fill:#fff9c4 style E fill:#ffccbc

5.5.2 必要なスキルセット

技術スキル: 1. プログラミング - Python: PyTorch, PyTorch Geometric, NumPy, Pandas - C++: 高速化が必要な場合 - Julia: 科学計算(オプション)

  1. 機械学習・深層学習 - GNN: メッセージパッシング、グラフプーリング、等変GNN - 最適化: Adam、学習率スケジューリング - 正則化: Dropout、BatchNormalization

  2. 材料科学・化学 - DFT計算: VASP、Quantum ESPRESSO - 結晶学: 空間群、対称性 - 量子化学: 軌道、電子構造

  3. ツール・ライブラリ - pymatgen: 結晶構造の扱い - ASE: 原子シミュレーション - RDKit: 分子の扱い - Materials Project API

ソフトスキル: - 📝 論文執筆: トップジャーナルへの投稿経験 - 🗣️ プレゼンテーション: 学会発表、社内報告 - 🤝 協働: 実験研究者、計算科学者との連携 - 📊 プロジェクト管理: マイルストーン設定、進捗管理

5.5.3 学習ロードマップ

Phase 1: 基礎固め(3-6ヶ月)

Week 1-4: Python & 機械学習基礎
- Python基礎(NumPy, Pandas, Matplotlib)
- scikit-learn: 線形回帰、ランダムフォレスト
- Kaggleコンペ参加(初級)

Week 5-12: 深層学習基礎
- PyTorchチュートリアル完走
- CNN: 画像分類
- RNN: 時系列予測
- Coursera: Deep Learning Specialization

Week 13-20: GNN基礎
- この「GNN入門シリーズ」を完走
- PyTorch Geometric公式チュートリアル
- QM9データセットで分子特性予測

Week 21-24: 材料科学基礎
- Materials Projectチュートリアル
- pymatgen入門
- DFT計算の基礎(オンラインコース)

Phase 2: 実践力強化(6-12ヶ月)

Month 7-9: 研究プロジェクト
- OC20 Challengeに参加
- Kaggle: Molecular Property Predictionコンペ
- 自分のデータセットで予測モデル構築

Month 10-12: 論文再現実装
- SchNet論文を読み、実装
- CGCNN論文を読み、実装
- GemNet論文を読み、実装(高難度)

Month 13-15: 独自研究
- 新しいGNNアーキテクチャを提案
- 既存手法の改良(アブレーション実験)
- arXivにプレプリント投稿

Phase 3: 専門性確立(12-24ヶ月)

Month 16-18: トップカンファレンス投稿
- NeurIPS, ICML, ICLR
- Materials-specific: npj Computational Materials

Month 19-21: コミュニティ貢献
- GitHubでオープンソースプロジェクト公開
- PyTorch Geometricへのコントリビュート
- 勉強会・ハッカソン主催

Month 22-24: キャリア構築
- ポートフォリオ作成(GitHub, ブログ)
- カンファレンス発表(ポスター → 口頭発表)
- 就職活動 or 博士課程進学

5.5.4 推奨リソース

オンラインコース: 1. Coursera: Machine Learning Specialization (Andrew Ng) 2. Fast.ai: Practical Deep Learning for Coders 3. Stanford CS224W: Machine Learning with Graphs 4. MIT 3.320: Atomistic Computer Modeling of Materials

書籍: 1. Deep Learning (Ian Goodfellow) - DL基礎 2. Graph Representation Learning (William L. Hamilton) - GNN理論 3. Electronic Structure (Richard M. Martin) - DFT基礎 4. Materials Informatics (Krishna Rajan) - MI概論

カンファレンス: - AI: NeurIPS, ICML, ICLR - Materials: MRS Fall/Spring Meeting, APS March Meeting - Computational: CECAM, ACS

コミュニティ: - PyTorch Geometric: GitHub Discussions - Materials Project: Forum - Open Catalyst Project: Discord


5.6 本章のまとめ

学んだこと

  1. 触媒設計(OC20) - Open Catalyst Projectの概要 - GemNet-OCによる高精度予測 - 吸着エネルギー計算の100万倍高速化

  2. 結晶構造予測 - CGCNN: 結晶特性の高精度予測 - Matformer, MODNet: SOTA性能 - Materials Projectとの統合

  3. 材料スクリーニング - 高スループット探索パイプライン - クローズドループ最適化 - DFT計算との連携

  4. 産業応用 - 電池材料探索(全固体電池) - 触媒プロセス最適化(CO2還元) - 創薬(ADMET予測)

  5. キャリアパス - アカデミア vs 産業界 vs スタートアップ - 必要なスキルセット - 24ヶ月の学習ロードマップ

重要なポイント

シリーズ完結

おめでとうございます!GNN入門シリーズを完走しました!

このシリーズで習得したこと: - 第1章: GNNの歴史的背景と重要性 - 第2章: MPNNを中心としたGNN理論 - 第3章: PyTorch Geometricによる実装 - 第4章: 最先端技術(等変GNN、GNNExplainer) - 第5章: 実世界応用とキャリア構築

次のステップ: 1. 実践プロジェクト: OC20 Challengeに参加 2. 論文再現: SchNet, GemNet論文を実装 3. オリジナル研究: 新しいアーキテクチャを提案 4. コミュニティ貢献: GitHubでコード公開 5. キャリア構築: ポートフォリオ作成、就職活動

← シリーズ目次に戻る


演習問題

問題1(難易度:easy)

GNNによる材料探索が従来のDFT計算より優れている点を3つ挙げてください。

ヒント 速度、スケーラビリティ、探索範囲の観点から考えましょう。
解答例 **GNNが優れている3つの点**: **1. 計算速度の劇的な向上** - **DFT**: 1材料あたり1時間(CPUコア数に依存) - **GNN**: 1材料あたり1秒(GPU使用) - **加速率**: 3600倍 **具体例**: - 10,000材料の探索 - DFT: 10,000時間(約1.1年) - GNN: 3時間(+ 上位100候補のDFT検証100時間 = 計103時間) **2. 大規模探索が可能** - DFTは計算コストが高く、現実的には数百〜数千材料が限界 - GNNは数百万材料を短時間でスクリーニング可能 - **探索空間の拡大**: 10³ → 10⁶(1000倍) **具体例**: - OC20プロジェクト: 130万以上の触媒-吸着物組み合わせを評価 - 従来法では不可能な規模 **3. 反復的最適化が実用的** - GNNの高速性により、クローズドループ最適化が可能 - 予測 → 実験 → モデル更新 → 次の候補提案 のサイクルを高速化 - **開発期間の短縮**: 数年 → 数ヶ月 **具体例**: - 電池材料探索: 従来3年 → GNN活用で3ヶ月(12倍高速化) **追加の利点**: - **環境負荷**: 計算資源の削減(消費電力が低い) - **コスト**: DFT計算のライセンス費用不要 - **専門知識**: DFT計算ほど専門知識が不要(データがあれば学習可能) **注意点**: - GNNの予測精度はDFTより低い(近似手法) - 最終候補はDFTや実験で検証する必要がある - 訓練データの質に依存(ガベージイン・ガベージアウト)

問題2(難易度:medium)

Open Catalyst 2020 (OC20) Challengeに参加するための完全なワークフローを、データダウンロードから予測結果の提出まで、ステップバイステップで説明してください。

ヒント OC20の公式GitHub(https://github.com/Open-Catalyst-Project/ocp)を参考にしましょう。
解答例 **OC20 Challenge参加の完全ワークフロー**: **Phase 1: 環境構築(所要時間: 1-2時間)**
# ステップ1: Python環境作成
conda create -n ocp python=3.9
conda activate ocp

# ステップ2: PyTorch & PyTorch Geometricインストール
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
conda install pyg -c pyg

# ステップ3: OCPライブラリのインストール
git clone https://github.com/Open-Catalyst-Project/ocp.git
cd ocp
pip install -e .

# ステップ4: 依存ライブラリ
pip install lmdb ase wandb submitit
**Phase 2: データダウンロード(所要時間: 数時間〜1日)**
# ステップ5: データセットのダウンロード
# 注意: 完全版は数百GB、まずはSmall版で試す

# S2EF(Structure to Energy and Forces)タスク
python scripts/download_data.py --task s2ef --split train --get-edges --num-workers 8
python scripts/download_data.py --task s2ef --split val_id --get-edges --num-workers 8
python scripts/download_data.py --task s2ef --split test --get-edges --num-workers 8

# IS2RE(Initial Structure to Relaxed Energy)タスク
python scripts/download_data.py --task is2re --split train --get-edges --num-workers 8
**Phase 3: ベースラインモデルの訓練(所要時間: 数日〜1週間)**
# ステップ6: 設定ファイルの準備
# configs/s2ef/2M/schnet/schnet.yml を使用

# ステップ7: 訓練の開始
python main.py \
    --mode train \
    --config-yml configs/s2ef/2M/schnet/schnet.yml \
    --identifier schnet-2M \
    --run-dir ./runs/ \
    --timestamp-id

# ステップ8: TensorBoardで訓練監視
tensorboard --logdir ./runs/
**Phase 4: モデルの改良(所要時間: 1-2週間)**
# ステップ9: カスタムモデルの定義
# ocp/models/custom_model.py

from torch_geometric.nn import SchNet
import torch.nn as nn

class ImprovedSchNet(SchNet):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 独自の改良を追加
        self.extra_layer = nn.Linear(128, 128)

    def forward(self, data):
        # カスタムフォワードパス
        energy = super().forward(data)
        energy = self.extra_layer(energy)
        return energy

# ステップ10: 設定ファイルに登録
# configs/s2ef/2M/custom/custom_model.yml
**Phase 5: 予測と提出(所要時間: 数時間)**
# ステップ11: テストデータで予測
python main.py \
    --mode predict \
    --config-yml configs/s2ef/2M/schnet/schnet.yml \
    --checkpoint ./checkpoints/best_checkpoint.pt \
    --identifier predict-schnet

# ステップ12: 予測結果の検証
python scripts/verify_predictions.py \
    --predictions ./results/s2ef_predictions.npz \
    --task s2ef

# ステップ13: リーダーボードへの提出
# https://eval.ai/web/challenges/challenge-page/712/ にアクセス
# predictions.npzをアップロード
**Phase 6: 結果分析と改善(反復)**
# ステップ14: エラー分析
import numpy as np
import matplotlib.pyplot as plt

predictions = np.load('./results/s2ef_predictions.npz')
energy_pred = predictions['energy']
energy_true = predictions['energy_true']

# MAE計算
mae = np.mean(np.abs(energy_pred - energy_true))
print(f"Energy MAE: {mae:.4f} eV")

# 残差プロット
plt.scatter(energy_true, energy_pred - energy_true, alpha=0.5)
plt.xlabel('True Energy (eV)')
plt.ylabel('Residual (eV)')
plt.title('Error Analysis')
plt.show()

# ステップ15: 改善策の検討
# - ハイパーパラメータチューニング
# - データ拡張
# - アンサンブル学習
**評価指標**: - **S2EF(Energy)**: Mean Absolute Error (MAE) - **S2EF(Forces)**: MAE, Energy within Threshold (EwT) - **IS2RE**: MAE **リーダーボード目標**: - **ベースライン(SchNet)**: Energy MAE ~0.5 eV - **中級(GemNet-OC)**: Energy MAE ~0.3 eV - **上級(カスタム)**: Energy MAE < 0.2 eV **注意点**: - GPU必須(NVIDIA Tesla V100以上推奨) - ストレージ: 最低500GB(完全版は2TB) - 訓練時間: 8xV100で数日〜1週間 **参考リソース**: - OC20公式サイト: https://opencatalystproject.org/ - GitHub: https://github.com/Open-Catalyst-Project/ocp - 論文: Chanussot et al., "Open Catalyst 2020 (OC20) Dataset"

問題3(難易度:hard)

GNN専門家として就職活動をする際のポートフォリオに含めるべき5つのプロジェクトを提案し、それぞれのプロジェクトで何を示すべきか具体的に説明してください。

ヒント 基礎力、実装力、独創性、協働力、実務適用力の5つの観点から考えましょう。
解答例 **GNN専門家のポートフォリオ:5つの必須プロジェクト** --- **プロジェクト1: QM9分子特性予測(基礎力の証明)** **目的**: GNNの基礎的な理解と実装力を示す **内容**: - QM9データセットでHOMO-LUMOギャップ予測 - 3種類のGNN(GCN, GAT, SchNet)を実装 - 性能比較(MAE < 0.5 eVを目標) **GitHubに含めるべき内容**:
qm9-prediction/
├── README.md(目標、結果、考察を詳細に)
├── requirements.txt
├── notebooks/
│   ├── 01_data_exploration.ipynb(データ分析)
│   ├── 02_model_comparison.ipynb(モデル比較)
│   └── 03_hyperparameter_tuning.ipynb
├── src/
│   ├── models/(GCN, GAT, SchNetの実装)
│   ├── train.py
│   └── evaluate.py
├── configs/(設定ファイル)
├── results/(学習曲線、性能表)
└── tests/(ユニットテスト)
**示すべきポイント**: - ✅ PyTorch Geometricの正確な理解 - ✅ 再現性(設定ファイル、シード固定) - ✅ 可視化能力(学習曲線、注意重みの可視化) - ✅ ドキュメント力(README、コメント) **期待される成果**: - 各モデルのMAE、訓練時間、パラメータ数の比較表 - ベストモデルでMAE < 0.4 eV達成 --- **プロジェクト2: 論文再現実装(実装力の証明)** **目的**: トップカンファレンス論文を正確に再現できる実装力 **推奨論文**: - SchNet (NeurIPS 2017) - DimeNet (ICLR 2020) - GemNet (ICLR 2021) **内容**: - 論文のアルゴリズムを完全に理装 - 論文の実験結果を再現(誤差±5%以内) - アブレーション実験(各コンポーネントの効果検証) **GitHubに含めるべき内容**:
schnet-reproduction/
├── README.md
│   ├── 論文の要約
│   ├── 再現結果の比較表
│   └── 差異の分析
├── paper/(原論文PDF)
├── src/
│   ├── schnet.py(論文通りの実装)
│   ├── continuous_filter.py
│   └── interaction_block.py
├── experiments/
│   ├── qm9/(QM9実験)
│   └── md17/(MD17実験)
└── ablation_studies/(アブレーション実験)
**示すべきポイント**: - ✅ 論文理解力(数式の正確な実装) - ✅ 再現性(元論文の結果との比較) - ✅ 批判的思考(改善点の提案) **期待される成果**: | 手法 | 論文値 | 再現値 | 差 | |-----|--------|-------|-----| | SchNet (QM9 U0) | 14 meV | 15 meV | +1 meV | | SchNet (QM9 HOMO) | 41 meV | 43 meV | +2 meV | --- **プロジェクト3: オリジナル研究(独創性の証明)** **目的**: 新しいアイデアを形にする独創性 **例: 注意機構を統合したSchNet(SchNet-Attention)** **内容**: - 既存手法(SchNet)に注意機構を追加 - QM9で性能向上を実証 - arXivにプレプリント投稿 **GitHubに含めるべき内容**:
schnet-attention/
├── README.md
│   ├── Motivation(なぜこの研究をしたか)
│   ├── Method(手法の説明)
│   ├── Results(結果)
│   └── Conclusion
├── paper/
│   ├── preprint.pdf(arXiv投稿版)
│   └── figures/(論文用の図)
├── src/
│   ├── schnet_attention.py(新しいモデル)
│   └── attention_layer.py
├── experiments/
│   ├── baseline_comparison.py
│   └── ablation_studies.py
└── notebooks/
    └── visualization.ipynb(注意重みの可視化)
**示すべきポイント**: - ✅ 問題設定能力(研究のモチベーション) - ✅ 仮説検証(アブレーション実験) - ✅ 学術的コミュニケーション(論文執筆) **期待される成果**: - ベースライン(SchNet)から5-10%の性能向上 - arXivへの投稿(査読前でもOK) - 注意重みの可視化で解釈可能性を示す --- **プロジェクト4: 実データ応用(実務適用力の証明)** **目的**: 実世界の材料科学問題に適用できる実務能力 **例: Materials Projectデータで結晶特性予測** **内容**: - Materials Project APIから10,000件の結晶データ取得 - バンドギャップ、形成エネルギー、弾性率を予測 - Webアプリを構築(Streamlit or Flask) **GitHubに含めるべき内容**:
materials-property-predictor/
├── README.md(Webアプリのデモリンク付き)
├── data/
│   ├── fetch_data.py(Materials Project API)
│   └── preprocess.py
├── src/
│   ├── models/(CGCNN実装)
│   ├── train.py
│   └── api.py(予測API)
├── app/
│   ├── streamlit_app.py(Webインターフェース)
│   └── requirements.txt
├── deployment/
│   ├── Dockerfile
│   └── docker-compose.yml
└── docs/
    └── user_guide.md(使い方)
**示すべきポイント**: - ✅ データ収集能力(API活用) - ✅ エンドツーエンド開発(モデル→API→UI) - ✅ 実用化スキル(Docker, デプロイ) **期待される成果**: - 実際に動作するWebアプリ(Heroku/Streamlit Cloudでホスティング) - ユーザーが結晶構造(CIF形式)をアップロードして予測可能 --- **プロジェクト5: OSS貢献(協働力の証明)** **目的**: コミュニティへの貢献と協働能力 **推奨プロジェクト**: - PyTorch Geometric - Open Catalyst Project - Materials Project **内容**: - バグ修正 - 新機能の実装(新しいGNN層、データセット) - ドキュメント改善 - チュートリアル作成 **GitHubに示すべき活動**:
個人プロフィールに表示:
- ✅ Pull Requests: 5-10件(Accept率 > 50%)
- ✅ Issues報告: 10件以上
- ✅ Code Reviews: 他の人のPRにレビューコメント
- ✅ Discussions参加: 技術的な質問に回答
**示すべきポイント**: - ✅ コードレビュー能力(他人のコードを読む力) - ✅ コミュニケーション力(英語でのやり取り) - ✅ チーム開発経験 **期待される成果**: - PyTorch Geometricへの1件以上のマージされたPR - GitHubプロフィールに"Contributor"バッジ --- **ポートフォリオ全体の構成** **GitHubプロフィール README.md**:
# Yusuke Hashimoto - GNN Researcher

## About Me
Materials science researcher specializing in Graph Neural Networks
for molecular and crystal property prediction.

## Skills
- **GNN**: Message Passing, Attention, Equivariant GNNs
- **Tools**: PyTorch, PyTorch Geometric, RDKit, ASE, pymatgen
- **ML**: Deep Learning, Bayesian Optimization, Transfer Learning

## Featured Projects

### 🧪 [QM9 Molecular Property Prediction](link)
Implemented GCN, GAT, SchNet. Achieved MAE < 0.4 eV.

### 📄 [SchNet Reproduction](link)
Reproduced NeurIPS 2017 paper with 95% accuracy.

### 🔬 [SchNet-Attention (arXiv)](link)
Novel architecture combining SchNet + Attention. +8% improvement.

### 🌐 [Crystal Property Web App](demo-link)
Predict band gap from crystal structure. 10k+ predictions served.

### 🤝 [PyTorch Geometric Contributor](link)
5 merged PRs. Added new dataset and GNN layer.

## Publications
- [arXiv link] SchNet-Attention: ...

## Contact
- Email: xxx@example.com
- LinkedIn: [link]
- Google Scholar: [link]
**まとめ**: この5つのプロジェクトで、GNN専門家として必要な全てのスキルを証明できます: 1. 基礎力(QM9予測) 2. 実装力(論文再現) 3. 独創性(オリジナル研究) 4. 実務適用力(Webアプリ) 5. 協働力(OSS貢献) 就職活動時には、これらのプロジェクトを1ページのポートフォリオサイトにまとめ、GitHub PagesやNotionでホスティングしましょう。

参考文献

  1. Chanussot, L., et al. (2021). "Open Catalyst 2020 (OC20) Dataset and Community Challenges." ACS Catalysis, 11(10), 6059-6072. DOI: 10.1021/acscatal.0c04525 OC20データセットの公式論文。130万以上の触媒-吸着物データ。

  2. Xie, T., & Grossman, J. C. (2018). "Crystal Graph Convolutional Neural Networks for an Accurate and Interpretable Prediction of Material Properties." Physical Review Letters, 120(14), 145301. DOI: 10.1103/PhysRevLett.120.145301 CGCNN論文。結晶特性予測の先駆的研究。

  3. Choudhary, K., & DeCost, B. (2021). "Atomistic Line Graph Neural Network for improved materials property predictions." npj Computational Materials, 7, 185. DOI: 10.1038/s41524-021-00650-1 ALIGNN論文。Materials Projectでの高精度予測。

  4. Schmidt, J., et al. (2019). "Recent advances and applications of machine learning in solid-state materials science." npj Computational Materials, 5, 83. DOI: 10.1038/s41524-019-0221-0 マテリアルズインフォマティクスのレビュー論文。産業応用を含む。

  5. Open Catalyst Project. (2024). "Documentation and Tutorials." URL: https://open-catalyst-project.github.io/ OC20の公式ドキュメント。チュートリアル、ベースライン実装を提供。

  6. Materials Project. (2024). "Materials Project Documentation." URL: https://docs.materialsproject.org/ Materials Projectの公式ドキュメント。API使用方法、データ構造の詳細。


作成日: 2025-10-17 バージョン: 1.0 テンプレート: chapter-template-v2.0 著者: GNN入門シリーズプロジェクト


🎓 GNN入門シリーズを完走おめでとうございます!

あなたは今、材料科学の未来を切り開くGNN専門家への第一歩を踏み出しました。

次のアクション: 1. OC20 Challengeに参加: https://opencatalystproject.org/ 2. 論文を読む: arXivで"Graph Neural Networks Materials"を検索 3. コミュニティに参加: PyTorch Geometric Discussions 4. ポートフォリオを作成: GitHubで5つのプロジェクトを公開 5. キャリアを構築: 研究職、R&Dエンジニア、スタートアップへ

連絡先: - GitHub: https://github.com/[your-username] - Email: yusuke.hashimoto.b8@tohoku.ac.jp

Good luck with your GNN journey! 🚀

免責事項