2. AlphaFold模型架构概览与Dropout层位置

这一章,我带你走一遍AlphaFold的整体架构。说白了,咱们得先搞清楚这模型长什么样,才好聊Dropout往哪儿塞、怎么调。你想想看,一个黑盒子你连它肚子里有几层都不知道,谈何参数调优?

2.1 AlphaFold整体架构

AlphaFold的架构,我个人习惯用一个公式来记:

输入(序列+模板) → 特征提取 → Evoformer → Structure Module → 输出(坐标+置信度)

这不是什么新概念,但有个细节容易被忽略——Evoformer模块在整个流程中重复了48次。48次啊,朋友们。我在项目中排查显存爆炸问题时,才真正意识到这个重复次数对Dropout行为的影响有多大。

2.2 架构中的关键模块解析

输入特征处理

AlphaFold会把输入的氨基酸序列和同源序列(MSA)做特征编码。这段处理里塞了不少线性层和层归一化,但Dropout用得很少。为什么呢?因为特征提取阶段过拟合的风险相对低,没必要在这浪费算力。

Evoformer模块

这是整个模型的绝对核心。它有两个并行处理通道:

  • MSA表示:处理多序列比对信息
  • Pair表示:处理残基对之间的空间关系

每个Evoformer内部包含:

  1. MSA -> MSA的轴向注意力
  2. MSA -> Pair的外积均值
  3. Pair -> Pair的三角注意力/三角乘法
  4. 紧接着的前馈网络(MLP)

Structure Module

从Pair表示里提取三维结构信息,输出每个残基的骨架坐标和角度。这里也有多层Transformer,不过结构相对Evoformer要轻量一些。

关键点:Dropout在AlphaFold里主要安置在Evoformer和Structure Module的前馈网络(MLP)层中。注意,是MLP层,不是注意力层。

2.3 Dropout层在架构中的分布

咱们来看AlphaFold官方实现里的Dropout位置分布。这段配置来自config.py,我记得当时为找这个参数翻了大半天源码:

# 来自AlphaFold配置文件的Dropout相关参数(简化版)
"evoformer": {
    "dropout_rate": 0.1,           # MSA表示层dropout
    "pair_dropout_rate": 0.1,      # Pair表示层dropout
    "num_block": 48
},
"structure_module": {
    "dropout_rate": 0.1,
    "num_layer": 8
}

注意:这里有一个很坑的细节——Dropout虽然叫双向丢包,但AlphaFold默认只在训练时启用Dropout。推理(预测)时框架会自动关闭所有Dropout层。我曾有一次做消融实验,忘记把模型切回训练模式,结果测出来Dropout根本没生效,白白浪费了两天时间。

下面这个表格,是我从源码里扒出来的Dropout层位置对照。你拿去对比自己的模型结构,肯定有用:

模块子层Dropout位置默认rate
Input Embedding线性投影无-
Evoformer BlockMSA轴向注意力无-
Evoformer BlockMSA -> Pair的外积无-
Evoformer BlockMSA前馈网络输出后0.1
Evoformer BlockPair前馈网络输出后0.1
Structure ModuleInvariant Point Attention无-
Structure Module前馈网络输出后0.1
输出头全连接层无-

为什么会这样?因为注意力层本身已经有dropout机制了(即attention dropout),再加一层Dropout反而会让梯度信号衰减得太厉害。我刚开始做调优的时候,试着在注意力层后也加了Dropout,结果模型怎么都训不动。

SVG图:AlphaFold核心架构流与Dropout层分布

下面这张图,把整个流程和Dropout位置标清楚了。你存下来画图的时候可以参考:

AlphaFold架构流与Dropout层分布 AlphaFold架构流 + Dropout层分布 输入(序列 + 模板) 特征提取(无Dropout) Evoformer (×48) MSA表示 Pair表示 Dropout (MLP后) Dropout (MLP后) Structure Module (8层, IPA + MLP) Dropout (MLP后) 输出(坐标 + 置信度) 图例说明 ▸ 蓝/青:输入与特征提取 ▸ 紫:Evoformer(含Dropout) ▸ 橙:Structure Module(含Dropout) ▸ 绿:输出 ▸ 红虚线:48次循环

2.4 Dropout的默认配置与陷阱

官方配置里,Evoformer和Structure Module的Dropout率都默认为0.1。但注意,这个值是对所有MLP层统一设置的。我一开始觉得这设计挺省事,直到后来做对比实验才发现——不同深度的层对Dropout的敏感度完全不一样。靠近输入的层,dropout率稍微高一点(比如0.15)反而有助于泛化;靠近输出的层,dropout率就得降到0.05以下,否则输出头不稳定。

个人经验:如果你准备调Dropout,建议从三个维度入手:

  • 层深(浅层 vs 深层)
  • 模块类型(Evoformer vs Structure Module)
  • 训练阶段(初期 vs 后期)

这样做分区调优,效果比全局一把梭强得多。

2.5 为什么Dropout位置很重要

说白了,Dropout的位置直接决定了正则化的覆盖范围。如果放在注意力层后面,它会破坏序列内部的长距离依赖——这等于把AlphaFold最有价值的能力废了一半。如果放在MLP输出后,只抑制局部过度拟合,保留全局结构信息。

我见过有团队在Pair表示的三角乘法结果后也加了Dropout,结果预测的蛋白质局部结构精度上去了,但整体的折叠拓扑结构却崩了。嗯,这里要强调——位置比率重要。你选错了地方,怎么调rate都救不回来。

2.6 本章小结

回顾一下这一章的内容:

  • AlphaFold核心流程:输入 → 特征提取 → Evoformer(×48) → Structure Module → 输出
  • Dropout安置点:仅在Evoformer和Structure Module的MLP层输出后,默认为0.1
  • 注意避坑:训练/推理模式切换、位置选择、分区调优策略

这些基础打牢了,后面几章咱们才能放开手脚去调参。你记住一句话:架构是骨架,Dropout是肌肉——骨架歪了,肌肉练得再好也没用。