SimpleDesign:单Transformer实现蛋白质序列与结构联合生成
蛋白质计算设计圈子里一直有个“先有鸡还是先有蛋”的争论到底应该先画出三维骨架再往骨架上填氨基酸序列还是反过来先设计好序列再祈祷它能折叠成想要的形状。过去几年主流路线是前者。RFDiffusion给一个目标拓扑扩散模型负责长出骨架然后ProteinMPNN这类模型回填序列最后拿AlphaFold2做一遍自洽性验证。这套流程现在依然是黄金标准但它把设计拆成了两个独立模型每一步的错误会向下游累积对联合分布的建模效果终究有限。Apple与Mila蒙特利尔学习算法研究所这次放出的SimpleDesign走的是完全不同的路线只用单个Transformer同时输出一条完整的氨基酸序列以及每个残基主链原子的三维坐标。模型规模不算夸张论文里放了S和L两个规格最大也只有两亿参数左右但设计成功率和生成效率都能和扩散模型流程掰手腕。这篇工作最值得读的地方不在于“又大又新”而在于它把蛋白质的结构表示、Transformer的注意力机制、以及生成目标的设定都做得相当干净。我觉得它尤其适合三类人做蛋白质从头设计的研究生和工程师想了解Transformer怎么在连续几何数据上落地、而不是只处理文本的算法同学以及所有对“生成式模型如何建模物理世界”感兴趣的读者。接下来我会把这篇工作的动机、结构表示、注意力设计、训练细节和实战注意事项拆开讲透尽量把我看到这篇论文时的思考过程也还原出来。1. 为什么“序列结构”要一起生成而不是拆成两步1.1 两步式设计流程的隐性代价“先骨架后序列”的流程本质上是把蛋白质设计压缩成了两个独立问题第一个模型只负责结构第二个模型只负责在给定结构下回填序列。RFDiffusion生成主链坐标时并不知道后面会搭配什么序列ProteinMPNN回填序列时又只能接受骨架一成不变这个前提。两个模型单独看都已经被打磨得很好但串联起来就会暴露一个结构性问题——误差累积。打个比方这就像是先决定好一栋房子的承重墙位置再让另一个团队往里填门窗。承重墙一旦定死门窗团队的选择空间就被锁死哪怕某个位置明显适合开一扇大窗也因为墙已经砌好而只能放弃。蛋白质里更常见的情形是某个loop区域的骨架可能偏爱脯氨酸但骨架先生成出来之后回填序列时脯氨酸可能带来过高的空间张力。两步法里这个问题只能靠反复采样碰运气而不是在设计过程中自动修正。更深层的丢失在于条件分布本身。序列通过侧链堆叠、氢键网络影响结构结构又通过空间位阻约束哪些氨基酸可以出现在哪里。这种双向约束本质上是联合分布 P(sequence, structure) 的建模。拆成两个模型之后每个模型只在条件分布上工作先 p(structure | topology)再 p(sequence | structure)。每一步都在“假设对方不变”的前提下做局部最优这在数学上是近似在物理上是不够的。SimpleDesign想解决的正是这个“联合建模”问题。1.2 扩散模型与自回归Transformer的路线分野前几年生成模型这波浪潮里蛋白质领域的代表是扩散模型。RFDiffusion、Chroma都把结构生成看作“从噪声坐标到干净坐标”的去噪过程在稠密连续数据上表现很强但扩散模型一旦要同时处理离散的氨基酸序列就需要额外的辅助模块或者复杂的混合方案。序列和结构两种模态在扩散框架里天然不对等做起来有点别扭。SimpleDesign选Transformer是很自然的选择因为Transformer本身不挑剔输入是离散的还是连续的。氨基酸序列就是token主链坐标也可以编码成token。只要设计好表示和注意力模式一个模型可以同时处理两路信息。这与ESM3的思路一脉相承但SimpleDesign更简洁——它没有做复杂的多模态对齐而是让结构坐标作为另一种token直接参与注意力计算。这个选择带来的直接好处是采样效率。扩散模型要迭代几十步去噪Transformer在推理时只需一次前向或者一个较短的自回归过程速度优势非常大。我自己在本地机器跑类似任务的时候感受很直观同一个设计需求扩散模型常常要等GPU风扇狂转很久而SimpleDesign的思路是让生成几乎瞬时完成把算力留给后续验证。当然论文也做了和主流扩散方法的成功率对比并不因为“更简单”就牺牲质量。2. 决定成败的第一步把三维结构变成输入2.1 用四个主链原子描述残基最开始看到SimpleDesign的结构表示可能很多人会问蛋白质里那么多原子侧链也有一大堆为什么只取N、Cα、C、O四个主链原子理由可以从两个角度看。第一是简洁性。主链构象已经决定了蛋白质折叠的大框架绝大部分拓扑信息都在主链上侧链原子虽然有影响但在联合生成时让模型自己去“脑补”这些影响反而比把全部原子塞给它更好。第二是公平性。如果直接用全原子坐标模型很容易记住“某个位置出现某个侧链是因为它的坐标恰好摆在那里”这会滑向机械的模板匹配。只用主链四个原子模型必须真正学到序列与结构的耦合规律而不是靠“背答案”。而且这四个原子在几何上刚好够用。N-Cα-C定义了一个平面Cα到N的方向和Cα到C的方向可以构造一个正交基。后续建立局部坐标系时不需要依赖任何额外的原子信息这种表示在分子建模里是很经典的套路。2.2 局部坐标系与SE(3)等变性这是我认为整篇论文里最有价值的设计决策。如果直接把PDB里的全局坐标送进Transformer问题立刻就会出现一个蛋白质和它的任意旋转副本形状完全相同但输入数值完全不一样。模型被迫去学“坐标数值到结构语义”的映射这需要海量数据和大量参数去克服。很多几何深度学习工作都绕不开这个问题非得套上等变网络才能解决。SimpleDesign的做法是建立一个以每个残基为中心的局部坐标系。具体来说以残基的Cα原子为原点x轴指向N原子方向y轴落在N-Cα-C平面上z轴由叉积得到。每个原子的全局坐标都投影到这个局部坐标系里换算成局部坐标之后才输入模型。这样一来整个蛋白质无论怎么平移、旋转所有token的数值都不会变——这就是分子建模里常说的SE(3)等变性而且是彻底的平移旋转不变连近似都不用。这是一个相当优雅的工程选择用表示方法解决了几何等变性的问题而不是引入结构复杂的等变神经网络。从数学上限来说专门的等变网络比如SE(3)-Transformer表达能力可能更高但SimpleDesign用局部坐标系加足够深的注意力上下文在工程上达到了足够好的近似同时模型主体保持标准Transformer结构实现和调试的难度直线下降。做研究的人都知道这类“用聪明的表示换简单的模型”的决策往往比堆一个复杂的网络更可持续。2.3 从坐标到token连续值如何进入Transformer这里绕不开一个基础问题Transformer怎么处理连续值。很多同学之前啃过各种Transformer讲解甚至手撕过Transformer做正弦函数预测核心难点都是同一个——语言模型里的token是离散的映射到embedding矩阵查表即可坐标是连续的浮点数没法查表。SimpleDesign的处理方式是把坐标特征作为连续向量接入输入嵌入。每个残基的token向量由两部分组成氨基酸类型的embedding以及主链坐标投影后的连续特征。模型内部的线性变换和注意力层本来就能处理连续输入关键在于损失函数的设计对结构坐标使用回归损失比如L1距离对序列token使用交叉熵。这样一个Transformer就能同时预测“下一个氨基酸是什么”和“主链原子在哪里”。其实这个思路在图像领域的bounding box回归里也有类似影子并不是什么神秘操作但套到蛋白质联合生成上就产生了很好的化学反应。3. 注意力机制的核心设计双向与单向的协同3.1 序列token流与结构token流模型里实际存在两条平行的token流一条是离散的氨基酸序列token长度为L一条是连续的结构token同样是L个残基的位置。两条流在每一层Transformer里共同参与注意力但序列和结构使用了独立的注意力参数。论文里特别提到这不是为了省参数而是为了避免不同模态之间的干扰。现实里确实如此坐标的动态范围远大于序列的one-hot编码如果不做隔离注意力权重很容易被坐标数值主导序列信息就被“淹没”了。这样设计之后序列流和结构流各自保持自己的统计特性同时又在每一层通过交叉注意力交换信息。浅层可能只是简单的位置对齐深层则逐渐形成对“什么样的序列倾向出现在什么样的结构环境里”的联合表征。3.2 双向注意力保证全局一致性序列token之间的注意力是双向的。设计一条蛋白质链时第30个残基选什么不仅取决于第1个残基也可能取决于第100个残基。疏水核心、氢键网络、长程二硫键这些都是非局域相互作用只看窗口附近几个残基根本不够。双向注意力让模型在编码每个位置时都能同时看到全序列上下文这和蛋白质的真实物理约束是一致的。同时从结构token到序列token的注意力也是双向的。模型可以随时参考当前已经确定的结构状态来判断某个位置适合什么氨基酸。这种“看着结构写序列”的能力是两步式流程里很难实现的——两步法里结构是先验固定的序列模型只能被动适配而SimpleDesign里结构和序列在每一层都互相参考在线修正。3.3 单向注意力结构token的自回归解码关键的区别在于结构token之间它们用的是单向因果注意力。也就是说当模型预测第t个残基的三维坐标时只能看到前t-1个残基的结构不能看到后面还没生成的部分。这个设计符合物理直觉。蛋白质折叠本来就不是“全知全能”生成过程应该是逐步展开主链——先定第1个残基的坐标再在这个前提下生成第2个然后基于前两个生成第3个。单向注意力的因果性保证了这种“边折叠边决定”的过程同时也稳定地把已经生成的结构信息送入下一步。如果真的允许结构token之间全连接模型在训练时很容易偷看未来的坐标生成时却无法复现这种典型的训练-推理不一致问题在文本生成里大家都踩过在三维坐标上只会暴露得更明显。3.4 深层交互24层堆叠与独立头模型堆了24层Transformer每一层都同时处理两条token流。浅层的注意力主要解决局部残基的键长、键角约束深层的注意力则开始编码长程拓扑、二级结构组合这些高层语义。论文在消融里对比了共享注意力与非共享注意力的差异结果显示非共享的多头设计在联合生成任务上稳定更好原因就是两类token的统计特性差异太大序列token是稀疏离散分布结构token是稠密连续分布。给想复现的同学一个提醒如果想快速验证思路可以先从S小参数版本开始注意力和层数保持一致只把embedding维度调小。跑通数据管线之后再上L版本。不要一上来就训练最大模型不然前期调试时注意力权重乱飞、NaN loss这种问题会让人崩溃。4. 训练策略、模型规模与官方报告的关键数据4.1 掩码语言建模式联合预训练训练目标上SimpleDesign采用的是掩码重建的思路。训练时随机遮住一部分位置论文里我记得取的掩码比例是8%的残基然后让模型根据剩下的完整上下文去预测被遮住位置的氨基酸类型和主链坐标。这样做的好处在于它天然是联合建模——模型必须同时理解序列和结构才能在一个维度被遮住时用另一个维度把它补回来。为什么掩码比例选这么小因为这和BERT那种语言理解任务的掩码策略不是一回事。BERT大量mask是为了强迫模型学习句法语义而蛋白质联合生成里如果mask太多模型会学到太多“根据残缺补齐”的捷径真到了生成完整蛋白时反而不自然。8%这种低掩码率可以让模型在绝大多数训练样本上看到完整蛋白训练分布更接近实际生成时的分布。这个细节值得反复琢磨它对最终生成质量的影响比堆层数更隐蔽。4.2 S与L两个规格论文提供了SimpleDesign-S和SimpleDesign-L两个规格。S规模大约6400万参数适合快速实验和验证想法L规模约2亿参数是论文重点报告的对象。横向对比一下ESM3达到700亿参数扩散模型也是一条不同的技术路线而SimpleDesign-L能压到2亿左右同时保持与主流方法相当的设计成功率。参数规模和性能之间的这个“杠杆”很大程度上就是结构表示和注意力设计带来的而不是硬堆数据或算力。如果你平时研究Transformer模型的参数量计算会发现注意力头的数量、embedding维度和层数基本决定了参数量级。SimpleDesign能保持如此紧凑说明它并没有在模型结构上做无意义的放大而是把capacity用在了刀刃上。4.3 从头设计成功率与主流扩散流程掰手腕评估从头设计最标准的做法是先随机生成一批蛋白再用AlphaFold2预测这些序列会折叠成什么结构与生成时给出的结构做比较TM-score超过阈值通常取0.8就视为成功。这个流程就是所谓的in silico自洽验证现在已经是生成式蛋白设计的事实标准。论文报告里SimpleDesign-L在从头设计上的成功率与RFDiffusionProteinMPNN流程基本相当。我记得具体对比数字大概在88%对90%上下但这类数字对评测集选择非常敏感差两三个百分点不代表模型优劣。真正值得关注的是序列恢复率在给定结构下回填序列的任务里SimpleDesign的表现不如专门的逆折叠模型ProteinMPNN。这不意外因为SimpleDesign的任务更复杂它要在完全不给定结构的情况下同时搞定序列和骨架。反过来看结构多样性SimpleDesign生成的蛋白拓扑明显比单纯用扩散流程更多样β片层和混合结构的比例也更均衡。对于做设计的人来说“多样化”往往比“刷高成功率”更有价值因为下游实验筛选需要大量差异化的候选。4.4 消融实验哪些组件动不得论文附录里的消融实验做得很扎实我建议精读。有几个结论值得特别记住第一去掉结构token模型退化成纯序列模型成功率大幅下降。这说明结构信息不是装饰而是联合设计能力的核心来源。第二把局部坐标系换成全局坐标性能显著变差。这是因为模型浪费了大量容量去学习旋转不变性本质上是数据效率的损失。第三把结构token之间的单向注意力改回双向生成自洽性下降。这是典型的训练测试不一致问题。第四掩码比例从8%往上调生成多样性下降成功率并没有明显提升。这是生成质量和探索度之间的权衡。这些结论单看都符合直觉但论文把它当作一个完整的设计空间走了一遍省去了后来者重复踩坑的时间。这也是我认为这篇工作价值所在它不仅给了一个模型更清晰交代了“哪些设计决定是命脉”。5. 从论文到实战复现建议与我的判断5.1 训练数据与去冗余想复现SimpleDesign或者基于它做二次开发第一步最难的是数据管道。蛋白质结构数据以PDB为主但直接拿整个PDB训练会有严重的冗余问题——里面大量条目是同源蛋白的不同突变体序列相似度极高。你必须按序列相似度去重否则模型会在同源序列上严重过拟合遇到全新拓扑时几乎没有泛化能力。一个常用的去冗余操作是CD-HIT聚类命令行大概是这样的cd-hit -i all_chains.fasta -o unique_chains.fasta -c 0.9 -n 5这里-c 0.9表示90%序列一致性阈值-n 5就是k-mer长度。实际使用中阈值需要根据下游任务调做从头设计通常要比90%更严格一些。另一个容易被忽略的点是数据版本。PDB每周都在更新论文实验用的数据集是某个时间点的快照。如果你要做横向对比建议直接沿用论文公开的切分方式不要自己重新切否则你复现出来的“差距”很可能来自数据差异而不是模型差异。如果只训练单一蛋白链的从头生成CATH结构域划分也是常见基底。但要注意CATH过滤掉了大量非球状蛋白和小蛋白训练出来的模型会偏向折叠良好的球状结构别指望它直接生成天然无序蛋白或膜蛋白这类特殊类型。5.2 评估不要掉进“AlphaFold2自洽性陷阱”现在很多论文都拿AlphaFold2预测的TM-score说话我理解因为这是成本最低的in silico验证。但这个方法有一个隐患AF2本身也是从序列预测结构的模型如果设计序列和训练集里的蛋白长得像AF2会自信地给高分哪怕这个蛋白在实验里根本不折叠。更极端的情况是某些设计会让AF2产生一种“自圆其说”的错觉——序列和生成结构本来不一致但AF2的预测结果强行和生成结构对齐了。我的建议是加一道筛选用Rosetta或类似工具的能量函数对候选做一次快速粗筛或者挑几个得分最高的候选做分子动力学模拟看结构在几十纳秒里是否还能维持。AF2分数只是入口不是终点。这点对于真正想进湿实验的同学尤其重要否则你会浪费大量合成和表征的时间去验证一堆“AF2看起来很好”但实际上没有稳定折叠的设计。5.3 工程侧把Transformer跑在蛋白质坐标上需要留意的细节工程实现上几个Transformer的经典问题在蛋白质坐标场景下同样存在甚至更明显。第一个坑是变长序列的padding。蛋白质链长度从几十到几百个残基不等batch内必须padding到相同长度。结构token的padding位置需要格外小心不能让padding坐标参与注意力计算。好在现在的FlashAttention已经对这类mask支持得比较成熟注意在实现时把padding mask和注意力mask组合清楚。第二个坑是坐标数值的动态范围。局部坐标系里坐标大约是几埃到十几埃量级小于全局坐标的几十到上百埃但仍然比离散token的embedding范围大。建议在输入层加一层LayerNorm或数值缩放否则连续坐标在训练初期很容易压制序列token的梯度。论文本身未必会写这种细节但这是很实际的体验。第三个坑是位置编码。语言模型的位置编码负责告诉模型“token的先后顺序”而蛋白质里除了残基顺序还有真实的折叠路径。如果你从文本Transformer迁移过来一开始可能会想直接套用正弦位置编码或RoPE而在SimpleDesign里残基序号作为相对位置信息存在同时局部坐标系已经蕴含了大量空间几何。如何把位置编码和结构token有机融合对长链生成的影响很大。建议在小模型上先把不同位置编码方案的差异跑一遍再决定最终的设置。5.4 我认为真正值得跟进的方向这篇文章最大的想象空间在应用扩展。第一个方向是可变长生成。目前训练的是固定长度或链条式生成策略可以进一步延伸到loop设计、linker设计这类局部改造任务而不是每次都整条链重来。第二个方向是复合物和多链组装从头设计多亚基蛋白非常重要但实现难度更高需要把链间交互也编码进注意力机制。第三个方向是抗体或CDR区域设计这类任务训练数据更少但约束更多正好可以考验这个表示设计的泛化能力。如果让我个人排序我会先做一个小实验把“局部坐标系 双向/单向混合注意力”这个组合用到某个天然蛋白的CDR环区重设计上看模型能不能生成能量上更稳的候选。跑完这个实验你就会对SimpleDesign的能力和边界有具体的体感而不是停留在“成功率是88%还是90%”这种表层数字上。最后一个操作性建议给想快速上手的同学不要一上来就完整复现L版本。先把数据管道跑通用S版本验证你的评估脚本、生成流程和可视化工具再切到L版本做正式实验。我这几年的经验是这类联合生成项目的瓶颈往往不在模型结构而在数据处理和评估闭环。这两块磨顺之后模型训练只是时间问题。