☰
基于图神经网络与迭代精修的抗体序列-结构协同设计
2026/10/22 10:14:46 网站建设 项目流程

1. 从一条序列到一整个抗体:这个项目到底在解决什么问题

抗体设计这件事,做过的人都知道它有多拧巴。你手里有一条轻链一条重链的氨基酸序列,脑子里想的是它折叠出来能不能精准地抱住那个抗原表位,可实际做起来,序列空间大到离谱,结构约束又极其苛刻。传统路子要么靠免疫动物慢慢筛,要么靠噬菌体展示建大库碰运气,周期长、成本高,而且很多时候你明明知道某个CDR环区需要什么样的构象,却找不到对应的序列。

这个项目标题里的关键词是“Iterative Refinement”和“Sequence-Structure Co-design”,翻译成人话就是:让模型一边改序列,一边看结构,改完再看,看完再改,来回迭代,直到序列和结构互相匹配、互相成就。它不是先设计序列再预测结构那种单向流水线,而是把序列和结构当成一对需要反复协商的搭档,在每一轮迭代中同时更新。

我第一眼看到这个思路的时候,脑子里蹦出来的类比是雕塑。传统方法像是一刀切下去就不管了,而这个迭代精修更像是先粗雕出轮廓,然后拿小凿子一点点修,每修一刀都退后两步看看整体比例对不对,再决定下一刀往哪儿走。对于抗体这种对局部构象极度敏感的分子,这种“边看边改”的策略显然更合理。

这个项目适合谁看?如果你是做计算抗体设计的,不管是学术圈还是工业界,只要你在用深度学习做蛋白设计,这篇东西的架构思路和训练技巧都值得细抠。如果你刚入门结构生物学或者图神经网络,想找一个把两者结合得比较紧的案例,这个项目也是一个很好的切入点。哪怕你只是好奇“AI怎么设计抗体”这件事,看完也能明白整个流程的骨架长什么样。

2. 整体架构拆解:为什么是图神经网络加迭代精修

2.1 抗体作为图结构:节点和边到底代表什么

抗体本质上是一条氨基酸链,但如果你只把它当成一维序列来处理,就丢掉了空间信息。图神经网络的核心思想是把抗体表示成一张图:每个氨基酸残基是一个节点,节点特征包括残基类型、二面角、溶剂可及性等;边则代表残基之间的空间邻近关系或者序列上的邻接关系。

这里有个关键设计决策:边怎么定义。如果只用序列邻接,那就退化成了一维卷积;如果只用空间距离阈值,那在迭代初期结构还不准的时候,图结构会非常嘈杂。我推测这个项目采用的是混合策略——序列上相邻的残基一定有边,空间距离小于某个阈值的残基之间也加边,这样既保留了序列的局部性,又引入了结构的全局约束。

节点特征的维度通常不会太高,几十到一百多维就够了。残基类型用one-hot或者学习到的embedding,二面角用sin/cos编码避免角度跳变,溶剂可及性归一化到0到1之间。这些细节看起来琐碎,但实际训练时,特征工程做得好不好直接决定模型能不能收敛。

2.2 迭代精修的循环机制:每一轮到底在更新什么

这个项目最核心的创新点就是“迭代精修”。具体来说,模型不是一次性输出序列和结构,而是维护一个当前估计,然后每一轮做两件事:第一,根据当前结构更新序列;第二,根据更新后的序列再更新结构。听起来简单,但里面的门道很多。

第一轮的时候,结构可能只是一个粗糙的初始猜测,比如用RoseTTAFold或者AlphaFold预测出来的骨架。序列也是初始的种系序列。然后模型开始迭代:序列更新模块会看当前结构,判断哪些位置需要突变来更好地稳定结构或者结合抗原;结构更新模块会看新序列,重新预测骨架和侧链构象。这个过程重复若干轮,直到序列和结构的变化量小于某个阈值。

为什么要迭代而不是一步到位?因为序列和结构之间的关系是高度非线性的。你改一个残基,可能影响局部构象,局部构象变了又可能影响远端残基的相互作用。一步到位的模型很难捕捉这种长程耦合,而迭代精修相当于给了模型多次“思考”的机会,每次只做小幅调整,逐步逼近一个自洽的解。

2.3 为什么不用扩散模型或者自回归模型

现在做蛋白设计,扩散模型很火,自回归模型也很常见。但这个项目选了图神经网络加迭代精修,背后有它的道理。扩散模型生成质量高,但采样速度慢,而且对于抗体这种需要精确控制CDR长度的场景,扩散模型的随机性有时候反而是个麻烦。自回归模型按顺序生成残基,天然适合序列生成,但它很难同时保证结构的合理性,因为结构约束是全局的,而自回归是局部的。

