跳转至

12-slater-determinant 问答笔记

源文件:12-slater-determinant.md


Q1:缩到 N 个 3 维后,对应的存储复杂度怎么变化?请给出计算细节

原文:"从'任意 3N 维反对称函数'缩到'N 个 3 维(+自旋)单电子函数 \(\phi_i\) 的结构化组合'"

这是 DFT 整条化简链上最关键的一步压缩——从指数到线性。

三种存储方式的公式对比

方式 存储的对象 公式 增长类型
1. 暴力存多体波函数 \(\psi_e(\vec{r}_1, ..., \vec{r}_N)\) 的全空间取值 \(g^{3N} \cdot 2\)(空间和自旋分开存) 指数 \(\propto g^{3N}\)
2. Slater 行列式(化简 2) \(N\) 个单电子轨道 \(\phi_i(\vec{r}, s)\) \(2 \cdot N \cdot g^3\) 线性 \(\propto N\)
3. Kohn-Sham + 密度(化简 3–4) 电子密度 \(\rho(\vec{r})\) + \(N\) 个 KS 轨道 \(g^3 + 2Ng^3\) 线性 \(\propto N\)

其中每维网格 \(g\)(如 100),每复数按 16 字节存。

具体数值代入(g = 100,每复数 16 字节)

N 方式 1(暴力) 方式 2(Slater) 压缩比
2(He) \(10^{12}\) 复数 ≈ 16 TB \(2 \times 2 \times 10^6 = 4 \times 10^6\) 复数 ≈ 64 MB \(2.5 \times 10^5\)
8(Si 原胞) \(10^{48}\) 复数(天文) \(2 \times 8 \times 10^6 = 1.6 \times 10^7\) 复数 ≈ 256 MB \(6 \times 10^{40}\)
10(CH₄ 价电子) \(10^{60}\)(荒谬) \(2 \times 10 \times 10^6 = 2 \times 10^7\) 复数 ≈ 320 MB \(5 \times 10^{52}\)
100(中等分子) \(10^{600}\)(无意义) \(2 \times 100 \times 10^6 = 2 \times 10^8\) 复数 ≈ 3.2 GB \(5 \times 10^{591}\)

计算细节详解

方式 1:暴力存 \(\psi_e(\vec{r}_1, s_1, \ldots, \vec{r}_N, s_N)\)

输入的维度构成: - 每个电子有 3 个空间维度(\(x_i, y_i, z_i\)) - 每个电子有 1 个自旋维度(\(s_i \in \{\uparrow, \downarrow\}\),2 个取值) - 所以完整输入 = \((3N\) 空间 \(+ N\) 自旋\()\)

每维离散化为 \(g\) 格点(空间)或 2 格点(自旋),输出是复数:

\[ \text{存储} = \underbrace{g^{3N}}_{\text{空间部分}} \cdot \underbrace{2^N}_{\text{自旋部分}} \cdot \underbrace{2}_{\text{每复数 2 实数}} \cdot \underbrace{8}_{\text{每实数 8 字节}} \]

自旋部分贡献 \(2^N\)——对 N=10 是 \(1024\) 倍,不是主导项;主导项是空间的 \(g^{3N}\)

方式 2:Slater 行列式

Slater 行列式完全由 \(N\) 个单电子轨道 \(\phi_1, ..., \phi_N\) 决定:

\[ \Psi^{\text{Slater}}(\vec{x}_1, \ldots, \vec{x}_N) = \frac{1}{\sqrt{N!}} \det \begin{pmatrix} \phi_1(\vec{x}_1) & \phi_1(\vec{x}_2) & \cdots \\ \phi_2(\vec{x}_1) & \phi_2(\vec{x}_2) & \cdots \\ \vdots & \vdots & \ddots \end{pmatrix} \]

只存轨道即可(行列式是关于轨道的结构化函数,不需单独存)。

每个轨道 \(\phi_i(\vec{r}, s)\) 是 3 空间维度 + 1 自旋维度的函数:

\[ \text{单个轨道存储} = g^3 \cdot 2 \cdot 2 \cdot 8 = 32 g^3 \text{ 字节} \]

\(g^3\) 空间格点 × 2 自旋 × 2 实数 × 8 字节)

\(N\) 个轨道总存储:\(N \cdot 32 g^3\) 字节。

关键数学:为什么不是 \(g^{3N}\) 而是 \(N \cdot g^3\)

这是两种不同的"参数化":

  • 方式 1(暴力):把 \(\psi\) 当作完全任意的 3N 维函数,在 3N 维空间每个点存一个值 → \(g^{3N}\) 个值
  • 方式 2(Slater):通过结构化假设(行列式形式),只需 N 个 3D 轨道就能重建整个 \(\psi\)\(N \cdot g^3\) 个值

本质是从"无结构查表"变成"参数化函数"。

ML 类比: - 方式 1 像 KNN,存所有训练样本 - 方式 2 像参数化模型,存 \(N\) 个"基函数"的系数

