---
tags: [chapter, ch02, MLIP, training, DFT]
status: 完成
confidence: high
sources:
  - ../repo-analysis/mace.md
  - ../repo-analysis/comparison-table.md
last_updated: 2026-06-11
---

# Chapter 2：從 DFT 到機器學習勢能（MLIP）

> **一句話**：MLIP 是用 DFT 的 energy / force / stress 當「標準答案」訓練出來的勢能面代理。力是最划算的訓練訊號，分割紀律決定你的成績單可不可信，而 R² 再漂亮也保證不了外推。

## 這章要解決的問題

DFT 的每個單點都貴，但研究需要的是「很多個單點」：MD 要百萬步、位點掃描要上萬個構型、相圖要掃溫度壓力。我們需要一個**便宜的 DFT 代理**——給它座標，它秒回能量和力，而且誤差小到不影響結論。

訓練這個代理需要的不是深度學習的數學，而是**資料素養**：標籤是什麼、訓練集怎麼設計、分割怎麼做、什麼時候不能信。這些觀念你在「擬合實驗數據」時其實都用過，本章只是把它們翻譯到 MLIP 的語境。

## 給化學系學生的直覺說法

**訓練 MLIP ＝ 給學生看閃卡。** 每張閃卡正面是一個結構（座標＋元素），背面是 DFT 算出的能量和力。看幾千張之後，學生學會「看結構猜能量」。猜得好不好，要用**它沒看過的閃卡**來考——這就是 test set 的意義。

**力為什麼重要？算一筆帳就懂。** 一個 100 原子的構型，能量只有 **1 個數字**，力卻有 **3N = 300 個數字**（每個原子三個分量）。50 個構型的訓練集：能量標籤 50 個，力標籤 15,000 個。力不只是「多」，它直接告訴模型勢能面在每一點的**坡度**——等於老師不只給答案，還把解題過程畫給你看。這就是為什麼所有現代 MLIP 都把力放進訓練目標。

**外推風險＝考古題效應。** 你用 0.9–1.0 倍平衡鍵長的構型訓練，拿 1.2–1.4 倍的構型去考——本課程的 notebook 實測，誤差直接放大 **150 倍**（[mace-minimal-demo.ipynb](../../notebooks/mace-minimal-demo.ipynb) 第 6 節，你可以親手重現這個數字）。對應到真實研究：**用 bulk 資料訓練的模型拿去算表面，就是這種考法**。

## 核心概念

### 1. DFT 輸出三件套，就是訓練標籤

VASP 每一步 ionic step 都產生 energy（`TOTEN`）、forces（`OUTCAR` 的力區塊）、stress。MLIP 社群的通用交換格式是 **extended XYZ（extxyz）**：

```text
5
Lattice="10 0 0 0 10 0 0 0 10" Properties=species:S:1:pos:R:3:forces:R:3 energy=-21.7361 pbc="T T T"
Cu  0.000 0.000 0.000   0.012 -0.034  0.001
Cu  2.551 0.013 0.002  -0.041  0.022  0.000
...
```

第二行的 header 宣告了每欄是什麼；`energy` 與每原子的 `forces` 就是標籤。從 VASP 到 extxyz 用 ASE 兩行解決（見最小 code）。

### 2. 訓練集的設計：多樣性 > 數量

模型只會「它看過的化學」。設計訓練集時想三個軸：

- **構型多樣性**：平衡附近＋偏離平衡（MD 快照、拉伸壓縮、缺陷）。只餵平衡構型，模型學不到勢能面的牆壁，會「偏軟」——這正是 Ch5 要講的 universal MLIP softening 的成因。
- **取樣去相關**：AIMD 軌跡相鄰幀高度相似，等間隔抽比全部塞進去更有效率；更講究的做法是依能量或結構特徵分層抽樣。
- **覆蓋你要回答的問題**：要算吸附能，訓練集就必須有 slab＋吸附質構型。沒有的話，再多 bulk 資料都是隔靴搔癢。

### 3. train / validation / test：三份考卷的紀律

| 資料集 | 用途 | 紀律 |
|---|---|---|
| train | 擬合模型參數 | — |
| validation | 選超參數（學習率、模型大小、正則化） | 可以反覆看，但它因此「不再公正」 |
| test | 最終成績單 | **只能用一次**；拿它調過參，它就被污染了 |

常見比例 8:1:1 或 6:2:2。進階考法：**按組成分割**（某個成分只出現在 test）測的是組成外推能力；**按溫度分割**測的是構型外推能力——你想宣稱什麼能力，就設計什麼分割。

### 4. Interpolation vs extrapolation：分布內外

訓練資料在特徵空間撐出一個「已知區」。查詢點落在裡面叫內插（interpolation），通常可信；落在外面叫外推（extrapolation），誤差沒有保證——而且模型**不會主動告訴你**它在外推。表面、過渡態、新元素組合、極端溫壓，都是典型的分布外場景。

### 5. Active learning：讓模型自己舉手

與其猜哪裡沒學好，不如讓模型告訴你：訓練多個模型（committee/ensemble），對同一構型預測**分歧大**的地方就是沒學好的地方，把那些構型送 DFT 標註、加回訓練集、再訓練。MatterSim 的 17M 筆訓練資料就是用這種「不確定度引導」的迴圈生出來的；MACE 也內建 `mace_active_learning_md` 工具。直覺：**用多台儀器交叉校驗，分歧大的樣品重測。**

## 和 DFT / 材料 / 催化的關係