图神经网络的优势在于它天然处理关系数据,抗体里的残基相互作用本来就是一张图。迭代精修则解决了图神经网络一次性预测不准的问题。两者结合,既保留了图结构对空间关系的建模能力,又通过迭代弥补了单次预测的不足。这个选型思路我觉得很务实,不是追热点,而是看问题本身需要什么。

3. 核心模块细节:序列更新和结构更新到底怎么实现

3.1 序列更新模块:从结构到序列的逆向推理

序列更新模块的任务是:给定当前的结构估计,输出每个位置应该是什么氨基酸。这本质上是一个图上的节点分类问题。输入是结构图的节点特征和边特征,输出是每个节点属于20种氨基酸的概率分布。

网络结构通常是几层图卷积或者图注意力层,加上残差连接和层归一化。图注意力在这里特别有用,因为抗体不同区域的重要性差异很大。CDR区域尤其是CDR-H3,对结合特异性影响最大,模型应该学会把注意力集中在这些区域。而框架区相对保守,注意力可以分散一些。

训练序列更新模块的时候,损失函数通常是交叉熵,但直接优化交叉熵有个问题:模型可能会过度自信地预测某个残基,而忽略了序列的多样性。实际做抗体设计时,你往往希望模型给出多个候选序列,而不是一个确定性的答案。所以有些实现会加入温度采样或者top-k采样,在推理阶段增加多样性。

还有一个细节是掩码策略。训练时不能把所有残基都暴露给模型,否则模型会学会抄答案。通常的做法是随机掩码一部分残基,让模型根据上下文预测被掩码的位置。掩码比例一般控制在15%到30%之间,太低学不到东西,太高上下文信息不足。

3.2 结构更新模块:从序列到结构的正向预测

结构更新模块的任务是:给定当前序列,预测每个残基的三维坐标。这个模块比序列更新更难,因为三维坐标是连续值,而且需要满足物理约束,比如键长键角不能太离谱,残基之间不能有原子碰撞。

常见的做法是把结构预测拆成两步:先预测主链的二面角,再根据二面角重建主链坐标;侧链构象则用旋转异构体库来离散化预测。二面角预测用回归损失,通常是预测sin和cos值,避免角度周期性带来的不连续问题。侧链预测用分类损失,每个残基的侧链构象从几十个常见旋转异构体里选一个。

结构更新模块的网络结构通常比序列更新模块更深,因为结构预测需要更大的感受野。除了图卷积层,可能还会加入一些全局注意力层,让模型能够捕捉远端残基之间的相互作用。等变图神经网络在这里特别合适,因为抗体结构在旋转和平移下应该保持不变性,等变网络天然满足这个性质。

训练结构更新模块时,损失函数通常是预测坐标和真实坐标之间的均方误差,再加上一些物理约束的惩罚项。比如键长偏离理想值的惩罚,原子碰撞的惩罚。这些惩罚项的权重需要仔细调,权重太大模型会变得保守,权重太小物理上不合理。

3.3 迭代精修的调度策略:什么时候停,怎么停

迭代精修不是无限循环,需要有一个停止条件。最简单的做法是固定迭代轮数,比如5轮或者10轮。但固定轮数有个问题:有些样本可能3轮就收敛了,有些可能需要15轮。固定轮数要么浪费计算资源,要么欠拟合。

更聪明的做法是监控序列和结构的变化量。每一轮迭代后,计算当前序列和上一轮序列的差异,以及当前结构和上一轮结构的RMSD。如果两个变化量都小于某个阈值,就提前停止。这个阈值需要根据任务来调,太大会导致欠拟合,太小会导致计算浪费。

还有一个策略是课程学习:初期迭代时允许较大的变化,后期逐渐收紧。这可以通过调整学习率或者调整损失函数中的正则项来实现。初期让模型大胆探索,后期让模型精细调整。这个思路和人类设计师的工作方式很像,先定大框架,再抠细节。

4. 实操流程:从零开始跑通一个抗体设计任务

4.1 数据准备:抗体结构数据的获取和清洗

做抗体设计,数据是第一步。公开的抗体结构数据库里,最常用的是SAbDab和PDB。SAbDab专门收集抗体结构,标注了CDR区域和种系基因,用起来比较方便。PDB更全,但需要自己写脚本筛选抗体结构。

下载完数据后,清洗是关键。首先要去除分辨率低的结构,通常只保留2.5埃以内的。然后要去除缺失残基太多的结构,尤其是CDR区域有缺失的,直接扔掉。还要去除重复结构,同一个抗体可能有多个晶体结构,保留一个质量最好的就行。

