搞蛋白设计的朋友最近应该都被SimpleDesign刷了一波屏。Apple和Mila两家的研究团队放出来的这个名字看着不起眼但做的事儿其实挺大——它想用一个Transformer把蛋白的氨基酸序列和三维结构直接联合生成出来不是像以前那样先设计结构再设计序列、分两步走。我自己的第一反应是这条技术路线早晚会有人做但真正把“序列结构”塞进同一个模型联合生成的公开的工作其实不多。ProteinMPNN解决了“给定骨架找序列”RFdiffusion解决了“给定功能约束找骨架”AlphaFold解决了“给定序列猜结构”。SimpleDesign想干的是另一件事——不给定任何一方直接采样出一对合理的“序列结构”组合。这个思路一旦跑通意义不只是多了一个生成模型而是把蛋白质从头设计从“两段式管线”变成了“单模型一把梭”。这篇文章我不打算只复述公开报告而是把它放在整个计算蛋白设计的坐标系里拆一遍联合生成到底难在哪、一个Transformer怎么同时管序列和结构两摊事、数据怎么准备、模型怎么训、指标怎么评、实际用起来有哪些坑。这中间不少细节是我自己从ProteinMPNN、RFdiffusion这些模型里折腾出来的经验供各位参考。1. 蛋白质设计为什么需要“联合生成”1.1 序列、结构、功能之间的耦合远比你想象的紧做蛋白设计的开口就是“序列决定结构结构决定功能”。这句话在天然蛋白里基本上成立但在设计场景里它反过来才是真正的主战场我们想要某种功能功能来自结构结构由序列折叠而来。问题是这个映射不是简单的一一对应而是多对多。同一段主链骨架能容纳的氨基酸组合很多但真正能稳定折叠成目标构象的只有一小撮。同一个功能位点比如酶催化口袋、抗体CDR区可以在不同的骨架拓扑上实现。甚至同一条序列在溶液条件下可能同时存在多种构象状态。这些模糊性意味着什么呢意味着如果你把“给定结构找序列”和“给定序列找结构”拆成两个独立模型每一步都在丢失信息误差会累积。我举个具体例子。用固定骨架设计序列你得到的是“在这个骨架上的最优序列”但你不一定知道这个骨架本身是不是可折叠的、是不是低能量构象。反过来给定序列预测结构AlphaFold确实很准但预测精度本身有上限尤其对设计出来的新序列预测置信度不能直接等同于实验折叠概率。简单说分步做每一步的误差都在给下一步挖坑。SimpleDesign这类联合生成模型想解决的就是这个耦合问题——让模型在生成序列的每一个残基的同时也生成这个残基对应的空间位置两者共享同一个隐空间互相约束互相校正。这相当于把“序列空间”和“结构空间”当成一个联合分布来学而不是两个条件分布来回倒腾。1.2 传统两步法和扩散模型管线到底卡在哪现在主流的设计管线长这样先用RFdiffusion这类扩散模型生成一个主链骨架再把骨架喂给ProteinMPNN找序列最后用AlphaFold2自洽验证。这套管线很好用我自己的项目里也一直在用但它有几个让人很不舒服的地方。第一是骨架前置了后面的序列没有选择权。RFdiffusion生成的骨架有些地方天然不适合某些氨基酸组合但序列设计这一步只能硬着头皮在这个骨架上找最优解。有时候ProteinMPNN序列恢复率很高但AlphaFold验证时却折叠成另一个拓扑原因就是骨架本身的信息不足序列再怎么凑也没用。第二是误差累积。扩散模型生成的骨架有噪声这个噪声会一路传导到序列设计、再传导到结构验证。每一步的误差在数学上很难追踪调试成本极高。你很难判断最后失败是因为骨架不好、序列不好还是验证模型本身就不准。第三是效率。整套管线跑完一轮要几分钟到几十分钟做大规模筛选时计算开销很实际。当然分布式可以解决部分问题但架构上的冗余依然存在——你等于用三个模型接力完成一个生成任务每个模型都有自己的偏置。联合生成的意义恰恰在于把这些步骤压缩成一个优化目标。模型端到端地学习“什么序列搭配什么结构是合理的”而不是先后学习“什么结构合理”和“什么序列适配这个结构”。这个思路在别的领域其实很成熟——图像生成里从“先生成轮廓再填色”进化到“一步生成整张图”靠的就是联合分布建模。2. SimpleDesign的解题思路一个Transformer如何同时管两件事2.1 用统一的token表示把序列和结构拉进同一张“牌桌”一句话说清楚设计思路如果每个残基既是一个氨基酸token又是一个携带空间坐标的结构token那模型就可以在同一个自回归框架里每推进一步就同时决定“这里放什么氨基酸”和“这个氨基酸放在哪”。其实怎么把结构信息表示成token是这类模型最核心的设计取舍。我的经验是结构信息不能直接用绝对坐标原因很简单分子在三维空间里平移、旋转之后坐标全变了但它是同一个蛋白。如果你拿绝对坐标做监督模型就会把坐标原点和方向学进参数里换一个坐标系就报废。所以结构token通常要用内部坐标或者相对几何量来表示。常见做法有这么几种残基间的Cα距离矩阵。一个L残基的蛋白就是L×L的距离矩阵SE(3)不变信息也够用。骨架二面角φ、ψ、ω。这个表示很紧凑且物理意义明确一个残基一个三元组。问题是丢失了一些远程几何细节。侧链扭转角χ角加上主链二面角构成完整的内坐标描述。更高阶的做法是用“帧”表示frame-based representation每个残基定义一个局部坐标系用残基之间的相对旋转和平移来表示空间关系。AlphaFold和RFdiffusion内部都用了类似的思路。SimpleDesign既然是“一个Transformer直接联合生成”我判断它大概率走的是统一token路线的变体——序列token和结构token交错排列或者序列为主、结构作为附加的几何轨道并行输入。为什么要强调Transformer因为Transformer的注意力机制天然能处理变长输入并且能建模长程依赖而蛋白质折叠最需要的就是长程残基之间的协同作用。自回归生成时模型的行为可以这样理解每到一个位置它会看一眼已经生成的所有序列token和结构token然后预测下一个氨基酸的分布、以及下一个残基的空间位置。注意这里的“空间位置”必须是相对此前所有残基的位置这样模型才不需要一个绝对坐标系。2.2 注意力机制怎么捕捉远程协同很多人一看到Transformer就问“这和LSTM有什么区别”在蛋白设计里这个区别非常本质。蛋白质折叠的远程接触是决定拓扑结构的关键力量一个α螺旋中相距几百个残基的两段可能在三维空间里贴在一起形成稳定核心。LSTM这类序列模型处理这种长程依赖非常吃力而Transformer的注意力机制允许任意两个位置直接交互信息路径长度是1。在联合生成场景里注意力的作用更微妙。它不仅要让氨基酸序列彼此“看到”彼此还要让氨基酸token和结构token之间互相“看到”。每个残基的结构token要参考远处残基的空间位置来确定自己应该折叠到哪每个残基的序列token同样要参考整条链的空间环境来判断这里放一个疏水残基还是亲水残基是否合适。这个机制用生活类比就很好懂做一件复杂的拼图你每拼一块不能只看旁边几块得时不时退后一步对照整张原图。Transformer的注意力就是让每个拼图块随时能“退后一步”瞥一眼整个画面的全局信息。而且注意力头的设计天然适合这种多模态交互——一部分注意力头专职做序列到序列的语言建模一部分头做序列到结构的映射还有一部分头做结构到序列的回路校验。这也算一个可解释性角度如果你把注意力图可视化大概率能看到模型在“设计序列”的时候重点关注那些在三维空间里靠近自己、但在序列上一维相隔很远的残基。这种模式是LSTM很难学出来的。2.3 输出头设计一个分布给序列一组回归量给结构输出端同样有两路。序列输出是一个20类标准氨基酸的分类分布损失函数用交叉熵结构输出是一组回归目标比如该残基相对于前一个残基的二面角、或者该残基Cα在局部坐标系中的坐标。结构输出这路的损失函数选择很讲究。AlphaFold里用的FAPEFrame Aligned Point Error在全局坐标系里比较预测和真实结构但做了对齐处理对旋转和平移有鲁棒性。更简单一点距离矩阵模型可以直接用平滑L1损失监督预测的距离矩阵和真实距离矩阵之间的差距。内部坐标二面角类则用环状距离或者角度损失。不管哪种核心原则都是对SE(3)变换不变否则模型学不进去。训练时这两路损失会加权求和。怎么配权重是一件需要实际调参的事我的建议是不要一开始就定死比例而是先观察两个损失的梯度尺度用梯度归一化或者不确定性加权让它们别互相压制。这个话题后面实操部分我再展开。3. 从零复现类似效果的操作要点3.1 训练数据准备比你想的更花时间联合生成模型的数据来源仍然是PDB里解析的蛋白结构但直接用原始PDB会有几个问题。第一个是冗余。PDB里同一个蛋白可能有几十个条目冷冻温度不同、配体不同、突变体不同。如果不做去冗余模型会被高重复区域带偏评估指标虚高。我的做法是按30%序列同一度聚类在CATH数据库的划分基础上做数据集切分确保训练集和测试集的折叠类型尽量不重叠。这不是简单筛一遍就行往往要反复看分布。第二个是质量过滤。PDB里有大量低分辨率结构、只解析了部分残基的结构、以及电子密度模糊导致局部构象不可信的结构。常规过滤条件包括分辨率优于3.0Å我一般更严一点2.5Å、无断裂主链、R-factor合理。而且要做序列和结构的一致性校验——PDB里有些条目序列和电子密度对不上。第三个是数据增强。模型必须见过各种旋转、平移下的结构才行。训练时对结构做随机旋转和平移、对坐标加一点高斯噪声、对序列做随机截断都是常规增强手段。还有一个容易忽略的点PDB里蛋白长度分布偏斜大量200-300残基的中小蛋白长蛋白很少。要主动对长序列做过采样不然模型长程生成能力会很差。第四个是结构token的预处理。如果你用距离矩阵需要把矩阵还原成坐标吗不需要。模型直接学距离矩阵分布就行。但推理时需要把距离矩阵变成三维坐标这就要用距离几何算法比如多维缩放MDS来做嵌入有累积误差。如果你用二面角内坐标就没有这个问题一二三残基加上键长键角就能确定性重建主链。我个人的倾向是训练用混合表示——距离和角度都给模型信息量更大。3.2 核心训练配置与损失平衡这一节给一个我在类似模型上调过的参考配置。必须说明不是SimpleDesign原版参数但如果你是复现同类联合生成任务这个量级是可以起步的。模型规模上6到8层Transformer、隐层维度512到768、8到12个注意力头作为第一版足够了。太大的模型在PDB这个数据量上非常容易过拟合。PDB去冗余后也就两万到四万个结构域级别相比语言模型的海量语料要小好几个数量级。训练目标上序列交叉熵和结构回归损失同时反传。关键在于损失平衡。我踩过的坑是结构损失的量纲比序列损失大几个数量级一开始直接求和模型几乎不学序列。解决办法有三种从易到难损失做归一化每个损失除以它自己跑10步滑动平均的值再加权。梯度裁剪加强配合Adam优化器clip_norm设在0.5-1.0之间。用任务不确定性加权把每个损失的方差当作可学习参数让模型自己决定谁更重要。我实测下来第一招就够用后面两招效果更好但调试成本高。序列和结构交替生成的顺序也值得试。一种做法是逐残基交替先输出第i个残基的氨基酸、再输出第i个残基的结构token然后i1。另一种做法是序列先全部生成、结构随后生成。后者训练更稳定因为结构生成时有完整序列上下文可用前者更接近真正的联合采样但训练难度大。如果是从头复现我建议先用第二种把流程跑通再逐步切到第一种。训练轮数方面见过不少团队在这样量级的数据上跑50到100个epoch之后开始过拟合所以建议early stopping盯着验证集loss。学习率用Transformer标准配置即可warmup 5%步数峰值学习率1e-4左右配合余弦退火。3.3 评估别被序列恢复率骗了联合生成模型怎么评估好坏是一件很容易自欺欺人的事。最常用的一套指标是设计序列的氨基酸恢复率AA recovery用模型生成的序列去对比“天然序列”或者“参考序列”看每个位点预测得对不对。这个指标高说明模型确实学到了序列偏好但有个重大缺陷——PDB里的天然序列只是众多可行解中的一个不是唯一标准答案。模型生成一个同等合理的替代序列恢复率照样会低。所以恢复率只能作为参考不是金标准。结构自洽性把生成的序列交给AlphaFold2预测结构再对比生成的结构和AlphaFold预测结构的相似度TM-score、RMSD。这是目前最主流的验证方式。如果AlphaFold预测结构和你生成结构一致说明序列确实能折叠到你期望的构象附近。pTM和pLDDTAlphaFold输出的置信度分数。设计序列的pLDDT高说明模型认为这个序列折叠很确定是好的信号。多样性和新颖性对比生成序列与PDB已有序列的相似度。一个好的生成模型不应该只是记忆训练集的片段拼图。我特别想提醒的是self-consistency验证AlphaFold回折叠有系统性偏置。AlphaFold训练数据天然偏向天然蛋白设计出来的蛋白如果长得像天然蛋白回折叠得分就高如果是真正新颖的全新拓扑AlphaFold可能反而给低分。所以这类模型的效果一定要配合少量湿实验数据或者至少分子动力学模拟来判断不能只看回折叠得分。在评测方式上结构对齐最好先用标准程序做全局比对再算RMSD不要直接拿坐标算否则旋转平移没对齐时数字会非常难看。TM-score的阈值也要注意——0.5以上算部分折叠0.7以上才算拓扑基本一致不同工具对短蛋白的评分有偏差统一标准很重要。4. 实际使用场景与落地玩法4.1 抗体CDR区设计最直接的应用抗体设计是目前蛋白设计里商业化最成熟的方向之一而CDR环区的序列和构象设计又是抗体设计的核心难点。CDR区尤其是CDR H3长度可变、构象多样传统方法在固定框架上移植CDR往往效果不稳定因为CDR构象与框架区之间有复杂的相互作用。用SimpleDesign这种联合生成模型你可以把抗体框架区的结构token固定住只让CDR区域的token自由生成。模型在生成CDR序列的同时也会生成对应的CDR构象天然与框架区相容。这比“先生成CDR构象再设计序列”要优美得多因为序列和结构会在整个框架的语境下同时被优化。我建议做法是把框架区所有残基的结构token锁定序列token也可以一并固定然后让模型从CDR起点开始自回归生成。生成后把CDR的构象和框架拼起来统一做能量最小化就可以进入后续筛选流程。4.2 酶工程与从头结合蛋白设计酶工程里一个常见需求是催化残基是确定的比如Ser-His-Asp三联体但周围支撑残基可以重新设计用来提高热稳定性、改变底物特异性、或者增加表达量。用联合生成模型把催化残基的序列token和结构token都固定让模型把其余部分重新“长”出来。因为模型同时优化序列和结构它更有机会找到那些能稳定维持催化残基几何排布的新序列。从头设计结合蛋白也类似。给定靶标蛋白上的一个界面区域把界面上参与结合的残基结构约束好让模型生成一个全新的蛋白骨架和序列来匹配这个界面。传统方法里先找骨架再用MPNN设计序列的成功率往往被“骨架是否匹配界面”卡住联合生成模型等于把这个匹配过程内化了。4.3 与AlphaFold、分子动力学形成验证闭环实际落地时联合生成模型不是替代AlphaFold和分子动力学而是让下游验证更顺畅。一套我常用的工作流是用SimpleDesign生成一些候选蛋白直接拿去跑AlphaFold回折叠验证根据pTM和TM-score筛一轮再做聚类挑选代表性拓扑最后做短时间分子动力学平衡来确认稳定性。这套工作流跟传统两步法的最大区别是生成步骤里的结构信息约束了序列AlphaFold回折叠通常不会跑偏太远而传统两步法里RFdiffusion生成的骨架可能在AlphaFold里压根撑不住筛选弃率很高。SimpleDesign生成的样本更“自洽”意味着前端计算筛选的通过率更高后端湿实验的有效样本比例更大。5. 常见问题与排查技巧实录这一节记录我自己做类似模型时踩过并处理过的坑直接给结论。现象大概率原因解决办法训练中序列损失不降结构损失尺度压过序列损失对结构损失做滑动平均归一化或调低权重生成结构的RMSD大但AM recovery高模型只拟合了序列偏好没学到空间约束检查结构损失是否在反传把固定骨架占比调低模型生成的蛋白总是类似PDB里某个同源家族去冗余不彻底按30%相似度聚类切分数据集长蛋白生成时后半段质量急剧下降长距离依赖学不到或训练集长序列样本太少对长序列过采样、加大注意力头数、用FlashAttention降低长序列开销模型对旋转敏感结构表示用了绝对坐标换成距离矩阵或内坐标表示AlphaFold回折叠分数低但模型损失正常模型生成的新拓扑超出了AlphaFold训练域换用分子动力学或小角度散射等互补验证手段推理时生成“链太长/太短”的异常样本没有做长度条件化在输入里加长度token或推理时用长度模板约束我再补充三个容易忽略的实战细节。第一个细节是关于自回归生成时的温度参数。温度低了模型倾向确定性输出多样性差温度高了可能生成物理上离谱的氨基酸组合。我一般推荐序列输出温度在0.6到1.0之间结构输出不做温度采样直接取分布均值再稍微加一点噪声来探索。这样生成的一批样本里既有稳健候选又保留了多样性适合后续筛选。第二个细节是内存管理。Transformer对序列长度是平方复杂度一条300残基的蛋白加上结构token长度要翻倍到6008个头、隐层768单卡可能就要吃掉十几GB显存。真到推理阶段建议用KV-cache缓存减少重复计算以及FlashAttention这类高效注意力实现。如果是训练gradient checkpointing基本是标配。第三个细节是数据管道的质量控制。别小看这一步PDB文件里一个残基的原子缺失、一个链的意外重叠都能变成训练时一个很大的梯度噪声。我通常会在预处理里生成三维可视化随机抽查几百个样本用肉眼看一遍是否合理。这个动作虽然原始但确实帮我抓出过不少问题。6. 关于这个方向我的一点实际体会要说SimpleDesign本身还有什么没解决好的地方我的观察是单模型联合生成的原型很动人但离“开箱即用”还有距离。序列和结构的联合分布空间非常大PDB的数据量很难覆盖所有可能性模型很容易在已知折叠类型上表现良好、在新拓扑上缺乏想象力。这与扩散模型和语言模型各自在结构生成和序列生成上已经积累的成熟工具相比还有追赶空间。但换个角度看SimpleDesign这个方向本身就已经把很多以前割裂的概念拧到一起了。它让我意识到过去我们习惯把蛋白质设计拆成“结构那一半”和“序列那一半”其实只是工程上的妥协并不是原理上的必然。那套分工工具RFdiffusion做结构、ProteinMPNN做序列在很长一段时间内仍然会是生产主力但迭代的下一站大概率是更多像这样把二者合并成一个生成式系统的尝试。如果真的要上手这类工作我的建议很朴素先把基础架构跑通别一上来就追求指标然后盯住“训练损失降了不代表生成质量好”这一点多加可视化验证最后跟湿实验团队保持沟通搞清楚计算生成的候选到底在实验里卡在哪一步再回头改模型。做计算蛋白设计这一行离实验数据越近模型迭代越快。