导言
一、一张两千年没法兑现的支票
德谟克利特大概是历史上最早、也最笃定的“理论派”。他没见过原子,却坚信它存在:一块奶酪切一半、再切一半,总会切到切不动的那一刻吧?他给最后那一小粒起名 atomos,意思是“不可再分”。没有仪器,没有数据,全凭坐着想。可这个念头出奇地好用:只要承认世界由最小的颗粒拼成,东西的生灭就只是颗粒在重新排队,谁也不必再解释它们怎么凭空冒出来、又凭空消失。接下来近两千年,原子就像一张开出来却没人能兑现的支票——说不出多大、多重,也没有任何办法判断这套说法是对是错。
二、第一次看见:尺度往下挪了一格
打破僵局的是一块玻璃。1665 年,胡克把软木切成薄片塞到显微镜下,看见一格一格排得整整齐齐的小空腔,像修道院里僧侣住的小房间,于是顺手管它们叫 cell。没过多久,荷兰布商列文虎克凭业余爱好磨出了当时最好的透镜,在一滴池塘水里看到成群游来游去的“小动物”。他写信告诉英国皇家学会,对方将信将疑,专门派人去核实。真正被改变的是观念:看不见,不等于不存在。只是显微镜能给的只有轮廓、边界和表面——它能告诉你“那里有东西”,却说不出那是什么、按什么规矩摆放。就像隔着一层毛玻璃看人,知道屋里有人,却认不出是谁。偏偏这种“差一点就看清”的感觉,最能勾起科学家的好奇心。
三、会称重的原子:化学让看不见的东西变得可以算
接下来的突破靠的不是眼睛,而是天平。道尔顿是一位中学老师,还是个色盲——他甚至把自己的色盲写成了论文。他一个原子也没见过,却注意到同样两种元素组成不同化合物时,质量比总是简单的整数比:等量的碳,在二氧化碳里结合的氧恰好是一氧化碳里的两倍。整数背后,只能是一个个完整的“份儿”在参与反应。门捷列夫更大胆:他把已知元素按性质排成一张表,还故意留出几个空位,宣称那里住着尚未露面的元素,连性质都估好了。几年后镓被发现,发现者测出的密度和预言对不上,门捷列夫居然回信说“你再测一遍”——重测之后,数值果然向他的预言靠拢。一张表,第一次具备了预言能力。可到这一步,人们仍然不知道原子内部长什么样,更不知道这些内部结构如何决定一块晶体硬不硬、导不导电。
四、从形状到规律:电子、原子核与量子力学
十九世纪末到二十世纪初,微观世界迎来了一场连续剧。汤姆孙从阴极射线里揪出了电子;卢瑟福用 α 粒子轰击金箔,绝大多数粒子直穿而过,却有极少数被弹了回来——他形容这就像朝一张纸巾打出一发炮弹,炮弹却反弹回来打中了自己。原子中心有个又小又重的核,就此确定。玻尔随后给出电子分层的图像,量子力学把电子的状态写成了方程。薛定谔方程原则上藏着全部答案:给定原子核的位置,就能解出体系的能量,而能量决定结构稳不稳定、表现出什么性质。问题在于解不动。1929 年狄拉克说得很直白:化学所需的物理定律已经完全知道了,麻烦只在于方程太复杂,根本解不出来。原理清清楚楚,计算寸步难行——这道裂缝,在此后一百年里一直是这个领域的头号难题。
几乎同一时期,另一条路让结构变成了可以记录的数据。劳厄和布拉格父子把 X 射线打进晶体,从衍射斑点的位置和强度反推出内部的周期性排列(小布拉格拿诺贝尔奖时才 25 岁)。人第一次在原子尺度上把微观结构写成了几何:晶胞的边长与夹角,原子在晶胞中的坐标。这些数字可以抄下来、寄出去,交给别人复核——科学从此有了一种新的“通用语”。
五、指着一张图说“这是一个原子”
再往后,电子显微镜和扫描探针显微镜让单个原子“现了形”。1989 年,IBM 的研究者用 35 个氙原子在金属表面拼出了公司的三个字母——大概是史上最小的 logo。人不仅知道晶体里有格子,还能指着图上的一个亮点说出它是哪种元素,看清台阶、空位和杂质原子各自蹲在哪儿。然而“看见”和“算出”终究是两码事。一张原子分辨的照片不会自己开口告诉你这块材料的带隙多大、硬度多高、加热后会不会分解。想回答这些问题,还得回到能量上去。
六、结构到性质:计算成了一种实验
密度泛函理论(DFT)找到了一条绕路:与其追踪每一个电子的去向,不如只关心电子在空间里分布得有多密——好比不必记住全班每个人坐在哪儿,只要知道哪片区域坐得满。于是“给定原子位置,求能量与受力”终于成了计算机能跑完的任务。分子动力学接着让原子沿着这张能量地形动起来,扩散、热膨胀、相变都能在屏幕上“做实验”。“结构决定性质”从一句口号变成一条走得通的流水线。材料基因组计划和高通量筛选又把它放大:先在计算机里海选成千上万个候选结构,只把少数有希望的送进实验室。代价也随之浮出水面:精确计算很贵,一个体系动辄吃掉几千核时;泛函、基组、收敛标准只要改动一处,结果就带上不同的系统偏差,两批数据随手混用,就像把摄氏度和华氏度的读数直接取平均。从这以后,数据是否可比,和算法本身一样重要。
七、学会外推:让模型来“猜”
算过的结构越攒越多,公开数据库的条目涨到几十万乃至上百万,一个诱人的念头冒了出来:既然这些数据背后有规律,能不能让计算机“见多识广”之后,直接猜出那些还没算过、更没合成过的结构?机器学习最早以“描述符加统计模型”的形式进入化学:人把分子或晶体手工编码成一串数字,再拟合它和性质之间的关系。图神经网络换了个思路——让每个原子直接和邻居“聊天”,在一轮轮消息传递中更新自己的表示,结构信息交给图本身来承载。等变模型又补上了物理的基本礼仪:把整个结构平移或转个身,能量不该变,每个原子受的力得跟着一起转;一个模型要是连这都不懂,就像一个把地图倒过来就不认路的向导。如今这类模型已经能预测能量、原子力、形成能、稳定性以及部分电子与力学性质,不少任务上误差逼近计算本身的精度,速度却快了几个数量级。它们的角色很明确:做海选的初审评委,把真正值得下注的少数交给更贵的计算和实验。东西还没合成出来,它的性格已经可以先摸个大概。
八、这门课怎么走
从德谟克利特的奶酪到今天的等变网络,这条路走了两千多年。这门课要带你上手的,是其中今天仍在一线使用的那一段:化学、材料和人工智能各取一块,拼成一套能真正动手的工作流。我假设你有一些高中化学底子,认得原子、周期表和化学键——忘了也没关系,用到时会带你复习;也假设你在人工智能这边完全从零开始,没写过模型,甚至和 Python 还不太熟。这门课采用 Agent 辅助的工作方式:你负责提出问题、提供材料、判断结果,写代码、跑代码、改代码的体力活交给 Agent。科学概念和数学会在用到时讲清楚;编程工具的目标不是让你背语法,而是让你看懂工作过程、有能力检查产物。
路线是这样的。第零部分先把装备配齐:认识 ChemDraw、VESTA、RDKit,搞懂 Cursor、Codex 与 Agent 怎么分工,再看 PPT、SVG、LaTeX 如何帮你画图和写论文;补上单位和复现的基本功,养成用 AI 加速学习、执行与核查的日常习惯。第一部分从化学出发:用 ChemDraw 画出分子与反应,打好晶体学基础后用 VESTA 看懂晶胞、原子坐标和周期性,再把结构写成数据,完成你的第一个经典机器学习项目。第二部分请出 DFT,讲清能量和标签从哪里来:先读懂计算输出,再做结构弛豫、比较数据、判断稳定性。第三部分让原子动起来,由计算成本引出 PyTorch、神经网络与机器学习势,并在微调之前先把数据划分和验收标准定死。之后深入评测,学习晶体结构搜索与生成,最后把筛选和主动学习串成一条完整的研究流程。等走完这一程,希望这支从德谟克利特排起的长队里,也能出现你的名字。
0.1 常用科研工具与分工
先知道任务该交给谁
科研工具像课程小组的分工:有人处理结构,有人做计算,有人画图排版。先学会选工具、交代任务和检查产物,具体操作用到时再学。 本课由 AI 协助执行,不要求手写代码。
一、化学侧:三个工具,各司其职
| 工具 | 主要负责什么 | 什么时候用 |
|---|---|---|
| ChemDraw | 画二维分子结构式、反应式与条件标注 | 在报告或论文里表达分子连接、立体化学和反应 |
| VESTA | 查看三维晶体、晶胞、配位与电子密度等数据 | 打开 CIF、POSCAR 等文件,观察结构并导出结构图 |
| RDKit | 批量读写分子、计算描述符、搜索子结构、生成分子图 | 让 AI 处理一批 SMILES/SDF,交付性质表和带编号的分子网格图 |
ChemDraw 像精心做一张海报;VESTA 像进入游戏场景转动视角;RDKit 像给全班批量生成资料卡,调用交给 Agent 即可。
你仍要核对:ChemDraw 的键、电荷和立体信息;VESTA 的晶胞与成键显示设置;RDKit 的失败记录和处理规则。图画出来了,不等于结构或结论正确。
二、AI 侧:Cursor 与 Codex
| 工具或概念 | 本课需要知道什么 |
|---|---|
| Cursor | 结合项目文件与 Agent 对话,查看文件修改、运行反馈和产物 |
| Codex | 围绕任务读取材料、处理文件、执行分析、排错并整理结果 |
| Agent | 围绕目标调用工具、根据反馈继续推进任务的系统 |
| Harness | 连接模型、上下文和工具,组织执行、状态与权限的配套系统 |
两者用途有重叠,先熟悉一个即可。交代任务时说清:用哪些材料、完成什么、保留什么、交付什么、怎样验收。 代码交给 AI,问题和结果由你判断。
能处理文件,不代表能点击 ChemDraw、VESTA 或 PPT 的界面,这取决于接入了哪些工具。无需自己搭建 harness。
三、论文侧:PPT、SVG 与 LaTeX
| 工具或格式 | 分工 |
|---|---|
| PPT | 画流程图、方法示意图,组合结构图与数据图;保留可编辑的 PPTX |
| SVG | 矢量图格式,保存可编辑的线条、形状和文字;可让 AI 生成,用 Inkscape 精修 |
| LaTeX | 排版正文、公式、图表与引用,编译为 PDF;Overleaf 是常用在线平台 |
SVG 是格式不是软件;嵌入其中的位图不会因此变清晰。数据曲线应从真实数据生成再放进 PPT。提交前检查 PDF 的文字、图号、引用与清晰度,并保存图源。
四、还值得认识的工具
- Zotero:管理论文、PDF 和引用,建议尽早使用。
- Excel / Matplotlib / Origin:查看数据、抽查数值、生成统计图,按习惯选择。
- Inkscape:编辑 SVG、对齐元素、统一字体和导出图稿。
- ASE / pymatgen:处理原子与晶体结构,结构数据章节再用。
- OVITO:查看模拟轨迹与结构变化,分子动力学章节再用。
- Git:记录和比较项目修改,像带说明的游戏存档;可由 Agent 操作。
不必全部安装。先选一个 AI 工作台,配好当前任务的专业工具,再逐步补齐。
五、把工具连起来
做分子分析时:AI 调用 RDKit 处理分子表并出统计图,重要分子用 ChemDraw 表达,PPT / Inkscape 组合图版,放进 LaTeX,用 Zotero 管引用。晶体项目按需用 VESTA,不必强行用齐。
下载 第零部分练习包,在 AI 工作台中打开,交代:
请阅读 README,使用已有脚本分析教学数据。保留原始文件,另存图片、统计结果和运行记录,说明我应怎样抽查;无法执行时请说明原因。
练习数据为人工构造的 E(r) = 2(r − 1.1)²,r 用 Å,E 用 eV/教学构型,系数单位 eV/Ų,不是实验或 DFT 结果。核对 10 条记录、均值 0.1700 eV、最小值 0、最大值 0.5000 eV,再检查图轴和记录。
0.2 单位与量纲
数字后面的单位,是这条数据的一部分
同学说“我考了 4”,你无法判断好坏:四分制绩点、百分制,还是一道题的得分?数字离开了规则,就失去了可比较的含义。
原子计算也一样。文件里写着 energy = -12.3,还需要知道:什么单位、哪个体系、总能量还是每原子能量、采用什么参考与方法。本节解决单位与计数口径,计算设置和稳定性判据留到 DFT 部分。
目标是会看单位、会换单位、会判断运算是否合适,并能发现明显的数量级错误。 常数不必背,知道该查哪一项就行。
一、物理量、数值、单位与量纲
物理量 = 数值 × 单位。 500 m 和 0.5 km 是同一段路。量纲表示它属于哪类量:m、nm、Å 都是长度,s、ms、fs 都是时间。
游戏里“移动速度”和“攻击力”都是 100,加起来得 200 毫无意义。只有量纲和对象含义都合适,两个量才能相加或比较:5 m 与 20 cm 统一单位后可以相加,5 m 与 20 s 不行。
| 量 | 本课常见单位 | 你要同时确认的含义 |
|---|---|---|
| 长度 | Å、nm、m | 键长、坐标、晶胞边长还是位移 |
| 时间 | fs、ps、s | 单个积分步长还是整段模拟时长 |
| 能量 | eV、meV、Hartree、kJ/mol | 总能、能量差,还是按粒子数归一化的量 |
| 力 | eV/Å、N | 哪个原子、哪个方向的受力 |
| 应力、压强 | eV/ų、GPa | 分量、符号约定与计算程序定义 |
| 温度 | K、°C | 绝对温度还是温度变化量 |
量纲相同只是第一步。原子数不同的体系,总能量即使都是 eV,也不能直接拿来判断谁更稳定。
二、科学计数法
原子尺度的数很小,一串 0 容易看错。0.000000001 m = 10⁻⁹ m = 1 nm。换刻度就像缩放校园地图,物体本身没变。
Agent 的输出里常见 1e-3,即 1 × 10⁻³ = 0.001。这里的 e 是数字写法,和 eV 无关;负指数表示小数,不表示负数。
三、Å、nm 与原子尺度的长度
Å 读作“埃”,是结构文件中常见的长度单位:1 Å = 10⁻¹⁰ m;1 nm = 10 Å,所以 2.5 Å ÷ 10 = 0.25 nm。换成更大的刻度,份数更少——先想方向再套公式,就不容易乘反。
常见化学键约 1–3 Å,这只是直觉参考,不是硬阈值。若某个距离变成 15 Å 或 0.15 Å,先查是不是把 nm 和 Å 搞混了。
分数坐标中的 0.5 表示半个晶格向量,而不是 0.5 Å,要结合晶胞才能变成实际长度。打开坐标文件,先确认格式。
四、eV、meV 与 Hartree
eV 是一个元电荷跨过 1 V 电势差对应的能量:1 eV = 1.602176634 × 10⁻¹⁹ J = 1000 meV。
Hartree(Ha、Eₕ)常见于量子化学:1 Ha ≈ 27.211386 eV,例如 0.1 Ha ≈ 2.721139 eV ≈ 2721.139 meV。让 Agent 给出换算系数与来源,你抽查一个数即可。
误差写成 20 meV/atom 即 0.020 eV/atom,不能直接和整个体系的误差比较;/atom 和单位本身同样重要。
五、为什么 kJ/mol 要多想一步
“每人花 10 元”和“全班花 10 元”口径不同。1 mol 含 6.02214076 × 10²³ 个指定单元——原子、分子或一次反应,必须说清是哪一种。
1 eV/单元 ↔ 96.485332… kJ/mol(相同单元)。 这一步既换了能量单位,又从一个单元扩展到一摩尔。例如每个反应单元能量差 0.05 eV,对应 0.05 × 96.485332… ≈ 4.8243 kJ/mol。反过来就除以 96.485332…。“一个晶胞”“一个原子”“一个化学式单元”不能混用;比较论文数值前,先核对反应式与计量系数。
六、总量与平均量
两个班总分 3000 和 4000,不能直接说后者人均更高。4 个原子的构型总能 −20 eV,按原子归一化是 −20 eV ÷ 4 = −5 eV/atom;能否与另一体系比较,还取决于组成、参考态和计算设置。
练习数据中的 energy_ev 是每个教学构型的能量。不能为了数字好看就擅自改成每原子能量,否则脚本和图标签都要跟着改。
能量的零点也是约定,就像地图可以把出生点或海平面记为 0。负能量本身不等于稳定,比较时要用一致的参照和方法,并考虑竞争相。
七、力、应力与时间:用单位检查公式
力是能量随位置的变化率,单位为 eV/Å:1 eV/Å = 1.602176634 nN。应力是能量/体积:1 eV/ų ≈ 160.217662 GPa。力除以长度不是应力——这类错误不用算数就能查出来。
公式 E(r) = a(r − r₀)² 中 r 用 Å、E 用 eV,a 就必须是 eV/Ų。不懂整个模型,也能检查单位是否自洽。
1 fs = 10⁻¹⁵ s,1 ps = 1000 fs。 步长 1 fs 跑 1000 步是 1 ps,就像一帧时长乘帧数才是整局时长。这只是换算示例,合适步长取决于体系和算法。
温度是加法换算:T(K) = t(°C) + 273.15,26 °C 即 299.15 K;但升高 1 °C 就是升高 1 K。代入需要绝对温度的公式时用 K。
八、程序不会替你理解单位
程序只认数字:0.1 Ha 加 0.2 eV 也能算出一个看似正常的数。要求 Agent 列名标明单位(如 energy_ev),图轴和记录写出单位,跨文件转换时保留原始列并说明每次转换。你负责检查这些说明与物理含义是否一致。
请核对这份数据各列的物理量、单位与计数口径,标记信息缺失的列。需要换算时保留原始数据,另存转换结果,并列出换算关系与一个抽查示例。不要把不同口径的量直接混合比较。
模型常做的“减均值、除标准差”叫标准化,参数来自数据,与 Å 换 nm 不同。第一部分会详讲,现在别把缩放后的数字当成新单位。
九、换算速查与交作业前的检查
| 从什么到什么 | 换算操作 |
|---|---|
| Å → nm | 除以 10 |
| eV → meV | 乘以 1000 |
| Ha → eV | 乘以约 27.211386 |
| eV/指定单元 → kJ/mol 相同单元 | 乘以约 96.485332 |
| 总能 eV → 每原子能量 eV/atom | 除以原子数,并保留体系定义 |
| eV/Å → nN | 乘以 1.602176634 |
| eV/ų → GPa | 乘以约 160.217662 |
| fs → ps | 除以 1000 |
| °C → K | 加上 273.15 |
交出结果前问四件事:哪个物理量?哪个单位?哪个计数口径?数量级是否合理?
十、练习与自查
- 将 2.5 Å 换成 nm,将 25 meV/atom 换成 eV/atom。
- 某个明确定义的反应单元能量差为 0.05 eV,换成每摩尔同一反应单元的 kJ/mol。
- 一个有 8 个原子的构型总能量为 −24 eV。每原子能量是多少?仅凭这个负值能判断它稳定吗?
- 力为 0.2 eV/Å,换成 nN;步长 0.5 fs、运行 2000 步,对应多少 ps?
- 某同学把坐标从 Å 换成 nm,却保留“对坐标求导得到的力”的原数值和原单位。该检查什么?
完成后再看参考结果
第一题:0.25 nm,0.025 eV/atom。第二题:约 4.8243 kJ/mol。第三题:−3 eV/atom;仅凭负值无法判断稳定性,需要一致的参考态、组成与计算方法,并进一步应用稳定性判据。第四题:约 0.320435 nN,1 ps。第五题:力是能量对位置的负导数,长度单位改变时力的数值表示也要相应转换;同一个力的数值以 eV/nm 表示时,是以 eV/Å 表示时的 10 倍。
常数可在 NIST CODATA 基本物理常数数据库 查阅。本页 eV 与阿伏伽德罗常数采用 SI 定义值,Hartree 换算保留了入门所需的近似精度。
0.3 可复现的习惯
Agent 执行任务,结果也要能追溯
同学交来一张漂亮的图,却没留原始表格和处理过程,下一位就很难接手。让 Agent 完成计算后,同样要留下足够信息,让自己或别人能重跑、能检查。
这像保存游戏进度:除了分数,还要知道关卡、版本、角色配置和进行到了哪一步。本节不要求手写程序或记 Git 命令,重点是让 Agent 留下可核查、可交接的工作记录。
一、给资料与结果安排固定位置
“最终版”“最终版2”“真的最终版”说不清每份结果用了哪组数据。让 Agent 按用途整理:
| 位置 | 内容 | 校园中的对应经验 |
|---|---|---|
| README | 任务说明、数据来源与复跑办法 | 小组作业的交接说明 |
| data/raw | 原始数据 | 老师发下来的原始材料 |
| scripts | 实际执行的程序 | 保留下来的解题步骤 |
| configs | 本次运行的设置 | 这次实验采用的条件 |
| runs | 每次运行的结果与记录 | 每次独立编号的实验报告 |
原始数据保留原样,清洗后的数据另存并写清规则。每次运行用新目录,避免覆盖;具体参数要存进文件,不能只靠文件夹名。
请按输入、程序、配置和运行结果组织这个练习。保留原始数据;每次运行独立命名。写一份简短说明,让接手的人知道从哪里开始、如何复跑、去哪里看结果。
二、参数:写下“这次怎么做的”
练习包的配置控制三个设置:直方图分组数 5,随机抽查样本数 3,随机种子 42。修改时说清只改哪一项,例如“只把分组数从 5 改成 10,其余不变,另存结果”,再查运行记录确认。一次改很多项,结果变了也说不清原因。
三、随机种子:相同起点,不等于所有条件相同
游戏的世界种子配合同样的生成规则,能重现同一张地图;程序里的伪随机数也由种子决定初始状态。本练习中种子只决定抽查哪几条记录,十条数据的均值不应随种子变化——可以让 Agent 分别用 42 和 7 运行对比。
但游戏更新会改生成规则,软件版本、算法、硬件和并行方式同样会影响计算。只记住“seed = 42”,不能保证每台机器都得到逐位相同的结果;涉及模型训练时,还要考虑多次运行之间的差异。
四、环境、代码与 Agent 的记录
让 Agent 记录实际使用的 Python、依赖包、操作系统和复跑方式,并区分“安装清单”与“实际装上的版本”。
Git 是带修改说明的作业历史。你不用记命令,可以让 Agent 展示改动差异并按约定保存版本。Git 提交不等于异地备份,重要数据还要另有可靠的存放处。
同一句话交给不同模型,未必生成同样的程序,所以要保存实际执行的脚本与配置,而不只是聊天记录。若要比较 Agent 本身的表现,还应记录模型标识、工作台版本、工具条件和关键任务说明。
请保存实际环境与程序版本、此次任务说明、输入来源、参数和运行结果。给出已改动文件的简短说明;如果某项版本信息无法确定,请明确记录,不要猜测。
五、一次运行应留下什么
| 要保存的内容 | 本练习里的产物 | 你可以检查什么 |
|---|---|---|
| 输入与来源 | input.csv、教学数据说明 | 是否仍是原来的十行,有没有漏掉样本 |
| 程序与参数 | 脚本副本、metadata.json 内的配置 | 实际运行的版本是否对应此次要求 |
| 单位与口径 | Å、eV/教学构型 | 是否在比较同一种量 |
| 软件与平台 | 环境版本记录 | 别人能否准备相应的运行条件 |
| 数值与图片 | metrics.json、直方图 | 数字是否可核对,图轴是否清楚 |
| 过程与交接 | 运行说明、完成状态、错误记录 | 接下来应该复跑、修复还是继续下一步 |
记录里的 SHA-256 摘要能判断文件字节是否改变,但不能证明数据含义正确;仅仅换行方式不同,摘要也会变。
六、练习:让 Agent 复跑,再检查差异
继续使用 0.1 的练习包:
请用同一输入、配置和环境,在两个不同的运行目录中各执行一次分析。比较统计结果、输入摘要、程序与参数。时间戳可以不同,请指出哪些字段应一致。随后只把直方图分组数从 5 改为 10,再运行一次,说明哪些结果变化、哪些保持不变。保留每次的产物。
预期:相同条件下统计结果一致;改分组数后直方图区间改变,样本数和平均能量仍是 10 与 0.1700 eV。再把种子改为 7 另存一次,抽查样本会变,均值不变。本练习没有模型训练,也没有训练集与测试集划分。
简单脚本可以直接核对数值;复杂计算要事先约定可接受误差并说明理由,不能看到差异后再随意放宽。
七、中断后,先查状态再继续
有结果目录不代表任务完成,脚本中途失败可能只留下部分文件。让 Agent 检查预期产物是否齐全,记录报错和已完成的步骤,再决定怎样继续。
这个练习很短,直接用新目录重跑即可,它没有断点续跑能力。工作台能恢复对话,不等于程序能从中断处恢复;长任务需要专门保存进度,第六部分会讲。
请根据已保存的文件确认当前状态,列出完成、失败和未开始的步骤。保留旧结果与错误信息,为下一次继续执行写清输入位置、当前参数和下一步操作。
八、把练习交给下一位同学
请同学或一个新的 Agent 会话只依赖项目文件重跑一次;或者隔一天自己再打开,看还找不找得到输入、结果和说明。如果回答要靠“我记得上次好像是这样”,就让 Agent 把缺失的信息补进记录。
一个合格的本节交付应是什么样
清楚的任务与复跑说明;保留原样的输入;实际执行的程序、参数和环境信息;独立命名的运行结果;一份比较结果与完成状态的说明。学生负责检查这些证据和科学含义,具体命令与代码可以由 Agent 执行和维护。
0.4 用 AI 加速学习与研究的习惯
把 AI 用成每天都能配合的学习伙伴
前三节准备了工具分工、单位口径和运行记录。现在把它们连成日常习惯:自己先理解任务,再用 AI 加速学习与执行,最后用证据检查结果。
靠谱的小组合作不是一个人做完、其他人只收文件。用 AI 也一样:具体操作可以交给它,但你要能提出问题、看懂结果、决定下一步。本节不考语法,完成标准是:面对新任务,你能说清自己知道什么、需要 AI 帮什么,以及怎样判断协作真的完成了。
一、开始前,先补到“能判断”的程度
玩新游戏不必背完装备数值,但要知道胜利条件和地图目标。以“分析一份能量数据”为例,开始前应知道:每行代表什么对象;能量是总能还是每原子;单位是什么;想比较分布、平均值还是稳定性;数据来自实验、计算还是教学构造。不懂的部分,先请 AI 用小例子解释。
我要分析这份能量数据。请先列出完成任务必须理解的三个概念,用校园或游戏里的例子解释,再回到这些概念在数据中的准确含义。每个概念给一道小题,先让我回答,再针对我的理解补充。
检验方法:不用 AI 的原句解释一遍,例如“我比较的是同一口径的能量分布,图不能证明材料可合成”。能说清这些,比复制一段漂亮定义有用得多。
二、读到陌生知识:解释、追问、复述
遇到“形成能”“分布外”“等变性”等术语,让 AI 先给直观解释,再给准确说法,最后指出类比在哪里不成立。比如用人均分理解归一化很方便,但不能推出“每原子能量越低就越稳定”。
- 贴出正在读的段落或指明文件位置,请 AI 围绕这份材料解释。
- 要一个足够小、能手工检查的例子。
- 针对不懂的那一步追问,而不是反复要求“再详细一点”。
- 用自己的话复述,请 AI 指出遗漏和错误。
AI 也会解释错。涉及定义、数据或论文结论时,回到教材、原文或官方资料核对,并要求它区分原文内容与自己的推断。
三、接到任务,先写一张任务卡
“帮我把实验做好”没说从哪开始、到哪结束。一张简短的任务卡能省去许多返工:
| 项目 | 要说明什么 | 本课的小例子 |
|---|---|---|
| 目的 | 想回答的问题 | 看十条教学能量的分布 |
| 输入 | 文件、来源、单位和口径 | 练习包的 CSV,eV/教学构型 |
| 已知与未知 | 哪些已确定,哪些需查明 | 知道列名;需检查缺失值 |
| 约束 | 可改变与需保留的条件 | 原始数据保留,结果另存 |
| 产物 | 最终需要什么 | 图、统计表、运行记录 |
| 验收 | 怎样确认完成 | 样本数正确、单位清楚、可以复跑 |
把任务说完整,比加上“你是顶级专家”“务必完美”更有用。Agent 能读的文件直接给路径,它访问不到的资料先提供内容。
四、做新流程,先跑一个小任务
就像先熟悉副本机制再挑战高难度,计算任务也先用几个样本跑通,确认理解一致再扩大范围。
先用少量样本把流程跑通,展示每一步读入什么、产生什么,以及一个可核对的结果。请估计扩大规模需要的时间与资源,并标明哪些只是估计。小任务检查通过后,再按约定范围继续。
检查点放在成本高、容易误解的环节,例如先确认一个结构文件读对了、单位正确,再处理整个数据库。小任务跑通只说明流程能执行,不说明方法有效——“程序能运行”和“科学结论成立”要分开判断。
五、遇到问题,把现场交给 AI
游戏掉线只说“进不去”很难排查。求助时说清:原本想做什么、实际发生什么、卡在哪一步、用了哪个输入、有什么报错。
目标是生成能量分布图,但这次运行只留下了一个空目录。请先检查实际日志、输入路径和环境,解释失败发生在哪一步,再修复并重新执行。保留旧记录,说明修复后检查了什么。
你不必亲手改脚本,但要能分辨错误类型:文件没找到、依赖不匹配、数据缺失、单位不清,还是算法本身不合适。AI 反复尝试同一种修复时,让它先总结已试过的办法和未验证的假设。
六、收到结果,固定问三个问题
第一,做的是我要求的事吗? 核对数据、样本范围、单位、比较对象与输出形式。
第二,有可检查的依据吗? 打开真实文件,抽查原始记录、图轴和统计值,重要数值用独立方法复核;来源性陈述要回到原文确认。
第三,结论超出证据了吗? 画出分布不等于训练好了模型,已有数据上误差低不等于能预测所有新材料。让 AI 说明本次结果支持什么、还没验证什么,你再判断。
熟练之后,这三问会成为看结果时的自然动作。
七、结束时,留下下次能用的东西
同一个问题下次还从零描述,是最浪费的时间。让 Agent 把验证过的步骤、数据位置、常见错误和当前状态写进项目说明。
请整理这次任务:目标、实际输入、采取的方法、结果位置、已完成的检查、遇到的问题与解决办法,以及下一步。把确认过的信息写入项目说明,把仍不确定的内容单独标明。
某类任务反复出现后,再把稳定步骤整理成模板或 skill。先有真实经验再总结,别一开始就搭一套自己都用不明白的流程。
八、怎样知道 AI 真的让你更快了
“生成了很多文字”不等于“推进了任务”。更实际的指标是:多久得到第一个可核查结果,返工是否减少,下次能否复用,自己是否更能解释结果。
每周留一条简短记录:用 AI 解决了什么问题,哪次输出需要纠正,积累了什么可复用材料,还有哪个概念要补课。熟悉的任务可以多交给 Agent;遇到新体系、新指标或意外结果,就多抽查、多补背景。自动化程度随理解和证据提高,而不是看回答有多自信。
九、综合练习:完成一个小任务,也讲清楚它
继续使用第零部分练习包:
- 先用自己的话解释数据的三列、单位和来源,写出这次想回答的问题。
- 给 Agent 一张任务卡,请它完成统计、画图和记录。
- 自己打开产物,抽查行数和数值,指出图能回答与不能回答的问题。
- 用自然语言要求改变一个设置,比较结果,并让 Agent 留下交接说明。
- 关掉对话,向同学用两分钟介绍输入、方法、结果和依据。可以看自己的记录,不必背诵代码。
这节最重要的验收标准
你知道自己提出了什么问题,能够解释输入与单位,找得到真实结果和记录,能够发现至少一种可能的错误,并说明下一步为什么值得做。Agent 可以承担全部具体代码操作;这些理解与判断,是学生需要通过一次次实践积累的能力。
后面每一章都重复这套习惯:掌握够用的基础,用 AI 加速解释和执行,用证据检查结果,把有效经验存下来。工具会变,这套协作方式会一直有用。
1.1 化学基础
上一节,我们练习了先理解任务、再用 AI 执行、最后核查结果。现在把这套习惯用到化学上:在请 AI 画分子、整理结构或预测性质之前,先弄清楚图里的原子、连线和能量分别代表什么。
本节围绕三个问题展开:物质由什么组成,原子怎样连接,结构为什么会变化。 学完后,你应能检查一个简单分子是否画得合理,并解释为什么“能量更低”和“反应更快”是两件需要分别判断的事。
一、从原子开始:先分清元素与电荷
原子由原子核和电子组成。原子核里的质子带正电,中子不带电;核外电子带负电。质子数决定元素种类:6 个质子对应碳,8 个质子对应氧。相同元素的原子如果中子数不同,就属于不同的同位素。
可以借用校园学籍来记忆:更换座位不会让你换一个专业。同样,一个原子得到或失去电子,并不会改变它属于哪种元素;不过,它的电荷会改变。这个类比只帮助区分“元素身份”和“带电状态”,并不解释电子怎样运动。
当质子数与电子数相等时,原子呈电中性;失去电子后带正电,得到电子后带负电,这样的带电粒子叫作离子。例如,Na⁺ 仍是钠,但比中性钠原子少一个电子。整个分子也可以带电,例如 NH₄⁺。
接下来要关心电子,因为成键主要涉及价电子。对于本节常见的主族元素,可以先把价电子理解为参与成键的最外层电子。电子的状态需要用量子力学描述;入门时先掌握电子数、电荷和成键关系,具体计算留到 DFT 部分。
二、从电子到化学键:原子为什么连在一起
知道有哪些原子之后,还要解释它们为什么能形成结构。当原子靠近时,电子与原子核之间的吸引,以及电子之间、原子核之间的排斥会共同影响能量。若结合后的状态比相应的分离状态能量更低,就可能形成束缚状态。
这有点像组队打副本:了解队员名单之后,还得看他们怎样配合。不过,原子没有组队意愿,是否成键由物理相互作用决定。下面三种成键图像,适合用来建立最初的认识。
| 成键图像 | 怎样理解 | 例子 |
|---|---|---|
| 共价键 | 原子之间共享电子,入门时常用共享电子对来表示 | 水中的 O—H 键 |
| 离子键 | 正、负离子之间的静电作用是主要特征 | 氯化钠晶体 |
| 金属键 | 价电子在许多原子之间离域,参与整体结合 | 铜、铝等金属 |
实际成键可以兼有不同特征,不必把每种材料硬塞进一个完全独立的类别。例如,水中的 O—H 键是共价键,但氧吸引成键电子的能力更强,因此电子分布并不均匀,氧端偏负、氢端偏正。这叫键的极性,其中的部分电荷不等于完整的离子电荷。
由此还能理解水分子之间的氢键:一个水分子的氢端,可以与另一个水分子的氧形成特定的吸引作用。这里要区分两个层次——水分子内部的 O—H 共价键,以及水分子之间的氢键。就像课程小组内的分工和不同小组间的合作,讨论前先说明关系发生在哪一层。
三、从化学键到结构式:数量相同,连接可以不同
有了成键的概念,就能开始读结构式。分子式告诉我们有什么、各有多少;结构式进一步告诉我们谁与谁相连。 例如,C₂H₆O 可以对应乙醇 CH₃—CH₂—OH,也可以对应二甲醚 CH₃—O—CH₃。两者的原子数量相同,连接关系却不同,因此是不同的物质,这种关系叫作构造异构。
这像同一批同学参加小组作业:名单相同,并不意味着分组关系相同。因此,把分子交给 AI 时,只给分子式有时不够,还需要明确连接关系。
为了检查这些连接,可以先记住常见中性小分子中的几条规律:H 通常形成 1 个键,C 通常形成 4 个键,N 通常形成 3 个键,O 通常形成 2 个键。这里计入键级:单键计 1,双键计 2,三键计 3。例如,O=C=O 中,碳连接两个氧,但两个双键的键级之和是 4。
这些规律适合初步检查,不是适用于所有化学体系的硬性规则。例如,NH₄⁺ 中的氮形成四个 N—H 键,同时需要标明正电荷。看到不常见的成键数量时,先检查电荷、电子状态和具体化学环境,再判断是否画错。 结构式中的形式电荷是一种电子计数记号,也不能直接当成原子真实电荷分布的测量值。
连接关系确认后,还要看空间形状。水分子虽然可以在纸上写成 H—O—H,真实几何却是弯曲的;孤立水分子的键角约为 104.5°。同样的连接关系也可能对应不同空间构型,单键转动还可以产生不同构象。这像知道教室里坐着哪些同学、谁与谁同组之后,还需要座位信息才能描述实际安排。
因此,读结构可以按三层推进:组成 → 连接 → 三维排列。 下一节 ChemDraw 主要帮助我们表达连接关系及必要的立体信息;三维坐标则需要进一步建立和检查。此外,氯化钠这类晶体通常不存在独立的“NaCl 小分子”,式子表示组成比例,周期排列会在 1.3 节展开。
四、从结构到能量:为什么距离不能随便改
既然三维排列很重要,接下来就要问:同样两个原子,靠近一点或远离一点,会有什么变化?以 H₂ 为例,两个氢原子相距很远时相互作用很弱;逐渐靠近,能量会下降;靠得过近,排斥作用又使能量迅速升高。因此,能量曲线上存在一个最低点,其附近对应平衡键长。
可以把这条曲线想成游戏地图中的一段地形:横轴代表原子间距,纵轴代表能量,谷底附近是较稳定的位置。不过,这里的“高度”只是能量的图像,并不是原子在真实空间里的海拔。真实分子也不是静止在谷底,原子会发生振动。
比较两个状态时,常写成 ΔE = E终态 − E初态。例如,在同一计算方法下,同一个中性分子的两个构象分别为 −10.0 eV 和 −10.2 eV,则后者比前者低 0.2 eV。负号本身没有特殊的稳定性含义,关键是参考一致时的差值。
这里也用到了 0.2 节的单位知识:先确认比较的是总能还是每原子能量,并核对组成、电荷和计算设置。就像比较游戏成绩前要核对模式、规则和计分口径,不同材料的总能数值不能直接拿来排稳定性;涉及不同组成时,还需要合理的参考态或配平反应。
五、从能量到反应:终点更低,还要看过程
化学反应会重新安排原子之间的连接。在普通化学反应中,各元素的原子数和总电荷守恒。因此,读反应式的第一步是配平。例如 2H₂ + O₂ → 2H₂O,两边都有 4 个氢原子和 2 个氧原子。配平能检查数量,却不能证明反应一定发生,也不能说明它有多快。
要理解能量变化,还须纠正一个常见误解:断开化学键需要能量,形成化学键释放能量。 一个反应最终吸热还是放热,要比较整个过程中的能量变化,不能只看到“断键”就说释放了能量。平均键能可以辅助粗略估算,但不能代替具体条件下的反应热计算。
即使产物状态更有利,从反应物到产物也往往需要先跨过能垒。仍用游戏地图来理解:目标区域比当前位置低,但路径上可能横着一段高坡。终点与起点的高度差,对应状态之间的能量差;必须先越过的坡,则帮助我们理解反应能垒。因此,反应是否有利与反应进行得快不快,需要分别判断。
催化剂的作用是提供另一条反应路径,降低相关活化能垒,像游戏地图中出现一条更容易通过的路线;它不会改变反应的始末状态,也不改变给定温度下的平衡常数。类比到这里即可:真实反应速率还受温度、浓度和具体机制等因素影响。
最后补上一条边界:前面用能量曲线建立直觉,而在恒温恒压条件下,判断反应的热力学方向通常要看 Gibbs 自由能变化 ΔG,其中还包含温度和熵的影响。现阶段先记住:一个结构的计算总能较低,不能单独证明它容易生成,更不能单独证明实验一定能合成。
六、自己先判断,再请 AI 核查
现在把前面的内容连起来,先不用 AI 回答三道小题,再请它检查你的理由。
- Na 失去一个电子形成 Na⁺ 后,元素种类是否改变?
- 乙醇与二甲醚都有分子式 C₂H₆O,为什么仍需分别记录结构?
- 某反应的产物能量比反应物低,能否据此判断它在室温下很快发生?
完成后展开,核对理由
- 没有改变。质子数不变,改变的是电子数和电荷。
- 两者连接关系不同,属于不同物质。只记录分子式会丢失这一差别。
- 不能。还要考虑反应路径与能垒、温度等因素;讨论热力学方向时,也应采用相应条件下的自由能判据。
随后可以给 Cursor 或 Codex 一项小任务:
请并列展示乙醇和二甲醚的连接关系,标明各原子的连接、氢原子数与总电荷,并核对两者是否都是 C₂H₆O。如果使用 RDKit,请保存可检查的结构文件和结果图片。我不需要编写代码,但需要你解释检查依据;不要仅凭分子式猜测唯一结构。
拿到结果后,自己数一遍 C、H、O,检查氧连接在哪里,再用两句话解释两幅图的差别。这样,AI 承担具体操作,你保留最基本的化学判断。接下来的 1.2 节,我们就把这些判断带进 ChemDraw,亲手修改结构、标注电荷,并画出清楚的反应式。
1.2 ChemDraw:画出分子与反应
上一节,我们先用眼睛和常识检查了原子、化学键与能量。接下来,就要把这些判断落到纸面上:在 ChemDraw 里亲手画出分子与反应,让别人一眼看懂“谁和谁相连、带什么电荷、朝哪个方向”。
因此,本节的目标不是把 ChemDraw 的每个按钮都背下来,而是学会画出一张化学上正确、别人能读懂、计算机也能读取的结构图。 学完后,你应该能画出一个小分子和一个简单反应式,并且能把它导出为图片和 MOL/SMILES。
一、认识画布与常用绘图工具
打开 ChemDraw 之后,首先看到的是一块空白画布,以及左侧(或顶部)的一列工具栏。其中,最常用的只有几样:画化学键的实线键工具、输入元素符号的文字工具、画环的环工具,以及画反应箭头的箭头工具。此外,选择工具(套索或框选)负责移动、旋转和删除已经画好的部分。
先不急着画复杂分子,而是用一分钟熟悉手感:选中实线键工具,在画布上单击一下,就会出现一根键;接着在键的末端继续单击,就能接出第二根键,并且键角会自动取一个合理的锯齿形。于是,连续单击几次,就得到一条碳链。
这里要先建立一个约定:ChemDraw 默认不写出的线端就是碳原子,碳上的氢也默认省略。 也就是说,画面上的一个拐点代表一个 C,而它还差几根键,就隐含几个 H。这就像班级名单里默认“未注明专业即为本专业”:约定一旦说清,图面就能省去大量重复信息。
不同版本的菜单位置会略有差别,所以遇到找不到的功能时,可以把鼠标悬停在按钮上看提示,或者直接问 AI“在 ChemDraw 某版本里,某功能在哪个菜单”。不过,功能在哪里可以问,画得对不对仍要你自己判断。
二、绘制原子、化学键、芳香环与形式电荷
有了碳骨架之后,下一步就是把杂原子标出来。例如画乙醇时,先画两根相连的键得到 C—C—C 形状,接着选中文字工具,单击最后一个端点并输入 O,这个端点就从碳变成了氧。随后 ChemDraw 会按氧通常形成 2 个键的规律,自动显示成 OH。因此,自动补出的氢数本身就是一次检查:如果你输入 O 后显示的是 OH₂ 或 O 旁边出现警告框,就说明连接或电荷有问题。
接着处理键级。在已有的单键上再次单击,通常会把它变成双键;再单击一次,则可能变成三键。例如乙酸的羧基 C(=O)OH,就是在一根 C—O 单键上再单击一次得到的 C=O。同样,画完后要数一数:中心碳是否仍然正好是 4 个键。
至于芳香环,一般直接用环工具里的苯环模板。ChemDraw 画出的苯环通常是单双键交替的凯库勒式,这和画成圆圈的写法表达的是同一种芳香结构。也就是说,苯环并不是“三个单键加三个双键”各自固定,电子在整个环上离域;交替写法只是一种记账方式。后面把分子交给 RDKit 时,程序会重新识别芳香性,所以两种画法最终应当指向同一个分子。
最后是形式电荷。例如画铵离子 NH₄⁺ 时,氮连了 4 个氢,这时就必须在氮上标一个正电荷;否则,按“氮通常形成 3 个键”的规律,图就是错的。标电荷时,可以用电荷工具(通常是带 ⊕/⊖ 的按钮)单击原子,也可以在文字工具里直接输入 NH4+。同理,乙酸根写作 CH₃COO⁻,负电荷要落在一个氧上。
| 你画出的情况 | 可能的含义 | 应该检查什么 |
|---|---|---|
| C 连了 5 根键 | 多画了一根键,或本想画别的原子 | 重新数键级之和 |
| N 连了 4 根键但无电荷 | 漏标正电荷 | 是否应为铵类阳离子 |
| O 只连 1 根键且无 H | 可能是带负电的氧,或漏了氢 | 是否应标 ⊖,或是否本应为 OH |
| 原子旁出现红框或警告 | ChemDraw 认为价态异常 | 先查电荷和键级,再决定是否忽略 |
此外,ChemDraw 通常可以打开“分析”窗口,实时显示分子式和分子量。因此,每画完一个分子,都值得顺手看一眼分子式:画出的分子式与你预期的分子式一致,才进入下一步。
三、楔形键、虚线键与立体化学
到目前为止,我们画的都是平面上的连接关系。然而,真实分子是立体的,所以有些时候平面图不足以区分两个分子。例如乳酸 CH₃CH(OH)COOH 的中间碳连着四个不同的基团,于是它存在两种互为镜像、却不能重合的结构,就像左手和右手。这样的碳叫作手性中心。
为了在纸面上表达“哪个基团朝前、哪个朝后”,化学家约定:实心楔形键表示指向读者,虚线楔形键表示背离读者,普通实线则在纸面内。 因此,画手性中心时,要从键工具组里选择楔形键或虚线键,并且让楔形的尖端落在手性中心上。
与此同时,双键也会带来立体问题。例如 2-丁烯中,两个甲基可能在双键同侧,也可能在两侧,分别对应顺式(Z)和反式(E)。这类立体信息不需要楔形键,而是由双键两端基团在图中的相对位置直接表达。所以,画双键时如果把取代基画得“歪到一边”,就可能不小心改变了 E/Z。
需要提醒的是,楔形键只有在有意义的位置才表达立体化学。反过来,如果某个手性中心你并不知道构型,就不要随手加一个楔形键;否则,别人(以及后面的程序)会以为你确定了它。较新的 ChemDraw 还可以直接显示 R/S 标记,所以画完后可以打开这项显示,核对它与文献给出的构型是否一致。
四、反应箭头、条件标注与结构排版
分子画好之后,就可以把它们组织成反应式。以酯化反应为例:乙醇与乙酸在浓硫酸催化和加热条件下,生成乙酸乙酯和水。首先,把反应物和产物分别画好;接着,用箭头工具在它们之间拉一根向右的箭头;然后,用文字工具在箭头上方写催化剂“浓 H₂SO₄”,在下方写条件“加热”。
在这里,不同形状的箭头含义不同,所以不能随意混用。
| 箭头 | 含义 |
|---|---|
| 单向箭头 → | 反应向右进行 |
| 可逆箭头 ⇌ | 可逆反应或平衡 |
| 双头箭头 ↔ | 共振式之间的关系,不是反应 |
| 弯箭头 | 反应机理中电子对的移动方向 |
例如,酯化反应其实是可逆的,因此严格来说应当画成 ⇌;而如果把共振式之间的 ↔ 误用成反应箭头,读者就会以为发生了化学变化。
接下来是排版。画完之后,先用“整理结构”(Clean Up Structure)让键长和键角统一,再用对齐工具让反应物、箭头和产物排在同一条水平线上。同时,整张图里的字号、键长和线宽应当保持一致;这就像同一份报告里的字体要统一,否则读者会被格式分散注意力。最后,再对照上一节学过的配平规则,数一遍两边的 C、H、O:左边 C₂H₆O + C₂H₄O₂,右边 C₄H₈O₂ + H₂O,碳、氢、氧分别都是 4、10、3,于是这个反应式在原子数上是平衡的。
五、保存可编辑文件,导出图片与 MOL/SMILES
画完一张图,至少要保留三种产物,因为它们各有用途。
- 可编辑源文件:保存为
.cdxml(或.cdx)。这相当于游戏存档,以后改一根键不必从头再画。 - 图片:导出为 PNG 或 TIFF 等格式,用于 PPT 和论文;导出时选择足够高的分辨率,常见要求是 300 dpi 以上。
- 机器可读的结构:选中一个分子后,可以复制为 SMILES(通常在“编辑 → 复制为”一类菜单里),也可以另存为 MDL Molfile(
.mol)。
其中,第三种最容易被忽略,却对后面的课程最重要。图片只给人看,程序读不出里面的原子和键;而 SMILES 与 MOL 记录的是连接关系本身。 例如,乙醇的 SMILES 是 CCO,乙酸是 CC(=O)O,乙酸乙酯是 CCOC(C)=O。同样,带电荷和手性的信息也能写进 SMILES:乙酸根是 CC(=O)[O-],L-乳酸是 C[C@H](O)C(=O)O,其中 @ 记录了手性。
另外,一张画布上如果同时画了反应物和产物,复制出来的 SMILES 可能是用点号连接的多个分子,或者是一条反应 SMILES。所以,导出前先只选中你要的那个分子,导出后再把 SMILES 贴回 ChemDraw(或交给 RDKit)重新画一次,看是否得到原来的结构。这种“导出再读回”的往返检查,能发现大部分漏标电荷或立体信息的问题。
六、二维结构式、分子连接关系与三维构象的区别
讲到这里,需要把三个容易混在一起的概念分开。首先,ChemDraw 画的是二维结构式,它的主要任务是表达连接关系,以及必要的立体标记。其次,连接关系(谁和谁相连、键级多少、电荷在哪)才是结构式真正承载的化学信息。最后,三维构象是原子在空间中的实际坐标,同一个连接关系可以对应许多构象。
因此,ChemDraw 图上的键长和键角只是为了好看,并不是真实的几何数据。例如,你把乙醇的 C—O 键拉长一倍,它仍然是乙醇;同样,把图整体旋转 90°,它也还是同一个分子。反过来说,从 ChemDraw 导出的 MOL 文件里虽然有坐标,这些坐标通常只是二维排版坐标(z 全是 0),不能直接当作三维结构去做计算。
那么,三维结构从哪里来?一般有两种途径:一是从实验或数据库里读取已测定的结构;二是由程序(例如 RDKit)从连接关系生成一个初始构象,再用力场或 DFT 优化。这两条路会分别在 1.5 节和第二部分展开。现在只需记住:结构式回答“连成什么样”,三维坐标回答“摆成什么样”,两者不能互相替代。
七、练习:画出一个小分子及其反应式,核对原子价态与导出结果
现在把本节内容串起来完成一次完整练习。
- 在 ChemDraw 中画出乙醇、乙酸、乙酸乙酯和水,并排成酯化反应式;箭头上方写“浓 H₂SO₄”,下方写“加热”,并用可逆箭头。
- 逐个打开分析窗口,核对四个分子的分子式分别为 C₂H₆O、C₂H₄O₂、C₄H₈O₂、H₂O。
- 另画一个 L-乳酸,用楔形键或虚线键表示手性中心,并打开 R/S 显示,确认它是 S 构型。
- 保存
.cdxml,导出一张 PNG,再分别复制四个分子和乳酸的 SMILES,粘贴到一个文本文件里。
完成后展开,核对要点
- 反应式两边 C、H、O 分别为 4、10、3。如果不平衡,通常是漏画了水,或羧基少了一个氧。
- 乙酸中间的碳必须是一个 C=O 双键加一个 C—O 单键;如果画成两个单键,分子式会多出两个氢。
- 乳酸的楔形尖端应当落在中间那个碳上;如果 R/S 显示为 R,可以把楔形键和虚线键对调,或者交换两个取代基的位置。
- SMILES 贴回 ChemDraw 后应当得到同样的结构;乳酸若失去手性标记,说明导出时没有包含立体信息。
最后,把文本文件交给 Cursor 或 Codex,请它做一次独立核查:
请用 RDKit 读取这个文件里的每条 SMILES,逐条输出规范化 SMILES、分子式、形式电荷和手性中心的 R/S 标记,并生成一张带编号的分子网格图。读取失败的条目请单独列出原因,不要跳过。我不需要写代码,但需要你说明每项检查的依据。
拿到结果后,把 AI 给出的分子式和 R/S 与你在 ChemDraw 里看到的逐项对照。这样,你负责判断结构,ChemDraw 负责表达,RDKit 负责批量核对,三者各司其职。接下来,1.3 节会从单个分子走向成千上万个原子规则排列的晶体,看看结构在三维空间里怎样“重复”。
1.3 材料与晶体学基础
上一节,我们在 ChemDraw 里画的都是单个分子:原子数量有限,连接关系一目了然。然而,金属、陶瓷和半导体这类材料里,原子动辄以 10²³ 的数量堆在一起,显然不可能逐个画出来。因此,本节要换一种思路来描述结构:先找出重复的规律,再只描述一个重复单元。
具体来说,本节依次回答五个问题:晶体为什么可以只描述一小块?这一小块怎样划定?块里的原子位置怎样记录?哪些位置是“等价”的?真实材料又在哪些地方偏离理想晶体?学完后,你应该能读懂一份晶体结构的基本信息,并为下一节用 VESTA 观察晶胞做好准备。
先认识 DFT:后面反复提到的计算方法
在正式进入晶体之前,先简单认识一个本节会多次提到的名字:DFT。不妨把电子想成房间里的一团“雾”:有些地方雾浓,有些地方雾淡。那么,要估计这团雾的整体能量,与其追踪每个电子的所有细节,不如先描述它在各处有多浓,再用计算方法去估算。当然,这只是帮助理解的比喻,电子并不是真的雾。
具体来说,DFT 的全称是密度泛函理论。它用“电子在空间各处有多密”这张分布图,来计算材料或分子的能量和结构。并且,计算时电脑会反复调整这张图,直到结果稳定下来。其中,“泛函”指的是把整张电子密度分布作为输入、用来估算能量的公式;例如,PBE 就是常见的一种泛函。
举个例子,给电脑一个硅晶胞和里面原子的位置,DFT 就会估算电子如何分布、整个结构的能量有多高,并据此判断原子是否需要稍微移动。于是,电脑反复调整之后,就能找到比较稳定的结构,也能比较不同结构哪个更稳定。
简单记:DFT 是计算方法,而泛函是其中负责估算能量的一类公式。 至于它的原理和设置,会在第二部分详细展开;本节只需知道,下面讲的晶胞和坐标,正是交给 DFT 的输入。
一、周期性:只要知道一块瓷砖,就能想象整面墙
先看一个生活里的例子。一面铺满相同瓷砖的墙,虽然有成百上千块砖,但只要知道一块砖的图案,再知道它向左右、上下怎样平移,整面墙就能完整地想象出来。
同样,许多晶体中的原子也按固定规律重复排列。也就是说,只要描述一个小范围内的原子排列,再沿三个固定方向不断平移,就能拼出整个理想晶体。这种“沿固定方向平移后与自身重合”的性质,叫作周期性。
例如,硅晶体里的原子就按固定结构反复排列。因此,后面做计算时,不必真的放进一整块无限大的硅;相反,只要给程序一个硅的基本结构,并告诉它“这块结构会在空间中周期重复”,程序就能用有限的计算近似表示整块晶体。第二部分的 DFT 计算正是这样工作的,所以周期性不只是描述上的方便,也是计算上的前提。
不过,并不是所有固体都有这种规整的重复。例如,玻璃和液体中的原子只在很短的距离内有一定规律,放远了看就杂乱无章,这类材料叫作非晶。因此,本节的描述方法主要适用于晶体;处理非晶时,通常需要换用更大的模型或统计方法。
二、晶胞与坐标:用一个小盒子装下重复单元
既然晶体可以靠重复拼出来,接下来就要问:拿哪一块来重复?在瓷砖墙上,我们挑一块砖作为基本单元;在晶体里,这个基本单元就叫晶胞。顾名思义,晶胞可以理解为“晶体的细胞”:正如许多细胞构成生物体,许多晶胞也沿三个方向堆叠成整块晶体。
更准确地说,晶胞是一个平行六面体形状的空间盒子,它通过平移能够不重不漏地填满整个晶体。于是,描述一个晶胞需要两类信息:
| 信息 | 内容 | 例子(硅的常规晶胞) |
|---|---|---|
| 盒子的形状 | 三条边长 a、b、c,以及三条边两两之间的夹角 α、β、γ,合称晶格参数 | a = b = c ≈ 5.43 Å,α = β = γ = 90° |
| 盒子的内容 | 盒子里有哪些元素的原子,各自位于什么位置 | 8 个硅原子及其坐标 |
值得注意的是,晶胞的选法不止一种。就像同一面墙既可以把一块砖当单元,也可以把相邻四块砖合起来当单元,晶体的晶胞也可以取大取小。其中,体积最小、只含最少原子的叫原胞;而为了让对称性一目了然,人们常常选用更大、更规整的常规晶胞。例如,硅的常规立方晶胞含有 8 个硅原子,换成原胞却只需要 2 个硅原子,但两者重复出来的是同一块硅晶体。所以,计算时选原胞往往更省力,而画图和讲解时选常规晶胞通常更直观。
另外,数晶胞里的原子时还有一个常见陷阱:位于晶胞顶点、棱上或面上的原子,其实同时被相邻的几个晶胞共享。例如,以氯化钠的常规立方晶胞为例,若氯原子位于 8 个顶点和 6 个面心,那么每个顶点原子只有 1/8 属于这个晶胞,每个面心原子只有 1/2 属于它,因此氯原子实际共有 8 × 1/8 + 6 × 1/2 = 4 个。同理,钠原子也是 4 个,所以这个晶胞的组成是 Na₄Cl₄,与化学式 NaCl 的 1∶1 比例一致。如果数出来的比例和化学式对不上,首先怀疑是不是把共享的原子重复计算了。
三、分数坐标与笛卡尔坐标:两种报位置的方式
盒子划定之后,还要说清楚原子在盒子里的位置。这就像在房间里指路:你可以说“从墙角出发,沿两面墙各走一半”,也可以说“从墙角向东 2 米、向北 3 米”。前一种按房间边长的比例来报位置,后一种直接报实际距离,于是就对应了晶体中的两种坐标。
首先,分数坐标说的是沿三条晶胞边各走了多少比例。例如,(1/4, 1/4, 1/4) 表示沿 a、b、c 三条边各走四分之一。因此,分数坐标没有长度单位,并且晶胞内部的原子,其分数坐标一般都落在 0 到 1 之间。
其次,笛卡尔坐标直接给出相对原点的实际距离,通常以埃(Å)为单位。例如,立方硅晶胞边长约 5.43 Å,那么分数坐标 (1/4, 1/4, 1/4) 对应的笛卡尔坐标约为 (1.36, 1.36, 1.36) Å。可见,两者描述的是同一个位置,只是表达方式不同。
不过,只有在直角盒子里,换算才是“各乘边长”这么简单。如果晶胞的夹角不是 90°,那么分数坐标仍然沿三条斜着的晶胞边来量,而换算成笛卡尔坐标时,就需要用整个晶格矩阵去乘。这项计算交给程序即可,但你要记住结论:同一组数字,当成分数坐标还是笛卡尔坐标,得到的位置可能完全不同。 因此,读取任何结构文件时,第一件事都是确认它用的是哪一种坐标。
此外,由于周期性,分数坐标还有一个特别的性质:把坐标加上或减去一个整数,得到的是相邻晶胞中的等价原子。例如,(1.02, 0.5, 0.5) 和 (0.02, 0.5, 0.5) 在晶体中代表同一种位置。所以,看到略大于 1 或略小于 0 的分数坐标时,不必惊慌,它往往只是原子“跨出了盒子边界”,平移回来即可。
四、直观的对称性:转一转、照一照,看是否重合
接下来看对称性。例如,正方形转 90° 后看起来还是原来的正方形;同样,铺得整齐的地砖图案在旋转或镜像后,也可能与原来完全重合。这种“做了某个操作之后,看起来没有变化”的性质,就叫作对称性。
放到晶体里,判断标准就更严格一些:把原子整体平移、旋转或镜像之后,每个原子都必须落到同种元素原子原来所在的位置上,才算具有相应的对称性。换句话说,不能只看几何轮廓是否重合,还要看元素是否对得上;把硅原子转到另一个硅原子的位置才算重合,转到空位上则不算。
那么,对称性有什么用?首先,它能告诉我们哪些原子的环境是等价的。例如在理想硅晶体中,每个硅原子周围都是 4 个硅原子,以正四面体方式排布,所以所有硅原子是等价的。因此,研究一个硅原子的局部环境,就等于研究了全部硅原子。其次,计算程序也会利用对称性识别等价位置,从而减少重复计算。
然而,对称性很容易被打破。例如,从理想硅晶体里拿掉一个原子,原来能与自身重合的一些旋转操作就不再成立了。也就是说,缺陷不仅改变了局部结构,还可能降低整体的对称性。至于对称性更系统的描述,也就是空间群和 Wyckoff 位点,会留到第五部分晶体结构预测时再展开;现阶段,能用“转一转、照一照”来直观判断即可。
五、缺陷与相:真实材料与理想晶体的差别
到目前为止,我们讨论的都是完美的、无限重复的理想晶体。但真实材料总有不完美之处。仍以瓷砖墙为例:少了一块砖、多塞进一块砖,或者换了一块不同颜色的砖,都会让墙面偏离完美的重复,这就相当于晶体中的缺陷。
| 缺陷类型 | 含义 | 瓷砖墙里的样子 |
|---|---|---|
| 空位 | 本该有原子的位置空着 | 少了一块砖 |
| 间隙原子 | 原子挤进了本不该有原子的空隙 | 砖缝里多塞了一块 |
| 替位缺陷 | 某个位置换成了另一种元素 | 换了一块别的颜色的砖 |
尽管缺陷只占极少数原子,它们却常常决定材料的关键性质。例如,在硅中掺入极少量的磷或硼替代硅原子,就能大幅改变它的导电能力,这正是半导体器件的基础。
那么,怎样在计算中表示一个缺陷?通常的做法是:先把晶胞沿三个方向扩大若干倍,得到一个超胞,然后在其中拿掉或替换一个原子。之所以要先扩大,是因为计算时这个超胞仍会被周期复制,所以模型里实际上会出现一排排重复的缺陷。因此,超胞如果太小,相邻缺陷之间的距离就太近,它们会相互影响,算出的结果也就不能代表“一个孤立的缺陷”。
另一方面,除了局部缺陷,同一种化学成分还可以采用完全不同的整体排列方式,这些不同的结构状态叫作相。例如,钻石和石墨都只由碳组成,但钻石中每个碳原子与 4 个碳原子形成三维网络,而石墨中碳原子排成一层层平面,层与层之间只靠较弱的作用力结合。于是,同样是碳,一个极硬、不导电,另一个却柔软、能导电。同理,二氧化钛也有金红石、锐钛矿等不同的相。
更重要的是,哪个相最稳定,会随温度和压力变化。例如,常温常压下石墨比钻石略稳定,而在高温高压下钻石才成为更稳定的相。这提醒我们:只写化学式并不能确定一个材料,还必须说明它是哪一个相、在什么条件下。 后面整理数据时,这一点会反复出现。
六、把五个概念连起来
最后,把本节内容串成一条线:周期性告诉我们晶体会重复;晶胞让我们用一个小盒子描述这种重复;坐标记录原子在盒子里的位置;对称性帮助我们识别等价的原子和环境;而缺陷与相则描述真实材料怎样偏离理想晶体,或者采用另一种整体结构。
在此基础上,先不借助 AI,试着回答下面三道小题。
- 一个晶胞的晶格参数为 a = b = c = 4.0 Å、α = β = γ = 90°,其中一个原子的分数坐标是 (0.5, 0.5, 0.5)。它的笛卡尔坐标是多少?
- 某份结构文件中出现了分数坐标 (−0.01, 0.25, 0.25),这是否说明原子跑到了晶体外面?
- 要计算硅中单个空位的性质,为什么不能直接从 2 个原子的原胞里拿掉一个原子?
完成后展开,核对理由
- (2.0, 2.0, 2.0) Å。因为是直角盒子,所以分数坐标各乘边长即可。
- 不是。由于周期性,它与 (0.99, 0.25, 0.25) 是等价位置,只是原子落在了晶胞边界另一侧。
- 因为拿掉后只剩 1 个原子,而且周期复制后每个晶胞都缺一个原子,相当于缺了一半的硅,已经不是“少量缺陷”了。所以应先扩成较大的超胞,再拿掉一个原子。
接着,可以请 AI 帮你核查自己的理解:
请以硅的常规立方晶胞(a ≈ 5.43 Å)为例,列出 8 个硅原子的分数坐标,并换算成笛卡尔坐标;再说明原胞与常规晶胞的原子数为什么不同。请标明坐标单位,不要省略换算依据。
拿到结果后,挑两个原子自己手算一遍笛卡尔坐标,再检查原子总数是否为 8。这样,下一节打开 VESTA 时,你看到的就不再是一团彩色小球,而是一个有边长、有坐标、有规律的晶胞。
1.4 VESTA:看懂晶胞与原子结构
上一节,我们用晶格参数、分数坐标和对称性,在纸面上描述了一个晶胞。然而,只看数字很难想象原子在空间里怎样排布,所以本节要借助 VESTA,把这些数字变成一个可以旋转、测量和导出的三维结构。
需要先说明的是,VESTA 是一个查看和检查结构的工具,而不是修改结构的主要工具。因此,本节的重点是:打开一份结构文件,先核对数字,再观察图像,最后导出一张准确的结构图。 学完后,你应该能用同一份文件解释晶胞、配位和周期性,并且能分辨“显示出来的原子”和“文件里真实存在的原子”。
一、打开 CIF/POSCAR,核对元素、晶格参数与原子坐标
首先,需要一份结构文件。常见的来源有两种:一是从 Materials Project 或晶体学开放数据库(COD)下载 CIF 文件;二是使用课程或计算得到的 POSCAR 文件。本节以氯化钠(岩盐结构,a ≈ 5.64 Å)和硅(a ≈ 5.43 Å)为例,你可以请 AI 帮你找到这两份 CIF,并说明来源。
接着,用 File → Open 打开文件,画面上就会出现一个带边框的晶胞和若干彩色小球。不过,先别急着欣赏图像,而是先核对数字。 具体来说,打开 Edit → Edit Data → Unit Cell,可以看到晶格参数 a、b、c 和 α、β、γ;然后切换到 Structure Parameters,可以看到每一种原子的元素、分数坐标和占位率。
| 核对项目 | 氯化钠应当看到 | 如果不一致,可能的原因 |
|---|---|---|
| 晶格参数 | a = b = c ≈ 5.64 Å,三个角都是 90° | 文件用了原胞,或下载了别的相;计算数据库的值可能略大,约 5.7 Å |
| 原子列表 | 只列出 1 个 Na 和 1 个 Cl | 这是不对称单元,其余位置由对称操作生成 |
| 占位率 | 都是 1 | 小于 1 说明存在无序或部分占位 |
| 空间群 | Fm-3m | 空间群不同,说明结构不同 |
其中,第二行最容易让人困惑:明明晶胞里有 4 个钠和 4 个氯,为什么列表里各只有 1 个?这是因为,CIF 常常只记录最少的一组原子(不对称单元),再由空间群的对称操作把其余位置“复制”出来。因此,文件里写了几个原子,和晶胞里实际有几个原子,是两回事;VESTA 会自动完成这一步展开,所以图里能看到完整的晶胞。
同理,打开 POSCAR 时也要做对应的检查:元素顺序和每种元素的原子数是否对得上,坐标是 Direct(分数坐标)还是 Cartesian(笛卡尔坐标)。如果这一步就错了,那么后面画得再漂亮也没有意义。
二、旋转、缩放与选择观察方向
核对完数字之后,就可以开始观察了。首先,用鼠标左键拖动可以旋转结构,滚轮可以缩放,右键或中键(取决于设置)可以平移视图。于是,你可以像在游戏里转动视角一样,从各个角度看这个晶胞。
不过,随意转动得到的图往往既不好看,也不好解释。因此,更常用的是沿特定方向观察:工具栏上通常有“沿 a 轴看”“沿 b 轴看”“沿 c 轴看”的按钮,点一下,视线就会对准相应的晶轴。例如,沿 c 轴看氯化钠时,钠和氯会排成整齐的棋盘格,这比斜着看要清楚得多。
此外,如果想强调某个晶面上的原子排布,可以在视图方向设置中指定一个晶面方向,让视线垂直于它。这里暂时不需要掌握晶面指数的完整定义;你只需知道,好的结构图总是先选定观察方向,再截图,而不是“转到差不多就截”。并且,写论文时要在图注里说明观察方向,这样读者才能复现你看到的画面。
三、晶胞边界、周期性显示范围与跨边界邻居
接下来是本节最容易出错、也最值得理解的一点。默认情况下,VESTA 会把分数坐标恰好等于 0 或 1 的原子都画出来。例如,氯化钠晶胞的 8 个顶点上都能看到原子,而在上一节我们算过,这 8 个顶点原子合起来只算 1 个。因此,图上能数出的小球数,通常多于晶胞真正包含的原子数。
那么,显示范围由谁决定?在 Objects → Boundary 里,可以设置沿 x、y、z 三个方向显示的分数坐标范围。例如,把范围从默认的 0~1 改成 −0.5~1.5,画面上就会多出一圈相邻晶胞中的原子;反过来,也可以缩小范围,只显示部分原子。
之所以要调整显示范围,是因为晶胞边界附近的原子,它们的邻居往往在相邻晶胞里。例如,位于晶胞一角的钠原子,按默认显示只能看到它的一部分邻居;只有把显示范围放大,才能看到它周围完整的 6 个氯原子。也就是说,边界是我们人为划定的盒子,而原子本身并不知道边界在哪里。
但一定要记住:Boundary 只改变“显示多少”,不改变“结构是什么”。 无论你显示几个晶胞,文件里的结构都没有变化;同样,把这张图导出后数小球,也不能得到晶胞的真实原子数。
四、设置成键距离,测量键长与键角
看清原子之后,下一步是看它们之间的“连线”。然而,VESTA 里的键并不是从文件里读出来的,而是按距离规则自动画出来的:两个原子的距离落在设定的范围内,就画一根键。因此,这些连线只是一种显示约定,并不等于化学上一定存在化学键。
具体来说,在 Edit → Bonds 里,可以为每一对元素设置最小和最大距离。例如,为 Na–Cl 设置 0~3.2 Å,就会把相距约 2.82 Å 的最近邻钠和氯连起来。反过来,如果把上限设得太大,图上就会出现一堆本不该有的连线;设得太小,本该相连的原子又会断开。所以,看到奇怪的键时,先检查成键距离设置,再怀疑结构本身。
接着就可以测量。工具栏上有测量距离和测量角度的模式:选中距离模式后,依次点击两个原子,下方信息栏就会显示它们之间的距离;同样,选中角度模式后依次点击三个原子,就会显示夹角。例如,在硅中测量相邻两个硅原子,应得到约 2.35 Å;再测量以一个硅为顶点的两根键之间的夹角,应得到约 109.5°,这正是正四面体的键角。
值得注意的是,测量结果要和已知数据相互印证。例如,氯化钠中最近邻 Na–Cl 距离应当等于 a/2 ≈ 2.82 Å。如果你测出来是 1.4 Å 或 5.6 Å,那么多半是点错了原子,或者文件本身有问题。测量不仅是为了得到数字,更是为了检查结构是否合理。
五、球棍模型、配位多面体与结构图导出
同一个结构可以用不同风格来画,而不同风格强调的信息也不同。
| 显示风格 | 突出什么 | 适合的场景 |
|---|---|---|
| 球棍模型 | 原子位置和连接关系 | 讲解原子排布、标注键长 |
| 空间填充 | 原子的相对大小和堆积程度 | 展示密堆积、孔道是否被占满 |
| 多面体 | 中心原子周围的配位环境 | 比较不同位点的局部结构 |
| 线框 | 只看骨架 | 结构很大、原子很多时 |
其中,配位多面体特别值得学会。所谓配位,指的是一个原子周围最近邻原子的数目和排布方式。例如,氯化钠中每个钠被 6 个氯包围,这 6 个氯的位置连起来恰好是一个八面体;而硅中每个硅被 4 个硅包围,连起来是一个四面体。于是,只要打开多面体显示,看一眼形状,就能读出配位数和局部结构。在 VESTA 里,通常可以在 Bonds 设置中为中心原子开启多面体显示,并选择多面体的透明度和颜色。
最后是导出。一般用 File → Export Raster Image 导出 PNG 或 TIFF 等位图,并且可以在导出时放大倍数,以获得更高的分辨率。导出之前,建议先统一背景颜色、隐藏不需要的坐标轴,并确认观察方向;导出之后,再把图放进 PPT 里与其他图组合。同时,别忘了另存一份 VESTA 的工程文件(.vesta),这样以后修改颜色或视角时,就不必从头设置。
六、显示范围、超胞与实际结构修改的区别
讲到这里,需要把三件看起来相似的事情区分开来,因为它们对后续计算的影响完全不同。
- 改变显示范围(Boundary):只影响画面上显示多少原子,文件里的结构完全不变。这就像把地图放大缩小,地形本身没有变化。
- 构造超胞(在晶胞设置里做变换,例如 2 × 2 × 2 扩胞):生成了一个更大的新晶胞,原子数也随之增加,但它描述的仍是同一块理想晶体。这就像把四块砖合起来当成新的“单元”,墙的图案并没有变。
- 实际修改结构(删除、替换或移动原子):结构本身发生了变化,例如制造了一个空位或替位缺陷。这时得到的已经是另一个体系。
因此,如果你想把一个结构交给后面的计算,那么就要通过 File → Export Data 导出新的 CIF 或 POSCAR,而不是导出一张图片。并且,导出后应当检查原子数:只调整了显示范围时,原子数不应变化;做了 2 × 2 × 2 超胞后,原子数应当变为原来的 8 倍。
不过,VESTA 并不擅长批量、可复现地修改结构。所以,真正要用于计算的超胞和缺陷结构,更推荐让 Agent 用 ASE 或 pymatgen 生成,再用 VESTA 打开检查。这样,每一步修改都有脚本和记录可查,这一点会在 1.5 节展开。
七、练习:用同一份结构文件解释晶胞、配位与周期性
现在,用氯化钠的 CIF 完成一次完整练习。
- 打开文件,记录晶格参数、空间群,以及结构参数列表中的原子数。
- 在默认显示下数一数画面上的钠和氯小球,再解释为什么它不等于晶胞中的 4 个钠和 4 个氯。
- 把显示范围扩大到 −0.5~1.5,找到一个钠原子,确认它周围有 6 个氯,并开启多面体显示。
- 测量最近邻 Na–Cl 距离,与 a/2 比较。
- 沿 c 轴导出一张 PNG 结构图,并另存
.vesta文件。
完成后展开,核对要点
- a ≈ 5.64 Å,三个角均为 90°,空间群 Fm-3m;结构参数中通常只有 1 个 Na 和 1 个 Cl。
- 默认显示会把顶点、棱和面上的原子都画出来,所以小球数多于 8;按共享比例折算后,才是 4 个钠和 4 个氯。
- 配位多面体应当是八面体,配位数为 6。
- 测量值应约为 2.82 Å,与 a/2 一致;若相差很大,先检查是否点错原子。
- 图注里应写明结构来源、观察方向和显示范围。
完成之后,可以请 AI 做一次交叉核对:
请用 pymatgen 读取这份氯化钠 CIF,输出晶格参数、空间群、常规晶胞中的原子数与化学式,以及钠原子的配位数和最近邻 Na–Cl 距离。请说明数据来源和计算依据,我会与 VESTA 中的测量结果逐项对照。
把 AI 给出的数字与你在 VESTA 里看到的逐项比对,并把差异记下来。这样,VESTA 帮你看见结构,程序帮你算准数字,两者互相印证。下一节,我们就把这些看得见的分子和晶体,正式写成计算机能读取、能追溯的数据记录。
1.5 把化学对象写成可计算的记录
前面几节,我们用 ChemDraw 画出了分子,也用 VESTA 看清了晶胞。化学家可以从一张结构图中看出分子由哪些原子组成,也可以从晶体结构图中看出原子大致如何排列。但是,计算机并不能可靠地“看懂”一张图片;相反,它需要明确的数据,说明有哪些原子、原子之间如何连接、原子位于什么位置,以及体系是否具有周期性。
因此,把化学对象变成可计算对象,并不只是把文件换一种格式保存,我们还要确保结构的含义没有在转换中丢失。例如,原子价态或手性读错、坐标单位弄混、晶体被误设为非周期体系,都可能让后续计算顺利运行,却得到错误结果。所以,本节的目标是:让每一条结构数据都说得清“是什么、从哪来、怎么处理过”。
一、从 ChemDraw 的连接关系到分子图
在 ChemDraw 里,分子通常画成原子符号和连接它们的线。对计算机来说,这可以表示成一张分子图:原子是图中的节点,化学键是连接节点的边。并且,每个节点可以记录元素、形式电荷和手性等信息;同样,每条边可以记录键级、芳香性和双键构型等信息。
例如,乙醇可以写成 C—C—O:图中有两个碳原子和一个氧原子,它们由单键相连。然而,这张图只告诉我们原子的连接关系,却不告诉我们乙醇在三维空间中的具体形状。正如 1.2 节所说,ChemDraw 上的二维图并不是分子的真实三维构象;因此,如果要计算三维结构,还需要另外生成或读取原子坐标。
这一点对区分相似分子尤其重要。例如,乙醇和二甲醚的分子式相同,都是 C₂H₆O,但原子连接方式不同:乙醇是 C—C—O,二甲醚是 C—O—C。也就是说,只记录分子式,计算机就无法区分它们;而分子图则能保留这项关键信息。
二、让 Agent 用 RDKit 读取 SMILES/SDF,核对结构、失败记录与转换规则
有了分子图的概念,接下来看它在文件里怎样保存。首先,SMILES 是用一串字符表示分子连接关系的简单写法,例如乙醇可写为 CCO。因此,它适合紧凑地保存分子图,也能表示一些立体化学信息,但通常不包含分子的完整三维坐标。相比之下,SDF 通常保存原子、化学键、坐标和附加属性;并且,一个 SDF 文件还可以连续保存多个分子记录。下面就是一个 SDF 的例子:
Ethanol Example
3 2 0 0 0 0 999 V2000 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 2.1000 1.2000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 2 3 1 0M END> <name>ethanol
$$$$读这个例子时,可以按从上到下的顺序看:
3 2:首先说明有 3 个原子、2 条键。- 接下来的三行:依次列出两个碳和一个氧,每行先写笛卡尔坐标,再写元素符号。
1 2 1:然后说明第 1 个原子和第 2 个原子之间是单键;同理,下一行表示第 2 个和第 3 个原子之间也是单键。M END:到这里,分子结构记录结束。$$$$:最后,这一条 SDF 记录结束;因此,同一个文件里可以接着放其他分子。
值得注意的是,这个例子只写了重原子,氢原子是隐含的;同时,它的 z 坐标全是 0,所以只是二维排版坐标。这正好印证了前面的提醒:有坐标,不等于有可用的三维结构。
在此基础上,Agent 可以调用 RDKit 这类化学信息学工具来读取 SMILES 或 SDF,并做基本检查。不过,一个可靠的流程不应只问“文件能不能打开”,还应核对原子数、化学式、形式电荷、键级、价态和立体化学信息。此外,对于多记录的 SDF,还要逐条记录哪些分子读取成功、哪些失败,以及失败原因。
更进一步,如果 RDKit 无法解析某条 SMILES,Agent 不应悄悄跳过这条数据;同样,如果它要执行去盐、补氢、调整电荷或互变异构体标准化,也应记录具体规则。这是因为,这些操作可能改变分子的表示方式,甚至改变后续任务所研究的化学对象。所以,较稳妥的做法是保留原始输入,并把每一步处理后的结构作为带有来源记录的新版本保存。
另外,若需要从 SMILES 生成三维坐标,软件可以先生成一个可能的构象,再做几何优化。但是,这只是一个初始结构或近似构象,因此不应直接当作 DFT 优化后的结构或实验测得的构象。
三、从 VESTA 的结构视图到坐标记录
说完分子,再来看晶体。VESTA 可以把晶体结构文件显示为三维图像,帮助我们观察晶胞、原子排列和局部环境;并且,写论文时需要的结构示意图,也常常由此导出。但是,图像是给人看的,而计算程序需要的是结构数据:晶胞的形状和大小、元素种类、原子的坐标、占位率,以及适用的对称操作等。
例如,VESTA 可以把 CIF 中给出的晶体结构显示出来。正如 1.4 节所见,有些 CIF 只列出不对称单元中的原子,再通过对称操作生成完整晶胞;因此,VESTA 显示的完整结构可能包含由程序生成的原子位置,以及边界上重复显示的周期副本。于是,若只根据屏幕上的图像数原子,或试图从截图估算坐标,就可能把周期副本误认为晶胞中的额外原子。
所以,VESTA 适合用来检查和理解结构,而精确的结构记录应当来自 CIF、POSCAR 等原始结构文件。同样,看到不合理的键长、缺失原子或异常晶胞时,也应回到原始数据核查,而不是从示意图反推坐标。
四、分子与晶体结构文件(MOL、CIF、POSCAR、XYZ 与 extxyz)
既然结构要以文件为准,那么就得了解常见的文件格式。不同结构文件保存的信息不同,所以选择文件格式时,不能只看文件扩展名,还要确认它是否保存了当前任务需要的结构、坐标、周期性和性质数据。
| 格式 | 常见用途 | 使用时要留意 |
|---|---|---|
| MOL | 保存一个分子的原子、键及坐标 | 坐标可能是二维,也可能是三维;要确认是否包含所需的电荷和立体化学信息 |
| SDF | 保存一个或多个分子记录及附加属性 | 多条记录可能有不同的读取结果;应保留每条记录的编号和失败信息 |
| CIF | 保存晶体的晶胞、原子位置、对称性等 | 坐标常用分数坐标;文件可能只记录不对称单元,也可能包含无序或部分占位 |
| POSCAR | VASP 常用的周期结构输入文件 | 包含晶格和原子坐标;要确认坐标是 Direct 还是 Cartesian,并核对元素顺序与原子数 |
| XYZ | 简单保存原子种类和笛卡尔坐标 | 传统 XYZ 通常不记录晶胞、周期性、化学键和电荷 |
| extxyz | 扩展 XYZ,可记录晶胞、周期性及性质 | 可以保存能量、力等信息,但字段名称和单位仍需确认 |
其中,分数坐标表示原子相对于晶胞边的比例,而笛卡尔坐标表示以实际长度描述的位置,通常以 Å 为单位。虽然两种坐标可以描述同一个结构,但读取文件时必须知道当前使用的是哪一种;否则,坐标值看起来合理,实际位置却可能完全错误。
五、周期性边界
了解了文件格式,接下来还要处理一个晶体特有的问题:周期性边界。1.3 节说过,程序会把一个晶胞在空间中无限复制。因此,一份晶体结构除了晶胞和坐标,还必须说明“哪些方向是周期重复的”。
一般来说,常见的情形有三种。首先,块体晶体在三个方向上都周期重复。其次,表面或二维材料只在面内两个方向重复,而垂直方向留出一段真空层,以免上下两层相互作用。最后,孤立分子在任何方向上都不重复。所以,同样一组原子坐标,周期性设置不同,描述的就是完全不同的体系。
更重要的是,周期性会改变“距离”的算法。例如,在边长 10 Å 的立方晶胞中,一个原子在 x = 0.5 Å,另一个在 x = 9.5 Å。如果直接相减,它们相距 9 Å;然而,考虑周期性后,第二个原子在相邻晶胞中的副本位于 x = −0.5 Å,于是两者实际只相距 1 Å。换句话说,在周期体系中,两个原子的距离要取所有周期副本中最近的那一个,这叫作最小镜像约定。
因此,如果把一个晶体误当作孤立分子处理,程序就会“看不见”跨边界的邻居;反过来,如果把孤立分子放进一个太小的周期盒子,它又会和自己的副本相互作用。这两类错误都不会让程序报错,所以每次读取或转换结构后,都要确认周期性设置是否符合你的本意。
六、用 ASE 的 Atoms 与 pymatgen 的 Structure 读写与转换
在实际工作中,读写和转换结构通常交给两个 Python 库:ASE 和 pymatgen。其中,ASE 用 Atoms 对象表示一组原子,而 pymatgen 用 Structure 表示周期晶体、用 Molecule 表示孤立分子。虽然你不需要亲手写代码,但能读懂一小段代码在做什么,就能更好地检查 Agent 的工作。例如:
from ase.io import read, writeatoms = read("NaCl.cif") # 读取 CIFprint(atoms.get_chemical_formula(), len(atoms))print(atoms.cell.cellpar()) # a, b, c, α, β, γprint(atoms.pbc) # 三个方向是否周期write("POSCAR", atoms, format="vasp")这段代码依次做了四件事:首先读取文件,然后打印化学式和原子数,接着打印晶格参数和周期性设置,最后另存为 POSCAR。同样,pymatgen 也能完成类似的读写,并且提供了 AseAtomsAdaptor,可以在 Atoms 和 Structure 之间相互转换。
那么,转换之后要检查什么?一般来说,至少核对下面几项:
| 检查项 | 为什么要查 |
|---|---|
| 原子数与化学式 | 对称展开或去重出错时,原子数会变化 |
| 晶格参数与体积 | 单位或坐标类型弄错时,晶胞会明显变形 |
| 周期性设置 | XYZ 等格式可能丢失周期信息 |
| 最近原子间距 | 小于约 0.7 Å 通常说明原子重叠或坐标读错 |
| 元素顺序 | POSCAR 中元素顺序与原子数一一对应,错位即换了元素 |
此外,还有一个简单而有效的办法:把转换后的文件再读回来,与原始结构比较。如果原子数、晶格和最近距离都一致,那么这次转换大概率没有丢失信息;否则,就要回到原文件查找原因。
七、性质标签是什么:单位、实验或计算来源、计算设置与版本
到目前为止,我们讨论的都是结构本身。然而,建模时我们真正想预测的是性质,例如形成能、带隙或体模量,这些要预测的值叫作标签。那么,一个标签只写一个数字够不够?答案是不够。
例如,“某材料的带隙是 1.1”这句话至少缺了四样东西。首先,缺单位:是 eV 还是别的单位?其次,缺来源:是实验测得,还是计算得到?再次,缺条件或设置:如果是实验值,测量温度是多少;如果是计算值,用了哪种泛函、是否加了 +U 修正。最后,缺版本:数据来自哪个数据库、哪一次发布。因此,一个完整的标签应当是“数值 + 单位 + 来源 + 设置 + 版本”。
之所以要这么较真,是因为不同来源的数值往往带有系统差异。例如,常用的 PBE 泛函算出的带隙通常明显低于实验值;同样,数据库更新计算设置之后,同一种材料的形成能也可能发生变化。所以,如果把实验带隙和 PBE 带隙混在一起训练,模型学到的就是一堆口径不一的数字。这一点会在第二部分 2.7 节详细展开。
另外,还要注意“总量”和“平均量”的区别。正如 0.2 节所说,形成能常以 eV/atom 表示,而总能则随原子数增加。于是,一份标签表至少应当包含下面这些列:
| 列名 | 例子 |
|---|---|
| 结构编号 | mp-22862(NaCl) |
| 性质与数值 | formation_energy ≈ −2(示意值) |
| 单位 | eV/atom |
| 来源 | 计算(Materials Project) |
| 计算设置 | PBE 泛函,修正方案以数据库说明为准 |
| 数据版本 | 数据库发布版本或下载日期 |
这样,半年之后再看这份数据,你仍然能说清每个数字是怎么来的。
八、原始坐标用于建模时要处理哪些对称性
最后,还有一个问题需要在建模之前想清楚:能不能直接把原子坐标当作模型的输入?答案是通常不能,因为同一个结构可以写成许多组不同的坐标。
例如,把整个结构平移 1 Å,或者整体旋转 30°,所有坐标数值都变了,但它仍是同一个结构,能量也不变。同样,把文件中原子的顺序调换一下,结构不变,坐标列表却变了。此外,对晶体来说,还可以换一种晶胞选法,或者把原子平移到相邻晶胞,这些也都不改变结构本身。
| 操作 | 坐标是否改变 | 结构与能量是否改变 |
|---|---|---|
| 整体平移 | 改变 | 不变 |
| 整体旋转 | 改变 | 不变 |
| 调换原子的排列顺序 | 改变 | 不变 |
| 换一种晶胞选法 | 改变 | 不变 |
| 把原子平移到相邻晶胞 | 改变 | 不变 |
因此,如果模型直接吃进原始坐标,它就会把同一个结构的不同写法当成不同的样本,于是既学得慢,又容易出错。所以,建模时通常采用两种思路:一是先把结构转换成不随这些操作改变的描述,例如元素组成的统计量或原子间距离的分布,这正是 1.6 节要讲的描述符;二是设计本身就满足这些对称性的模型,这会在第三部分讲到。
与此同时,这些对称性也会影响数据清洗。例如,同一个结构可能以不同的晶胞或坐标写法重复出现在数据中。因此,去重时不能只比较文件内容是否相同,而应当用 pymatgen 的 StructureMatcher 等工具判断两个结构是否本质相同。这一步如果漏掉,重复样本就可能同时出现在训练集和测试集里,这个问题会在 1.7 节详细讨论。
九、练习:把一小批结构整理成可追溯的记录
现在,把本节内容串起来完成一次练习。你可以请 Agent 执行下面的任务:
请下载乙醇、乙酸、乙酸乙酯的 SMILES,以及氯化钠和硅的 CIF。分子部分用 RDKit 读取,输出规范化 SMILES、分子式、形式电荷,并各生成一个三维初始构象存为 SDF;晶体部分用 ASE 读取,输出化学式、原子数、晶格参数、周期性设置和最近原子间距,再转换为 POSCAR 和 extxyz,并读回比较。最后生成一张记录表,每一行写清文件名、来源、处理步骤和检查结果。读取或转换失败的条目请单独列出,不要跳过。
拿到结果后,先自己检查三件事:分子式是否与 1.2 节一致;氯化钠常规晶胞的原子数是否为 8(如果文件用的是原胞,则应为 2);extxyz 读回后周期性设置是否仍为三个方向都周期。确认无误之后,这批结构就从“一张图”变成了“一份可计算、可追溯的数据”。接下来,1.6 节就在这份数据的基础上,把结构变成数字,训练第一个预测模型。
1.6 经典机器学习与描述符
上一节,我们把分子和晶体整理成了可追溯的数据记录,并且发现原始坐标不宜直接交给模型。那么,接下来的问题就很自然:怎样把一个结构变成一串模型能用的数字,又怎样让模型从这些数字里学到规律?
本节就回答这个问题。首先,我们会分清输入、标签和预测值;接着,学习两类描述符,把结构变成数字;然后,认识四种经典模型;最后,讨论模型“学过头”时怎么办。学完后,你应该能说清一个预测任务的输入与输出,并能判断一个模型是学到了规律,还是只背下了答案。
一、输入、标签、预测值与训练目标
先用一个熟悉的例子建立直觉。假设你要根据同学的平时作业分数,预测他的期末成绩。于是,平时作业分数是输入(也叫特征),真实的期末成绩是标签,而你根据规律猜出来的分数就是预测值。
放到材料里,道理完全一样。例如,要预测材料的形成能,那么输入就是描述这个材料的一串数字,标签就是数据库里的形成能,而预测值则是模型给出的估计。因此,一个预测任务可以简写成:
输入(结构的数字描述) → 模型 → 预测值,并与标签比较
那么,模型怎样“学”?简单来说,就是不断调整内部的参数,让预测值尽量接近标签。为此,需要先定义一个衡量“差多远”的数,叫作损失函数。例如,最常用的均方误差,就是把每个样本的“预测值 − 标签”平方后取平均。所以,训练的目标就是找到一组参数,使训练数据上的损失尽可能小。
不过,这里要提前埋下一个伏笔:损失小只说明模型在“做过的题”上答得好,并不说明它在新题上也答得好。这个区别,正是本节后半部分和 1.7 节的核心。
二、组分描述符与结构描述符(Magpie、SOAP、ACSF)
既然模型需要数字输入,那么首先要把结构翻译成数字,这一步叫作构造描述符。一个好的描述符,至少要满足两点:一是包含与目标性质相关的信息;二是正如 1.5 节所说,不随平移、旋转和原子顺序改变。
最简单的一类是组分描述符,它只看化学式,不看原子怎样排列。例如 Magpie 描述符的做法是:先为每种元素查出一组基本性质,如原子序数、电负性、原子半径等;然后,按化学式中各元素的比例,计算这些性质的平均值、最大值、最小值、范围等统计量。以 NaCl 为例,钠的电负性约 0.93,氯约 3.16,于是“电负性平均值”约 2.05,“电负性范围”约 2.23。这样,一个化学式就变成了一百多个数字。
组分描述符的优点是简单,而且只需要化学式就能计算。然而,它的缺点也很明显:同一化学式的不同相,会得到完全相同的描述符。 例如,钻石和石墨都是 C,组分描述符无法区分它们;因此,如果目标性质强烈依赖结构,就需要结构描述符。
于是,第二类是结构描述符,它描述每个原子周围的局部环境。例如,ACSF(原子中心对称函数)的思路是:以某个原子为中心,统计一定半径内邻居原子的距离分布和角度分布,再把这些分布写成一组数字。同样,SOAP 也描述局部环境,只不过它把邻居原子想象成一团团模糊的“密度云”,再用一套数学展开把这团云的形状编码成数字。由于它们都只依赖原子间的距离和角度,所以天然不随平移和旋转改变。
| 描述符类型 | 需要什么 | 能区分同分异构/多形体吗 | 例子 |
|---|---|---|---|
| 组分描述符 | 只需化学式 | 不能 | Magpie |
| 结构描述符 | 需要原子坐标 | 能 | ACSF、SOAP |
因此,选择描述符时,先问自己:要预测的性质主要由组成决定,还是由结构决定? 如果数据里只有化学式,就只能用组分描述符;如果有可靠的结构,结构描述符通常能提供更多信息。实际操作中,这些描述符可以让 Agent 用 matminer、DScribe 等库计算。
三、线性与岭回归
有了输入之后,接下来选模型。首先从最简单的线性回归开始。它假设预测值是各个特征的加权求和,再加一个常数:
预测值 = w₁ × 特征₁ + w₂ × 特征₂ + … + b
其中,w 叫作权重,b 叫作截距,它们都是要学的参数。例如,只用一个特征“电负性范围”预测形成能时,模型就是在二维图上画一条直线,使所有数据点到直线的距离尽量小。
线性模型的好处是透明:每个权重的正负和大小,直接说明对应特征对预测的影响方向和强弱。然而,当特征很多、而且彼此高度相关时,线性回归可能给出非常大、相互抵消的权重。这样一来,数据只要稍有变化,权重就会剧烈摇摆,模型也就变得不可靠。
为了解决这个问题,岭回归在损失函数里额外加了一项“惩罚”:权重越大,惩罚越重。于是,模型在拟合数据的同时,也被迫让权重保持温和。这种惩罚的强度由一个参数 λ 控制:λ 越大,权重越保守;λ 为 0 时,岭回归就退回普通线性回归。至于 λ 怎么选,会在本节第八小节讨论。
四、随机森林
线性模型只能表达“直线”式的关系,但材料性质往往与特征之间存在弯曲、分段的关系。因此,我们需要更灵活的模型。
先来看决策树。它像玩“猜猜我是谁”的游戏:先问一个问题,例如“电负性范围大于 1.5 吗?”,根据回答把样本分成两组;接着,在每组里再问下一个问题,如此层层细分;最后,落在同一片“叶子”里的样本,就用它们标签的平均值作为预测。所以,决策树能自然地表达分段和非线性的关系。
然而,一棵树很容易把训练数据分得过细,以致于记住了每个样本的偶然特点。于是,随机森林的做法是:种很多棵树,每棵树只看随机抽取的一部分样本和一部分特征,最后把所有树的预测取平均。这就像请很多位评委打分再取平均,个别评委的偏见会被相互抵消。因此,随机森林通常比单棵树稳定得多,而且对特征的尺度不敏感,是描述符建模中非常常用的默认选择。
不过,随机森林有一个重要的局限:由于每片叶子的预测都是训练标签的平均值,所以它的预测永远不会超出训练集标签的范围。 例如,训练集中带隙最大是 5 eV,那么它不可能预测出 8 eV。也就是说,随机森林擅长“在见过的范围内插值”,却不擅长外推。
五、高斯过程
前两种模型只给出一个预测值,却不告诉我们这个预测有多可靠。然而,在科研中,“有多确定”往往和“预测是多少”同样重要。于是,这里介绍第三种模型:高斯过程。
它的核心思想很直观:相似的输入,应当有相似的输出。 具体来说,高斯过程先定义一个衡量两个样本有多相似的函数,叫作核函数;然后,预测一个新样本时,参考与它相似的训练样本的标签,并按相似程度加权。因此,如果新样本周围有很多相似的训练样本,预测就比较确定;反过来,如果它离所有训练样本都很远,模型就会给出较大的不确定性。
这正是高斯过程最有价值的地方:它不仅给出预测值,还给出一个误差范围。例如,它可能告诉你“这个材料的形成能约为 −1.2 eV/atom,上下浮动约 0.1”。于是,后面在第六部分做主动学习时,我们就可以优先去计算那些“最不确定”的样本。
但是,高斯过程也有代价。由于它需要比较所有训练样本两两之间的相似度,所以计算量会随样本数急剧增长,通常适合几千个以内的样本。此外,它给出的误差范围是否可信,还取决于核函数选得是否合适,这会在第四部分专门检验。
| 模型 | 优点 | 局限 |
|---|---|---|
| 线性/岭回归 | 简单、透明、训练快 | 只能表达线性关系 |
| 随机森林 | 灵活、稳健、对特征尺度不敏感 | 无法预测超出训练范围的值 |
| 高斯过程 | 同时给出预测和不确定性 | 样本多时计算量很大 |
六、过拟合
讲完模型,现在回到开头埋下的伏笔。假设有两位同学准备考试:第一位理解了知识点,第二位则把练习册的答案逐题背下。于是,在练习册上两人都能拿满分;然而,一到考试换了新题,第二位同学就答不上来了。
模型也会犯同样的错误。当模型过于复杂、而数据又不够多时,它可能把训练数据中的噪声和偶然特点也一并记住,这叫作过拟合。因此,过拟合的典型表现是:训练误差很低,但在没见过的数据上误差明显更高。
例如,用一棵不限深度的决策树拟合 100 个样本,它可以把每个样本都分进单独的叶子,训练误差几乎为 0;可是,换一批新样本,误差却可能比简单的线性模型还大。反过来,如果模型太简单,连训练数据的主要规律都没学到,训练误差和新数据误差都很高,这叫作欠拟合。
所以,判断模型好坏,永远不能只看训练误差,而必须留出一部分模型没见过的数据来检验。至于怎样留、留多少、怎样避免作弊,就是 1.7 节的内容。
七、正则化
既然过拟合来自模型“太自由”,那么解决思路就是给它适当加一些约束,这类方法统称为正则化。
事实上,我们已经见过两个例子。首先,岭回归对大权重的惩罚就是一种正则化,它让模型倾向于更平滑、更简单的解。其次,随机森林中限制每棵树的最大深度、要求每片叶子至少包含若干样本,也起到了同样的作用:不让树分得过细。
此外,还有一种更朴素的正则化:减少特征数量。例如,Magpie 有一百多个特征,而如果只有几百个样本,其中很多特征可能只是在“凑巧”地拟合噪声。因此,先去掉明显无关或高度重复的特征,往往能让模型更稳。
不过,约束也不能太强。正则化过强,模型又会退回欠拟合。所以,正则化的强度需要在“记住细节”和“把握规律”之间取得平衡,而这个平衡点要靠下一小节的方法来确定。
八、超参数
到这里,你可能已经注意到,有些数值是模型自己学出来的,例如线性回归的权重;然而,另一些数值需要我们事先指定,例如岭回归的 λ、随机森林中树的数量和最大深度、高斯过程核函数的形状。后一类数值叫作超参数。
那么,超参数怎么选?最直接的办法是多试几组,看哪一组效果最好。但关键在于“效果”要在哪里衡量:如果用训练数据来挑,就一定会挑中最复杂、最容易过拟合的那组。 因此,正确的做法是另外留出一部分数据作为验证集,在验证集上比较不同超参数的表现,再选最好的一组。
| 模型 | 常见超参数 | 调大后的一般趋势 |
|---|---|---|
| 岭回归 | λ(正则化强度) | 更平滑,可能欠拟合 |
| 随机森林 | 树的数量、最大深度、叶子最少样本数 | 深度越大越容易过拟合 |
| 高斯过程 | 核函数类型与长度尺度 | 长度尺度越大越平滑 |
此外,还需要强调一点:超参数一旦在验证集上选定,最终效果就应当在一份从未参与任何选择的测试集上报告。否则,你报告的其实是“挑过的最好成绩”,而不是模型在新数据上的真实水平。这三份数据怎样划分,正是下一节的主题。
九、自己先判断,再请 AI 核查
现在,先不借助 AI,回答下面三道小题。
- 用 Magpie 描述符预测钻石和石墨的硬度,会遇到什么问题?
- 一个随机森林在训练集上的误差是 0.01 eV/atom,在新数据上是 0.30 eV/atom。这说明什么?应当先调整什么?
- 训练集中形成能的范围是 −3 到 0 eV/atom,随机森林能否预测出 −4 eV/atom?
完成后展开,核对理由
- 两者化学式都是 C,因此组分描述符完全相同,模型只能给出相同的预测;应当改用结构描述符。
- 这是典型的过拟合。可以先限制树的最大深度或增加叶子的最少样本数,并在验证集上比较效果。
- 不能。随机森林的预测是训练标签的平均,因此不会超出训练范围。
接着,可以让 Agent 做一个小实验,亲眼看看过拟合:
请用 matminer 加载一个小型公开材料数据集,计算 Magpie 描述符,分别训练岭回归和不同最大深度的随机森林。请把数据按固定随机种子分为训练集和验证集,画出“最大深度—训练误差/验证误差”曲线,并说明哪个深度开始过拟合。我不需要写代码,但需要你保存数据版本、参数和结果图。
拿到结果图后,找到训练误差继续下降、验证误差却开始上升的那个位置,并用一句话解释它。这样,你就亲手确认了“训练误差低不等于模型好”。下一节,我们将进一步追问:怎样划分数据,才能让验证和测试的结果真正可信?
1.7 可信度基础
上一节,我们看到训练误差低并不代表模型好,因此必须用模型没见过的数据来检验。然而,“没见过”这三个字远比听起来难做到。所以,本节要解决的问题是:怎样划分和使用数据,才能让最后报告的误差真正反映模型在新材料上的表现?
具体来说,我们会依次讨论数据的三种用途、相似样本怎样“偷偷作弊”、预处理为什么也会泄漏信息、指标和基线怎么定,以及交叉验证、外推和误差来源。之所以把这些放在项目一之前,是因为验收标准必须在做项目之前定好;否则,看到结果再改规则,得到的就只是一个好看的数字。
一、训练、验证与测试各自负责什么
先打个比方。准备一门考试时,你会用练习册学习,用模拟卷检查自己、调整复习方法,最后再参加正式考试。于是,练习册、模拟卷和正式考试分别对应机器学习中的三份数据。
| 数据 | 对应 | 负责什么 | 可以用几次 |
|---|---|---|---|
| 训练集 | 练习册 | 让模型学习参数 | 反复使用 |
| 验证集 | 模拟卷 | 比较模型、挑选超参数 | 可以多次使用 |
| 测试集 | 正式考试 | 报告最终效果 | 原则上只用一次 |
其中,最容易被破坏的是测试集。例如,你在测试集上看了结果,觉得不满意,于是回去改模型,再测一次;这样反复几次之后,测试集实际上就变成了第二份验证集。因此,测试集上的成绩只有在它“没有参与任何决定”时才可信。 换句话说,正式考试的题目,不能提前拿来当模拟卷。
一般来说,常见的划分比例是训练 70%~80%、验证 10%~15%、测试 10%~15%。不过,比例本身并不是重点;更重要的是,划分一旦确定,就要把每个样本属于哪一份记录成文件,并在整个项目中保持不变。
二、去重、按体系或组分分组,避免相似样本跨集合
有了三份数据之后,还要检查它们之间是否真的“互不相见”。例如,如果模拟卷里的题和正式考试的题几乎一模一样,那么考试高分就说明不了什么。同样的问题在材料数据里非常普遍。
首先是完全重复。例如,同一种材料可能在数据库里被计算过多次,或者同一个结构以不同的晶胞写法出现了两次。于是,随机划分时,它可能一份进了训练集,一份进了测试集;模型只要“记住”训练集里的那个答案,就能在测试集上答对。因此,划分之前必须先去重,并且正如 1.5 节所说,晶体去重应当比较结构是否本质相同,而不是比较文件是否相同。
其次是高度相似。例如,α-Fe₂O₃ 和 γ-Fe₂O₃ 这两个相,或者 LiCoO₂ 和 NaCoO₂,它们虽然不是同一个样本,却非常相似。所以,如果训练集里有一个,测试集里有另一个,测试就变得偏容易。这时,更可靠的做法是分组划分:先按某种规则把相似样本归为一组,再以组为单位分配到训练、验证或测试集。
| 分组方式 | 同一组包含什么 | 测试的是什么能力 |
|---|---|---|
| 按化学式分组 | 同一化学式的所有相 | 能否预测没见过的化学式 |
| 按化学体系分组 | 由同一组元素构成的所有化合物(如 Li–Co–O) | 能否预测没见过的元素组合 |
| 按结构原型分组 | 结构类型相同的材料 | 能否预测没见过的结构类型 |
那么,应当选哪种分组?这取决于模型将来要怎样使用。例如,如果将来要预测全新元素组合的材料,那么按化学体系分组才能模拟这种场景。因此,先想清楚“模型将来面对的新样本长什么样”,再决定怎样划分。
三、预处理只在训练集拟合
除了样本本身,数据处理的步骤也可能泄漏信息。例如,很多模型要求先把每个特征缩放到相近的范围,常见做法是减去平均值、再除以标准差。然而,问题在于:这个平均值和标准差,是用哪些数据算出来的?
如果用全部数据(包括测试集)来计算,那么测试集的信息就已经悄悄进入了训练过程。这就像复习时偷看了考试成绩的分布,虽然没看到具体题目,但也不再是“完全没见过”。因此,正确的做法是:只在训练集上计算平均值和标准差,然后用同一组数值去变换验证集和测试集。
同理,其他预处理步骤也要遵守这条规则。例如,填补缺失值时用的均值、筛选特征时依据的相关性、降维时用的主成分,都只能从训练集中得到。实际操作中,可以让 Agent 把所有预处理步骤和模型放进同一条“流水线”,这样每次训练时都会自动只用训练集拟合,从而减少人为出错的机会。
四、指标怎么选,简单基线怎么设
划分好数据之后,还需要确定用什么数字来衡量模型。首先,最常用的是平均绝对误差(MAE),即所有样本“预测值与标签之差的绝对值”的平均。因为它的单位和标签相同,例如 eV/atom,所以最容易解释:MAE = 0.1 eV/atom,就表示平均每个样本差 0.1 eV/atom。
其次是均方根误差(RMSE)。它先把误差平方、再平均、最后开方,因此对少数特别大的误差更敏感。于是,如果 RMSE 远大于 MAE,通常说明有一小部分样本预测得特别差,值得单独检查。
此外,还有决定系数 R²,它衡量模型比“一律预测平均值”好了多少。R² 越接近 1 越好;然而,R² 容易受标签分布范围的影响,所以最好和 MAE 一起报告,而不要单独使用。
| 指标 | 单位 | 适合回答的问题 |
|---|---|---|
| MAE | 与标签相同 | 平均每个样本差多少 |
| RMSE | 与标签相同 | 是否存在少数特别大的误差 |
| R² | 无单位 | 相比“预测平均值”好了多少 |
但是,光有指标还不够,因为一个数字本身没有好坏之分。例如,MAE = 0.2 eV/atom 算不算好?这必须和一个基线比较才能知道。最简单的基线就是“不管输入是什么,一律预测训练集的平均值”;稍强一点的基线则是组分描述符加线性回归。因此,如果你的模型连这些简单基线都赢不了,那么再复杂也没有意义。 反过来,如果它明显优于基线,这个提升才值得报告。
五、交叉验证与超参数选择
接下来,考虑一个现实问题:数据量不大时,只留一份验证集,结果可能很依赖“恰好分到了哪些样本”。例如,同一个模型换一种随机划分,验证误差可能从 0.15 变成 0.22。于是,只凭一次划分挑超参数,就可能挑中一个“运气好”的设置。
为了减小这种偶然性,可以使用 k 折交叉验证。具体来说,先把训练数据平均分成 k 份,例如 5 份;然后,轮流用其中 1 份作验证、其余 4 份作训练,一共训练 5 次;最后,把 5 次的验证误差取平均。这样,每个样本都恰好当过一次验证数据,结果也就更稳定。同时,5 次结果之间的差异,还能告诉你这个误差本身有多大的波动。
需要注意的是,交叉验证同样要遵守前面两条规则。首先,如果数据需要分组,那么交叉验证的每一折也要按组划分,否则相似样本仍会跨折泄漏。其次,每一折的预处理都只能在该折的训练部分拟合。
因此,一个完整的流程应当是:先留出测试集并封存;然后,在剩余数据上用交叉验证比较模型和超参数;选定之后,用全部剩余数据重新训练一次;最后,只在测试集上评估一次并报告结果。
六、外推与分布外
即使划分和验证都做得很规范,还有一个问题需要正视:测试集的样本,通常和训练集来自同一个数据库、同一类材料。然而,科研中我们真正关心的,往往恰恰是“和已知材料不太一样”的新材料。
如果新样本落在训练数据覆盖的范围之内,模型做的是插值;反过来,如果新样本的组成、结构或性质超出了训练数据的范围,模型做的就是外推。一般来说,插值时误差较小,而外推时误差往往会明显变大,甚至完全不可信。例如,只用氧化物训练的模型去预测硫化物,或者只用带隙小于 3 eV 的数据训练、再去预测宽带隙材料,就都属于外推。
那么,怎样知道模型的外推能力?一种直接的办法是故意构造外推测试。例如,把含某种元素的所有材料都放进测试集,看模型在“从没见过这种元素”时表现如何。于是,你会得到两组数字:随机划分下的误差,和刻意外推下的误差。通常后者更大,并且两者之间的差距,恰恰说明了模型的适用范围。
因此,报告结果时,最好同时说明测试集与训练集的关系。这个问题会在第四部分的分布外评测中系统展开;现阶段,只需养成一个习惯:看到一个误差数字,先问它是在什么样的测试集上得到的。
七、误差从哪里来
最后,当模型出现误差时,我们需要知道误差来自哪里,这样才能决定下一步该改什么。一般来说,误差有四个主要来源。
| 误差来源 | 含义 | 可能的迹象 |
|---|---|---|
| 标签噪声 | 标签本身就不准或口径不一 | 同一材料在不同来源中数值差别很大 |
| 表示不足 | 描述符没有包含决定性质的关键信息 | 描述符相同的样本,标签却差别很大 |
| 数据不足 | 某类样本太少,模型没学到 | 误差集中在稀有元素或稀有结构上 |
| 模型能力不足 | 模型过于简单,或超参数不合适 | 训练误差本身就很高 |
其中,第一项特别值得重视。例如,如果同一材料的实验带隙在不同文献里相差 0.3 eV,那么无论模型多好,MAE 也很难降到 0.3 eV 以下。换句话说,标签本身的不确定性,决定了模型误差的下限。 因此,看到模型误差已经接近标签噪声时,就不必再费力调模型,而应当回头改善数据。
此外,找到误差来源最好的办法,是逐个查看预测最差的样本。例如,把误差最大的 20 个样本列出来,看它们是否集中在某类元素、某种结构,或者标签本身就有疑问。这样,误差就不再只是一个数字,而变成了下一步改进的线索。
八、自己先判断,再请 AI 核查
现在,先不借助 AI,判断下面三种做法是否有问题。
- 先用全部数据计算特征的平均值和标准差并做标准化,然后再随机划分训练集和测试集。
- 在测试集上比较了 10 组超参数,报告其中最好的一组测试误差。
- 数据中同一化学式有多个相,随机划分后,模型测试 MAE 很低,于是认为它能很好地预测新化学式。
完成后展开,核对理由
- 有问题。标准化用到了测试集的信息,属于预处理泄漏;应当先划分,再只在训练集上拟合标准化参数。
- 有问题。测试集被用来挑选超参数,已经变成了验证集;报告的误差会偏乐观。
- 有问题。随机划分让同一化学式的不同相分散在训练和测试中,测试偏容易;要评估对新化学式的能力,应当按化学式分组划分。
接着,可以请 Agent 做一个对照实验:
请用同一份公开材料数据集、同一套 Magpie 描述符和随机森林,分别在“随机划分”和“按化学体系分组划分”下做 5 折交叉验证,报告两种划分的 MAE 平均值和波动,并与“预测训练集平均值”的基线比较。请保存划分清单、随机种子和参数,并列出分组划分下误差最大的 20 个样本。
拿到结果后,比较两种划分的 MAE 相差多少,并试着从误差最大的样本中找出一个共同点。这样,你就为项目一准备好了一套验收规则。下一节,我们就按这套规则,完整地做一次预测项目。
1.8 项目一
到这里,第一部分的工具和概念都已经齐备:1.1 节到 1.4 节让我们看懂分子与晶体,1.5 节把结构写成可追溯的数据,1.6 节学会用描述符和经典模型做预测,而 1.7 节则定好了怎样诚实地验收。于是,本节就把这些串成一个完整的小项目:用描述符加经典模型预测一个材料性质,并且诚实地评估它。
需要强调的是,这个项目的目标并不是追求最低的误差,而是完整地走一遍“定问题—定规则—建模型—比基线—查错误—留记录”的流程。因此,一个误差不算低、但每一步都说得清的项目,远比一个误差很低、却讲不清数据怎么划分的项目更有价值。
一、选择性质,核对标签来源、单位与计算设置
首先,要选一个预测目标。对于第一个项目,建议选数据公开、规模适中、只需化学式就能建模的任务。例如,本节以实验带隙为例:输入是材料的化学式,标签是实验测得的带隙,单位为 eV。这类数据可以通过 matminer 加载公开的基准数据集(例如 Matbench 中的实验带隙任务),规模在几千条左右,适合在个人电脑上完成。当然,你也可以换成形成能等其他性质,只要按下面的步骤做同样的检查即可。
接着,在动手建模之前,先像 1.5 节那样核对标签。具体来说,至少回答下面几个问题:
| 核对问题 | 为什么重要 |
|---|---|
| 标签的单位是什么 | 单位弄错,后面所有误差都没有意义 |
| 来自实验还是计算 | 实验带隙与 PBE 计算带隙存在系统差异,不能混用 |
| 数据集的出处与版本 | 以后别人要能找到同一份数据 |
| 有多少条、是否有重复 | 重复化学式会导致训练和测试之间泄漏 |
| 标签分布是什么样 | 例如大量带隙为 0 的金属,会影响模型和指标的解读 |
其中,最后一项尤其值得先看一眼。例如,如果数据中有相当比例的样本带隙为 0,那么一个总是预测 0 附近的模型,也可能得到看似不错的 MAE。因此,先画出标签的分布直方图,再决定怎样解读后面的误差。 把这些检查结果写进一份简短的数据说明,作为项目的第一份记录。
二、固定数据划分、预处理与评测指标
标签核对无误之后,下一步是在看到任何模型结果之前,把验收规则全部定下来。之所以强调顺序,是因为一旦先看了结果,就很难不被结果影响规则。
具体来说,需要固定以下几项。首先,去重:确认同一化学式只保留一条记录,或者对重复记录的处理方式写清楚。其次,划分:按 1.7 节的做法,先留出 15%~20% 作为测试集并封存;然后在剩余数据上做 5 折交叉验证。并且,为了同时了解模型的外推能力,建议准备两套划分:一套随机划分,另一套按化学体系分组划分。再次,预处理:所有标准化和特征筛选都只在训练部分拟合。最后,指标:以 MAE(eV)为主指标,同时报告 RMSE 和 R²。
于是,这一步的产物应当是一组文件:划分清单(每个样本属于哪一份)、随机种子、预处理设置和指标定义。这样,任何人拿到这些文件,都能复现同一套验收规则。
三、用描述符加经典模型预测一个性质
规则定好之后,才开始建模。首先,由于输入只有化学式,所以选用 1.6 节介绍的 Magpie 组分描述符,把每个化学式变成一百多个数字。接着,检查描述符是否有计算失败的样本,例如包含罕见元素而查不到元素性质;这些样本同样不能悄悄丢掉,而要记录下来。
然后,训练两到三个模型进行比较。例如,岭回归作为简单透明的线性模型,随机森林作为灵活稳健的非线性模型;如果样本数不太多,还可以加上高斯过程,以便观察不确定性。同时,每个模型的超参数都在交叉验证中选择,例如岭回归的 λ、随机森林的最大深度和树的数量。
在此过程中,你并不需要自己写代码,但需要像项目负责人一样给 Agent 下达清楚的任务卡。例如:
请按我提供的划分清单和随机种子,用 Magpie 描述符分别训练岭回归和随机森林。超参数在 5 折交叉验证中选择,候选范围写进配置文件;预处理只在每折的训练部分拟合。请输出每个模型在随机划分和分组划分下的交叉验证 MAE 均值与波动,并保存模型、配置和运行日志。在我确认之前,不要在测试集上评估。
注意最后一句:测试集要等所有选择都做完之后,才能打开一次。
四、与简单基线比较,检查误差与失败样本
交叉验证选定模型之后,就可以在测试集上做唯一一次评估。然而,拿到测试 MAE 之后,还不能立刻下结论;相反,要先和基线比较。具体来说,至少准备两个基线:一是“一律预测训练集平均值”,二是“Magpie 加岭回归”。于是,结果可以整理成下面这样一张表:
| 模型 | 随机划分 MAE(eV) | 分组划分 MAE(eV) |
|---|---|---|
| 预测训练集平均值 | 填入结果 | 填入结果 |
| Magpie + 岭回归 | 填入结果 | 填入结果 |
| Magpie + 随机森林 | 填入结果 | 填入结果 |
读这张表时,可以依次问三个问题。首先,最好的模型比“预测平均值”好了多少?如果好得不多,说明描述符或模型并没有学到太多规律。其次,随机划分和分组划分的误差差了多少?差距越大,说明模型越依赖“见过相似的材料”,外推能力也就越弱。最后,模型之间的差异是否超过了交叉验证中的波动?如果没有,就不能说一个模型明显更好。
接着,要查看误差最大的样本。例如,把测试集中误差最大的 20 个样本列出来,逐个看它们的化学式、标签和预测值。于是,你可能会发现一些规律:它们也许集中在含过渡金属的化合物上,也许是真实带隙很大、而模型预测偏低,也许标签本身就可疑。同时,还可以画一张“预测值—真实值”散点图,看看模型是否系统性地高估或低估某一范围的样本。这些发现,比测试 MAE 本身更能说明模型的能力和边界。
五、保存数据版本、模型与评测记录
最后,项目做完并不等于结束,还要让它能被复现和交接。正如 0.3 节所说,一次运行应当留下足够的记录,使别人(或几个月后的你)能重新得到同样的结果。因此,项目一至少应当保存以下内容:
| 类别 | 应保存的内容 |
|---|---|
| 数据 | 数据集名称、版本或下载日期、去重规则、数据说明 |
| 划分 | 划分清单、随机种子、分组规则 |
| 特征 | 描述符类型与版本、计算失败的样本清单 |
| 模型 | 模型类型、超参数候选范围与最终取值、训练好的模型文件 |
| 评测 | 各模型与基线的指标表、散点图、误差最大样本的分析 |
| 环境 | Python 与主要库的版本、运行命令、Agent 的操作记录 |
然后,请你用自己的话写一段不超过 300 字的结论,至少回答三个问题:模型比基线好多少?它在什么样的材料上表现较差?它能否用来预测全新元素组合的材料?这里,结论要和证据对应,例如“分组划分下 MAE 明显增大,因此对新化学体系的预测应谨慎”。能诚实地写出模型做不到什么,是这个项目最重要的收获之一。
六、验收清单与承上启下
在提交项目之前,对照下面的清单逐项确认:
- 标签的单位、来源和版本已写进数据说明。
- 划分清单和随机种子在建模之前就已固定,并且测试集只评估了一次。
- 预处理只在训练部分拟合。
- 结果表中包含至少两个基线,以及随机划分和分组划分两组结果。
- 列出并分析了误差最大的样本。
- 另一台电脑按记录重新运行,能得到相同或非常接近的指标。
常见问题:结果不理想怎么办?
- 如果模型只比“预测平均值”略好,先检查标签分布和描述符是否计算正确,再考虑增加结构信息。
- 如果分组划分的误差远大于随机划分,这不是项目失败,而是一项有价值的发现;把它写进结论即可。
- 如果看了测试结果后想改模型,那么改完之后,原来的测试集已经不再“干净”;应当在记录中如实说明,必要时重新划分一份新的测试集。
完成项目一之后,你已经走完了一条最基本的“结构 → 数据 → 模型 → 评估”的路线。然而,这条路线中有一个环节始终被当成了“给定”:标签从哪里来?为什么计算得到的带隙会和实验不同?于是,第二部分就从电子与能量出发,讲清 DFT 怎样算出这些标签,以及它们各自带着怎样的误差。
1.9 知识总结
学完第一部分,我们已经从原子和化学键出发,一路走到了第一个预测模型。不过,内容一多,重点就容易散开。因此,本节不讲新知识,而是把最重要的结论收拢成一张清单,方便你随时回看。
一、化学与结构
- 首先,结构式记录的是连接关系。 因此,分子式相同的乙醇和二甲醚,仍是两种不同的分子(1.1、1.2)。
- 其次,二维图不等于三维结构。 所以,ChemDraw 里的图只说明连接和立体化学,真实构象要另外生成或读取。
- 再者,晶体只需描述一个晶胞。 这是因为周期性保证了,晶格参数加原子坐标就能拼出整块晶体(1.3)。
- 同时,数原子时要按共享比例折算。 例如,顶点算 1/8,面心算 1/2;于是,NaCl 常规晶胞中共有 4 个 Na 和 4 个 Cl。
- 另外,只写化学式并不够。 换句话说,同一化学式可以有不同的相,所以还要说明结构和条件。
二、查看与记录
- 首先,VESTA 用来查看和检查,而不是修改结构。 因此,Boundary 只改变显示多少原子,并不改变结构本身(1.4)。
- 其次,先核对数字,再看图像。 也就是说,元素、晶格参数、坐标类型和原子数都要先对上。
- 此外,分数坐标和笛卡尔坐标不能混用。 否则,同一组数字会被放到完全不同的位置(1.3、1.5)。
- 并且,周期体系中的距离要取最近的周期副本。 所以,把晶体误当成孤立分子时,跨边界的邻居就会“消失”。
- 最后,一个标签应当写全“数值 + 单位 + 来源 + 设置 + 版本”。 这样,不同口径的数据才不会被混在一起训练。
三、建模与评估
- 首先,模型不能直接吃原始坐标。 这是因为平移、旋转或调换原子顺序都会改变坐标,却不改变结构,所以要先转成描述符(1.5、1.6)。
- 其次,训练误差低不代表模型好。 因此,必须用模型没见过的数据来检验,并警惕过拟合。
- 同时,测试集只能用一次。 也就是说,一旦用它挑过模型,它就变成了验证集(1.7)。
- 此外,相似样本不能跨集合,预处理也只在训练集上拟合。 否则,信息会悄悄泄漏,误差也会偏乐观。
- 并且,结果要和简单基线比较。 换句话说,连“预测平均值”都赢不了的模型,再复杂也没有意义。
- 最后,看到一个误差数字,先问它来自什么样的测试集。 例如,分组划分和随机划分之间的差距,恰恰说明了模型的适用范围。
四、一条主线
总的来说,第一部分走的是这样一条路线:结构 → 可追溯的数据 → 描述符 → 模型 → 诚实的评估。 其中,每一步都要留下记录,这样别人才能复现你的结果(1.8)。
那么,你是否真正掌握了这些内容?不妨合上课本,试着用自己的话向 AI 复述上面三组要点,再请它指出你漏掉或说错的地方。接下来,第二部分将回答一个始终被当作“给定”的问题:这些标签究竟是怎样算出来的。