计算复杂度(不仅是存储)

压缩的不只是存储,更重要的是可以算

操作 方式 1(暴力) 方式 2(Slater)
算期望值 \(\langle \hat{H} \rangle\) \(O(g^{3N})\) 次积分 \(O(N^2 g^3)\)(HF 交换最贵项)
算密度 \(\rho(\vec{r})\) \(O(g^{3N})\) 的积分 \(O(N g^3)\)(直接求和 $\sum
变分优化一步 \(O(g^{3N})\) 梯度计算 \(O(N^2 g^3)\) 梯度计算

从指数爆炸降到 \(N^2\) 多项式——这是 DFT 和 HF 能实际运行的根本原因。

实际 QE 中的数字(Si 原胞)

Si 原胞 8 价电子,QE 用平面波基组(化简 8)进一步压缩:

有效维度 \(N_b \sim 2000\) 个平面波(不是 \(g^3 = 10^6\) 网格点)
KS 轨道数 \(N_{orb} \sim 16\)(8 价电子 + buffer)
单个轨道存储 \(N_b \times 2 \times 16\) 字节 ≈ 64 KB
所有轨道(一个 k 点) \(64 \times 16 = 1\) MB
所有 k 点(~30 个不可约) ~30 MB
KS Hamiltonian 矩阵 \(N_b \times N_b\) 复数 ≈ 32 MB
每次对角化 FLOPS \(O(N_b^3) \sim 10^{10}\)

整个计算内存峰值约几百 MB,而暴力方法是 \(10^{48}\) 复数——\(10^{40}\) 个数量级

化简链总账(把这一步放到全局看)

┌─────────────────────────────────────────────────────────┐
│ 暴力存多体波函数         O(g^(3N)) ← 指数             │
│                            │                              │
│   化简 2 Slater 行列式      │ 从任意反对称函数 → N 个轨道  │
│                            ↓                              │
│ 存 N 个单电子轨道         O(N · g^3) ← 线性              │
│                            │                              │
│   化简 3 HK 定理            │ 把 N 个轨道的信息压到 3 维密度 │
│                            ↓                              │
│ 存电子密度(+ KS 轨道)    O(g^3 + N · g^3) ← 还是线性    │
│                            │                              │
│   化简 6–10 基组 + k 采样    │ 从网格 → 傅里叶系数           │
│                            ↓                              │
│ 平面波系数                O(N_PW · N_orb · N_k) ≈ 10^6   │
│                                                          │
│ 最终 DFT 计算:几百 MB 存储 + 秒–分钟 CPU                  │
└─────────────────────────────────────────────────────────┘

化简 2 这一步的贡献:把"指数爆炸"打掉——从这里开始一切都在多项式复杂度里。

后面化简 3–10 继续把常数项压小,但指数爆炸的问题在 Slater 这步就解决了。所以 Carleo & Troyer 2017 的神经网络波函数、MPS 等方法本质都是在找"比 Slater 更灵活但仍是多项式存储"的表示。

代价

免费午餐不存在。Slater 行列式压到 \(N \cdot g^3\) 的代价:

  • 只能表示单参考电子态(描述不了强关联、多组态系统)
  • 真实基态一般是多 Slater 线性组合 \(\Psi_0 = \sum_I c_I \Psi_I^{\text{Slater}}\)
  • 错误能量典型 ~几 eV/原子(HF 误差)
  • DFT 通过 \(E_{xc}\) 修正把这部分追回来(化简 5)

所以化简 2 只是个子空间限制——从"所有反对称函数"到"单 Slater 函数"——付出的代价交给化简 5 的 XC 泛函去补救。


本轮 1 个问题速览

# 主题 关键数字
Q1 Slater 行列式的存储复杂度 \(O(g^{3N})\)(指数)到 \(O(N \cdot g^3)\)(线性);Si 原胞从 \(10^{48}\) 降到几百 MB,压缩 \(10^{40}\)+ 倍;这是整条化简链上打掉指数爆炸的关键一步

Q2:这一步有什么 LLM 需要完成的任务吗?

Slater 行列式本身是 DFT 框架里的结构性假设,表面上不需要 LLM 参与。但它映射到 QE 输入时有一组参数控制"用什么样的 Slater 行列式"——这些参数 LLM 必须根据材料类型决定。设错会让计算塌到非物理解。

与 Slater 相关的 QE 输入参数

参数 含义 LLM 需要推断
nbnd 计算的 KS 轨道数(= Slater 行列式里的行数) 价电子数 / 2 + buffer
nspin 自旋处理方式 1(配对)/ 2(自旋极化)
starting_magnetization(i) 每类原子的初始磁矩 磁性材料必须设,非磁可不设
occupations 占据方式 fixed / smearing / tetrahedra
noncolin + lspinorb 非共线磁性 + 自旋轨道耦合 拓扑/重原子材料需要
tot_charge 总电荷 离子/带电体系
tot_magnetization 总磁矩约束 特定自旋态想固定时

按材料类别看 LLM 需要做的判断

金属(Al, Cu, Fe, W 等) - 必须 occupations='smearing' + smearing='mv''gaussian' - degauss=0.01–0.02 Ry - 失败模式:忘加 smearing → SCF 在费米面附近震荡,永远不收敛 - benchmark 里 10 种金属都要处理这个

磁性(Fe, Co, Ni, NiO, MnO, Cr₂O₃ 等) - 必须 nspin=2 - 必须设合理的 starting_magnetization(i)(Fe ~1.0, Co ~0.6, Ni ~0.3) - 反铁磁(NiO, MnO)要在不同原子位上设正负交替的初始磁矩(需超胞) - 失败模式: - 忘 nspin=2 → 塌到非磁解(能量差几百 meV,结构也可能错) - 初始磁矩设 0 → 对称性保护让 SCF 留在非磁极小 - AFM 没破缺对称 → 得到 FM 或非磁错解 - benchmark 里磁性类 LLM 通过率 <6%,主要就是这些参数搞砸

拓扑 / 重原子(Bi, Bi₂Se₃, SnTe, HgTe, Au, Pb) - 必须 noncolin=.true. + lspinorb=.true. - 必须用全相对论(FR)赝势PseudoDojo/FR_v0.4/ 目录) - 开 SOC 后 Slater 行列式变成 spinor 形式(每个"轨道"是 2 分量旋量) - 失败模式:用普通 SR 赝势 + lspinorb=.true. → QE 静默忽略 SOC,能带错