清洗完之后,需要做序列比对和编号。抗体有专门的编号方案,比如Kabat、Chothia、IMGT。不同编号方案对CDR的界定略有差异,做设计时通常用IMGT或者Kabat。编号之后,每个残基都有一个唯一的位置标识,方便后续处理。

数据集的划分也很重要。不能随机划分,因为同一个抗体的不同突变体如果分到训练集和测试集,会导致数据泄漏。正确的做法是按抗体克隆划分,同一个克隆的所有结构要么都在训练集,要么都在测试集。更严格的做法是按种系基因划分,确保测试集的种系基因在训练集中没出现过。

4.2 模型训练:损失函数设计和超参数调优

训练这个模型,损失函数是序列损失和结构损失的加权和。序列损失用交叉熵,结构损失用坐标MSE加上物理约束惩罚。两个损失的权重需要调,通常结构损失的权重要大一些,因为结构预测更难。

优化器用Adam,学习率从1e-4开始,配合余弦退火或者ReduceLROnPlateau。批量大小受限于GPU显存,抗体结构通常几百个残基,批量大小32或者64比较常见。训练轮数一般几百轮,早停策略根据验证集损失来定。

超参数调优的重点是迭代轮数、图卷积层数、隐藏层维度。迭代轮数太少模型学不到东西,太多容易过拟合。图卷积层数决定了感受野,抗体这种中等大小的蛋白,4到6层通常够了。隐藏层维度128到256之间比较常见,太小表达能力不足,太大容易过拟合。

训练过程中要监控序列恢复率和结构RMSD。序列恢复率是预测序列和真实序列一致的比例,结构RMSD是预测结构和真实结构的偏差。这两个指标要同时看,不能只看一个。有时候序列恢复率高但结构RMSD也高,说明模型记住了序列但没学到结构。

4.3 推理阶段:如何生成多个候选抗体序列

训练完之后,推理阶段的目标是生成多个候选序列,而不是一个确定性的输出。做法是在序列更新模块的输出上做采样,用温度参数控制多样性。温度高,采样结果多样但可能不合理;温度低,采样结果保守但可能缺乏新意。

通常的做法是生成几百到几千个候选序列,然后用结构更新模块预测每个候选的结构,再用一些打分函数筛选。打分函数包括结构合理性打分、结合亲和力预测打分、免疫原性预测打分等。筛选出排名靠前的几十个候选,再做进一步分析。

推理时还有一个技巧是约束采样。如果你知道某些残基必须保守,比如二硫键的半胱氨酸,可以在采样时强制这些位置输出特定氨基酸。如果你知道CDR-H3的长度范围,可以在采样时限制这个区域的长度。这些约束可以显著提高候选序列的可用性。

5. 常见问题与排查技巧实录

5.1 模型不收敛或者损失震荡怎么办

这是训练图神经网络最常见的问题。首先检查数据预处理,看看有没有异常值或者标签错误。抗体结构数据里经常有缺失原子或者非标准残基,这些如果不处理,会导致损失计算错误。

然后检查学习率。学习率太大,损失会震荡;学习率太小,收敛太慢。可以画学习率扫描曲线,找一个使损失下降最快的值。另外,梯度裁剪也很重要,图神经网络容易出现梯度爆炸,裁剪阈值通常设在1.0到5.0之间。

如果数据和超参数都没问题,那可能是模型架构的问题。图卷积层数太多会导致过平滑,所有节点的表示变得相似。可以加入残差连接或者跳跃连接来缓解。另外,层归一化和dropout也有帮助,但dropout率不能太高,否则欠拟合。

5.2 生成的序列多样性不足怎么办

多样性不足通常是因为采样温度太低,或者模型过拟合了训练集。提高采样温度可以增加多样性,但温度太高会导致序列不合理。一个折中的做法是用核采样,只从累积概率前k个氨基酸里采样,既保证多样性又保证合理性。

另一个原因是训练数据多样性不够。如果训练集里只有几种抗体家族,模型学到的序列空间就很窄。解决办法是扩充训练数据,或者用数据增强,比如随机旋转平移结构、随机掩码残基。

还有一个技巧是在损失函数里加入多样性正则项,鼓励模型输出不同的序列。这个正则项可以是序列之间的熵,或者序列之间的汉明距离。加入正则项后,模型会在准确性和多样性之间做一个权衡。

5.3 结构预测的物理合理性怎么保证

结构预测模块有时候会输出物理上不合理的结构,比如键长太长、原子重叠。这通常是因为物理约束的惩罚项权重不够。可以加大键长和键角的惩罚权重,或者加入更复杂的物理势能项。

另一个做法是在结构更新后做一次能量最小化,用分子力学力场把结构松弛一下。这个步骤可以显著改善结构的物理合理性,但会增加计算时间。如果对速度要求不高,这个步骤很值得加。