- **同一套 DFT 設定才能進同一個訓練集。** functional、U 值、k 點、截斷能不一致的能量混在一起，等於閃卡的答案來自不同版本的解答本——模型會學到一團矛盾。這是實驗室規則「有 functional 才能比較能量」在 MLIP 時代的直接延伸。
- **吸附能的參考能量鏈**（E_slab、E_molecule、isolated atom 的 E0）也要與訓練資料同一套設定，否則訓練出的模型算吸附能時參考系是錯位的。
- **力的品質取決於你的 DFT 收斂設定**：`EDIFFG` 放太鬆、力沒收斂就拿去當標籤，是「用有雜訊的答案教學生」。

## 最小數學

訓練就是最小化一個損失函數（loss）：

$$\mathcal{L} = \frac{w_E}{N}\big(E - \hat{E}\big)^2 + \frac{w_F}{3N}\sum_{i=1}^{N}\big\lVert \mathbf{F}_i - \hat{\mathbf{F}}_i \big\rVert^2$$

$w_E, w_F$ 是能量與力的權重——它們不只平衡單位（eV² vs (eV/Å)²），也表達你更在乎哪個。實務上力的權重常給很大（MACE 預設訓練第一階段就偏重力），因為力的訊號密度高、又直接決定 MD 與優化的品質。

**學習曲線經驗律**：test 誤差隨訓練集大小近似冪次下降，$\varepsilon \propto N^{-k}$，在 log-log 圖上是直線。用它回答「資料加倍能換到多少精度」「要達到 0.05 eV/Å 還缺多少資料」。notebook 第 5 節有你能親手畫的版本。

## 最小 code

**Level 1（pseudo-code）**

```text
VASP 計算（同一套設定）
  → 抽樣 ionic steps，匯出 energy + forces 成 extxyz
  → 切 train / val / test
  → 訓練（loss = w_E·能量誤差 + w_F·力誤差）
  → 驗證：force RMSE、parity plot、學習曲線
  → 部署：掛 ASE calculator 跑 MD / 掃位點
```

**Level 2（minimal Python：VASP → extxyz）**

```python
from ase.io import read, write

frames = read("vasprun.xml", index="::10")   # 每 10 步抽一幀，去相關
write("train.extxyz", frames)                 # energy/forces 自動帶入
```

訓練流程的可跑版本（toy 資料、split、學習曲線、外推測試）在 [`notebooks/mace-minimal-demo.ipynb`](../../notebooks/mace-minimal-demo.ipynb)——純 numpy，無需安裝任何 MLIP 套件。

**Level 3（real repo pointer）**

- MACE 訓練入口：`mace_run_train --train_file=train.extxyz --valid_fraction=0.1 ...`（完整參數見 [repo-analysis/mace.md](../repo-analysis/mace.md)；注意 extxyz 的 key 預設叫 `energy`/`forces`，可用 `--energy_key` 改）
- CHGNet 的 VASP 解析器：`chgnet.utils.parse_vasp_dir()` 直接把 VASP 輸出目錄變成訓練標籤

## 常見誤解

- **「R²=0.99，模型很好。」** 那是分布內成績。換一個分割方式（按組成、按溫度）再看一次，才知道它會不會你要它會的事。
- **「資料越多越好。」** 一萬張幾乎一樣的閃卡不如一千張多樣的。先看覆蓋，再談數量。
- **「能量準，力自然準。」** 不一定。力是能量的導數，小的能量誤差可以對應大的力誤差；所以力要顯式放進 loss。
- **「validation 跟 test 差不多。」** validation 被你看過、用來做過選擇，它的成績天生偏樂觀。論文裡報 test，而且只報一次。

## 小練習

1. 從一條 2000 幀的 AIMD 軌跡建訓練集：比較「等間隔抽 200 幀」vs「隨機抽 200 幀」vs「按能量分十層、每層抽 20 幀」。哪個策略對「高能構型的力誤差」最有利？為什麼？
2. 你的 HEA 資料若按組成分割（PtPdNiCoFe 的某一組成只出現在 test），test 誤差會比隨機分割高還是低？這個實驗測的是模型的什麼能力？
3. 手算：120 個構型、每個 96 原子。能量標籤幾個？力標籤幾個分量？若 loss 不加權，哪一項天生主導？

## 延伸閱讀

- MACE 官方文件 training 頁：extxyz 約定與訓練參數
- Deng et al., "Systematic softening in universal machine learning interatomic potentials", *npj Comput. Mater.* **11**, 9 (2025)：訓練分布偏差造成系統性偏軟的完整證據——本章概念在真實世界的後果

## 我學完後應該能說出什麼

- 「MLIP 的標籤是 DFT 的 E/F/S；一個 N 原子構型有 3N 個力標籤，所以力是最划算的訓練訊號。」
- 「train/val/test 三份考卷各自的角色，以及 test 只能用一次的理由。」
- 「外推風險具體會出現在我研究的哪裡：表面、過渡態、新組成——而且我能用 notebook 重現 150 倍誤差放大的實驗。」

---

### 本章配套

- notebook：[`notebooks/mace-minimal-demo.ipynb`](../../notebooks/mace-minimal-demo.ipynb)（前半：資料、split、學習曲線）
- 投影片：[`slides/ch02-dft-to-mlip.html`](../../slides/ch02-dft-to-mlip.html)
- 圖解：[`assets/mlip-workflow.svg`](../../assets/mlip-workflow.svg)
- 練習題（含詳解）：[`exercises/ch02.md`](../../exercises/ch02.md)