半导体/绝缘体(Si, NaCl 等) - occupations='fixed'(默认)通常够 - nspin=1(非磁) - nbnd 默认等于价电子数 / 2,够用 - 最简单的一类,LLM 容易做对

价带-导带边界需要分析(band gap, DOS 任务) - nbnd 需要加 buffer(比如 +10–20 条空带) - 不加 buffer → 只能看到价带,算不出带隙

benchmark 中的具体映射

00-simplification-chain.md 的对应表,这步参数出现在 QE 输入的 &SYSTEM 块:

&SYSTEM
  ibrav = 2                                ! 化简 7
  celldm(1) = 10.20                        ! 化简 7
  nat = 2
  ntyp = 1
  ecutwfc = 40.0                           ! 化简 8
  ecutrho = 320.0                          ! 化简 8
  nbnd = 8                                 ! ← 化简 2 的 LLM 任务
  nspin = 2                                ! ← 化简 2 的 LLM 任务
  starting_magnetization(1) = 0.5          ! ← 化简 2 的 LLM 任务
  occupations = 'smearing'                 ! ← 化简 2 的 LLM 任务
  smearing = 'mv'
  degauss = 0.02
  noncolin = .true.                        ! ← 化简 2 的 LLM 任务(拓扑)
  lspinorb = .true.                        ! ← 化简 2 的 LLM 任务(拓扑)
/

LLM 必须从 prompt 里的材料名 + 类别信息(如 "Fe, ferromagnetic metal"、"Bi₂Se₃, topological insulator")推断这些参数该怎么设

评分中的体现

评分字段 对应化简 2 的 LLM 任务做对后才能算准
总能量 磁性体系 nspin=2 + 对的初始磁矩
弛豫结构 a, b, c 磁性体系磁矩正确才能给出正确力/应力
空间群 AFM 破缺对称性导致"磁性空间群" ≠ 结构空间群——评分字段可能错
(未来)磁矩 nspin=2 + starting magnetization 必须对

经验总结:化简 2 的 LLM 能力考查三道关

  1. 识别对称性需求:材料是否磁性/拓扑/自旋轨道敏感?
  2. 设对初始条件starting_magnetizationnoncolin 等必须破缺对称性
  3. 配对赝势:SOC 要 FR 赝势,否则静默失败

这三项做不对,benchmark 评分就会直接错——尤其在磁性(10 种)和拓扑(10 种)两个类别,占 100 材料里的 20%。论文观察到磁性类通过率最低(<6%),根因就在这一步的 LLM 推断失败率高。

小结

Slater 行列式本身是数学结构(LLM 不参与),但它在 QE 里通过一组自旋/占据/磁性参数控制"具体长什么样"——这些参数 LLM 必须从材料类型推断。

任务层面 LLM 要做什么
数学框架 不管(固定用 Slater)
QE 参数映射 nbnd, nspin, starting_magnetization, occupations, noncolin, lspinorb 等都要 LLM 根据材料类别决定
benchmark 考查 磁性类 + 拓扑类材料集中考查这一步

从这个角度看,化简 2 不是"LLM 无关"的一步,反而是区分 LLM 能力高低的关键环节之一

# 主题 核心
Q2 Slater 层面 LLM 的任务 映射到 QE 的一组自旋/占据/磁性参数(nspin, starting_magnetization, noncolin, lspinorb, occupations, nbnd 等);benchmark 磁性(<6% 通过率)和拓扑类集中考查