---
tags: [chapter, ch04, MACE, equivariance]
status: 完成
confidence: high
sources:
  - ../repo-analysis/mace.md
last_updated: 2026-06-11
---

# Chapter 4：MACE 入門

> **一句話**：MACE 在 Ch3 的陽春 GNN 上做了兩個升級——equivariance 把「力要跟著分子轉」寫進架構、higher-order message passing 讓兩輪就涵蓋多體效應。學會從 VASP 資料到跑 MD 的五步流程，並認得哪些 foundation model 是 MIT、哪些是 ASL。

## 這章要解決的問題

Ch3 的玩具 GNN 有兩個不足，MACE 各給一個答案：

| 不足 | 後果 | MACE 的答案 |
|---|---|---|
| 特徵是純量，不帶方向 | 旋轉體系時，力的方向變換靠「學」，學得近似就會破對稱 | **E(3)-equivariance**：對稱性內建在架構 |
| 每輪訊息只看成對關係 | 鍵角、二面角這類多體效應要堆很多輪才能湊出來 | **higher-order message passing**：一輪聚合多體資訊 |

外加一件改變整個領域的事：MACE 團隊發布了一整個家族的**預訓練 foundation models**（MACE-MP、MACE-OFF、MACE-MH……），89 種元素、下載即用——「不訓練、直接模擬」從 2024 年起成為現實選項。

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

**Equivariance（等變性）：轉杯水的思想實驗。** 把一杯水整體轉 90°——能量不該變（invariant，不變量），但每個原子受的力向量必須**跟著轉 90°**（equivariant，等變量）。這不是模型該「學會」的事，是物理定律。MACE 把它直接寫進網路架構：旋轉輸入，輸出的力**精確地**跟著旋轉，誤差為零、不是近似。類比：你不會要求學生每學期重新證明「能量與座標系選取無關」——它是公理，直接內建。

| 物理量 | 旋轉體系時它怎麼變 | 術語 |
|---|---|---|
| 能量、電荷 | 不變 | invariant |
| 力、偶極矩 | 跟著轉（向量） | equivariant（一階） |
| 應力、極化率 | 跟著轉（張量） | equivariant（二階） |

另一條路是 data augmentation——把每個訓練構型旋轉幾百份餵給模型，讓它「背」出對稱性。代價是資料爆量、而且學到的對稱性永遠是近似的：MD 跑久了，破對稱的小誤差會累積。**內建勝過硬背。**

**Higher-order：一次聽完整桌人的對話。** Ch3 的訊息是成對的——像你在飯桌上一次只跟一個人講話，要拼湊「整桌的氣氛」（鍵角、二面角這種多體幾何）得聽很多輪。MACE 的高階訊息（`correlation=3`，對應 4-body）等於一輪就把「這桌人彼此的相對位置」整包聽進來。結果：**兩輪 message passing 就夠**，又快又準。它的數學血統來自 Atomic Cluster Expansion（ACE）——知道這個名字即可，推導不在本課範圍。

**Foundation model 家族：不同科系的通才畢業生。** MACE-MP 系列主修無機材料（在 Materials Project 的 MPTrj 軌跡上訓練）、MACE-OFF 主修有機分子（SPICE 資料）、MACE-MH 是跨域雙主修（含表面催化的 OC20 head）。挑對科系，再用你的資料「補修專門領域」（fine-tune）。

## 核心概念

### 1. 完整工作流：五步從 VASP 到 MD

```text
① VASP 計算（同一套設定）──ASE──▶ ② train.extxyz（energy/forces）
                                        │
③ mace_run_train（從頭或 --foundation_model 微調）
                                        │
④ 驗證：mace_eval_configs → parity plot、force RMSE
                                        │
⑤ 部署：ASE calculator（優化/NEB/小 MD）或 LAMMPS（大規模 MD）
```

每一步的指令都在「最小 code」。第④步不是儀式——**沒有 hold-out 驗證的 MLIP 不能上生產**，這是本課程反覆出現的紀律。

### 2. Foundation models 與 license 地圖