还有一点是侧链构象的合理性。侧链预测用的是旋转异构体库,但有时候模型会选一个概率很低但看起来合理的构象。可以在推理时限制只能选概率排名前几的旋转异构体,保证侧链构象在统计上是合理的。

5.4 常见问题速查表

问题现象可能原因排查方法解决思路
损失震荡不下降学习率过大或梯度爆炸画损失曲线,检查梯度范数降低学习率,加梯度裁剪
序列恢复率高但RMSD高模型记住序列但没学结构分别看序列和结构损失加大结构损失权重,加物理约束
生成序列多样性不足采样温度低或过拟合检查采样参数,看训练集多样性提高温度,用核采样,加多样性正则
结构物理不合理物理约束权重不够检查键长键角分布加大惩罚权重,加能量最小化
迭代不收敛迭代轮数不够或太多监控每轮变化量调整迭代轮数,加早停策略
显存不够批量太大或图太大看GPU显存占用减小批量,用梯度累积

6. 这个项目的延展空间和实际应用场景

6.1 从抗体到其他蛋白:框架的通用性

虽然这个项目是针对抗体设计的,但它的框架其实可以迁移到其他蛋白设计任务。比如纳米抗体、T细胞受体、甚至酶的设计。核心思想是一样的:序列和结构需要协同设计,迭代精修可以逐步逼近自洽解。

迁移的时候需要注意几点。不同蛋白的序列长度差异很大,图神经网络的感受野需要调整。不同蛋白的保守区域不同,掩码策略需要重新设计。不同蛋白的功能约束不同,损失函数需要加入相应的惩罚项。但整体架构不用大改,这体现了这个项目设计的通用性。

6.2 和实验验证的衔接:从计算到湿实验

计算设计出来的抗体,最终要拿到湿实验里验证。这个衔接环节很关键,也很容易出问题。计算模型给出的候选序列,需要先做小规模表达纯化,看能不能折叠、稳不稳定。然后做结合实验,比如ELISA或者SPR,看能不能结合抗原。最后做功能实验,比如中和实验或者细胞实验。

从计算到实验,最大的挑战是计算模型的预测和实验结果之间的差距。模型说结合亲和力高,实验可能测出来不结合。这个差距可能来自模型本身的误差,也可能来自实验条件的差异。解决办法是迭代反馈:把实验结果反馈给模型,让模型学习实验数据,逐步缩小差距。

6.3 计算资源的实际需求

跑这个项目需要什么样的硬件?训练阶段,如果抗体结构在几百个残基,批量大小32,图卷积层数6层,隐藏层维度256,大概需要一张24GB显存的GPU。如果显存不够,可以减小批量或者用梯度累积。推理阶段需求小一些,一张16GB的GPU就够了。

训练时间取决于数据量和迭代轮数。如果训练集有几千个抗体结构,训练几百轮,大概需要几天时间。如果数据量更大,可能需要一周以上。推理阶段生成几千个候选序列,每个序列迭代5到10轮,大概需要几个小时。

如果计算资源有限,可以考虑用预训练模型做微调,而不是从头训练。预训练模型可以在大规模蛋白结构数据上训练,然后在小规模抗体数据上微调。这样可以显著减少训练时间和数据需求。

6.4 我个人在实际操作中的几点体会

第一,数据质量比数据数量重要。我试过用几万个低质量结构训练,效果还不如几千个高质量结构。抗体结构尤其如此,CDR区域的构象对结合影响最大,如果这部分数据质量差,模型学到的就是错的。

第二,迭代精修的轮数不是越多越好。我试过10轮、20轮、甚至50轮,发现5到10轮通常就够了。再多轮数,变化量已经很小,但计算时间线性增加。实际用的时候,监控变化量提前停止比固定轮数更划算。

第三,序列和结构的联合优化比单独优化难很多。训练的时候经常出现一个模块好了一个模块差了,需要仔细调损失权重。我的经验是先用序列数据预训练序列模块,再用结构数据预训练结构模块,最后联合微调。这样比从头联合训练稳定得多。

第四,推理阶段的筛选策略很关键。生成几千个候选,如果没有好的筛选策略,等于白生成。我通常用结构合理性、结合亲和力预测、免疫原性预测三个维度打分,然后取交集。这样筛出来的候选,实验验证的成功率会高很多。

这个方向还在快速演进,新的架构和训练技巧层出不穷。但核心思路——序列和结构协同设计、迭代精修——我觉得会一直有效。毕竟抗体设计这件事,本质上就是在序列空间和结构空间之间找一个自洽的解,而迭代精修是找这个解的最自然的方式。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询