| 模型 | 訓練資料／理論層級 | License | 適合 |
|---|---|---|---|
| MACE-MP-0a / 0b3 | MPTrj（PBE+U，bulk 軌跡） | **MIT** | 無機材料入門 |
| **MACE-MPA-0** | MPTrj + sAlex | **MIT** | 目前 MIT 系最準，**推薦預設** |
| MACE-OMAT-0 | OMat24 | ASL | 非平衡構型較強 |
| MACE-OFF23 | SPICE（ωB97M+D3） | ASL | 有機分子 |
| MACE-MH-1 | OMAT/OMol/OC20/MATPES 多 head | ASL | 跨域、**含表面催化 head** |

**教學金句：code 的 MIT ≠ 權重的 MIT。** MACE 程式碼是 MIT，但上表一半的權重是 ASL（Academic Software License，**僅限學術非商用**）。純學術研究都能用；產學合作案要先看這張表。

### 3. Fine-tuning 與 multihead replay

拿 foundation model 的權重當起點，用你的幾十～幾百個 DFT 構型繼續訓練。天真的做法會引發 **catastrophic forgetting**（災難性遺忘）——模型在你的體系變準了，原本會的通用化學崩了，外推能力跟著崩。MACE 官方解法是 **multihead replay**：微調時混入一部分原始訓練資料一起「複習」。類比：博士生補修專門領域，但不能把普化忘光——複習進度表是制度，不是自覺。

### 4. 已知的坑（全部當日查證，來源見 repo 分析）

- 套件名是 **`mace-torch`**；PyPI 上的 `MACE` 是同名無關套件。
- **先**照 pytorch.org 裝對 CUDA 版的 torch，**再**裝 mace-torch；torch 2.4.1 整版不支援。
- 訓練參數 `--swa` 已改名 `--stage_two`——網路上 2024 年以前的教學文都還寫舊名。
- foundation model 權重自動下載到 `~/.cache/mace`；HPC 上注意 home quota。

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

- **MACE-MP 學的是 MPTrj 的 raw VASP 能量**（PBE+U、未含 MP2020 修正）——它的能量參考系跟你的 slab 計算不同，**能量值不能直接混用**，只能在同一參考系內比差值。
- 對表面/吸附：MPTrj 幾乎沒有表面構型，所以 MACE-MP 算吸附能是**外推**（Ch2 的 150 倍教訓）。MACE-MH-1 的 `oc20_usemppbe` head 是目前最對口的現成選項（注意 ASL），但對 HEA 多金屬表面仍須自行驗證——Ch6 給完整協議。
- 你的微調資料必須與「吸附能的參考能量鏈」同一套 DFT 設定——slab、吸附質分子、isolated atom E0s，一條鏈都不能斷。

## 最小數學

等變性的定義只有一條式子。設 $R$ 是任一旋轉、$x$ 是座標、$f$ 是模型輸出的力場：

$$f(R\,x) = R\, f(x)$$

「先轉再算」等於「先算再轉」。對照轉杯水：左邊是你把杯子轉了再量力，右邊是量了力再把箭頭轉過去——必須一樣。invariant 是它的特例（$f(Rx) = f(x)$，作用在能量上）。e3nn 的記號 `128x0e + 128x1o` 解碼到這個程度就夠：`0e` ＝純量特徵、`1o` ＝向量特徵、128 ＝各自的通道數。

## 最小 code

**Level 1（pseudo-code）**：見核心概念的五步流程圖。

**Level 2a（三行推論，CPU 可跑）**

```python
from mace.calculators import mace_mp
from ase import build

atoms = build.molecule("H2O")
atoms.calc = mace_mp(model="small", device="cpu", default_dtype="float32")
print(atoms.get_potential_energy())   # eV；力用 atoms.get_forces()
```

**Level 2b（吸附能：對照你的 VASP 工作流）**

```python
from ase.build import fcc111, add_adsorbate
from ase.constraints import FixAtoms
from ase.optimize import BFGS
from mace.calculators import mace_mp

calc = mace_mp(model="medium-mpa-0", device="cpu", default_dtype="float32")

slab = fcc111("Pt", size=(3, 3, 4), vacuum=12.0)
slab.constraints = [FixAtoms(indices=[a.index for a in slab if a.tag > 2])]
slab.calc = calc
BFGS(slab, logfile=None).run(fmax=0.05)
e_slab = slab.get_potential_energy()

slab_h = slab.copy(); add_adsorbate(slab_h, "H", height=1.0, position="fcc")
slab_h.calc = calc
BFGS(slab_h, logfile=None).run(fmax=0.05)
e_slab_h = slab_h.get_potential_energy()

from ase import Atoms
h2 = Atoms("H2", positions=[[0,0,0],[0,0,0.74]]); h2.calc = calc
e_h2 = h2.get_potential_energy()

print("E_ads(H*) =", e_slab_h - e_slab - 0.5*e_h2, "eV   # 參考系：同一個 MACE 模型")
```

**Level 2c（微調指令骨架）**

```bash
mace_run_train \
  --name="hea_ft" \
  --foundation_model="medium-mpa-0" \
  --multiheads_finetuning=True \
  --train_file="train.extxyz" --valid_fraction=0.1 \
  --E0s="estimated" --device=cuda
```

**Level 3（real repo pointer）**

- 官方 4 份 Colab tutorial（快速上手／訓練評估／active learning＋fine-tuning／理論）：連結整理在 [repo-analysis/mace.md](../repo-analysis/mace.md)
- 入口檔案：`mace/calculators/`（你會天天碰）、`mace/cli/run_train.py`、`mace_eval_configs`、`mace_plot_train`
- 微調協議全文：mace-docs 的 finetuning 頁

## 常見誤解

- **「data augmentation 也能達到等變性。」** 只能近似。近似的對稱性在長時間 MD 裡會累積成漂移；內建等變性的誤差是零。
- **「MACE 是一個 foundation model。」** MACE 是**架構與框架**；MACE-MP-0、MPA-0 才是 foundation model（用 MACE 架構訓練出的具體權重）。
- **「下載得到＝可以商用。」** 一半的權重是 ASL。查表，再簽產學合約。
- **「微調只會更好。」** 沒有 replay 的微調會遺忘；參考能量（E0s）設錯的微調會把整個能量面平移到錯的地方。協議照抄官方，不要自由發揮。

## 小練習

1. 用 notebook 的學習曲線估算：force RMSE 要減半，資料大約要增加幾倍？（讀斜率。）
2. 打開 MACE README 的 foundation model 表：你的研究若進入產學合作，哪些模型還能用？哪些要換掉或另談授權？
3. （Colab）跑 Level 2b 的吸附能腳本，把 `medium-mpa-0` 換成 `small`，比較 E_ads 差多少。這個差異告訴你什麼？（提示：模型大小 vs 任務難度。）

## 延伸閱讀

- Batatia et al., *NeurIPS* (2022)：MACE 架構原文
- Batatia et al., *J. Chem. Phys.* **163**, 184110 (2025)：MACE-MP-0 foundation model 論文
- [repo-analysis/mace.md](../repo-analysis/mace.md)：安裝坑、版本時間線、與 HEA 研究的對接

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

- 「equivariance 是什麼，為什麼內建勝過資料增強。」（能用轉杯水講 60 秒。）
- 「higher-order message passing 解決什麼、讓 MACE 只需要兩輪的原因。」
- 「從我的 VASP 資料到能跑 MD 的 MACE 模型要五步，第四步驗證不可跳過。」
- 「MIT 與 ASL 的 foundation model 各有哪些，去哪裡查。」

---

### 本章配套

- notebook：[`notebooks/mace-minimal-demo.ipynb`](../../notebooks/mace-minimal-demo.ipynb) ✓ 已驗證（mock-first＋Colab 真跑開關）
- 投影片：[`slides/ch04-mace.html`](../../slides/ch04-mace.html)
- 練習題（含詳解）：[`exercises/ch04.md`](../../exercises/ch04.md)
