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内部包含:
- MSA -> MSA的轴向注意力
- MSA -> Pair的外积均值
- Pair -> Pair的三角注意力/三角乘法
- 紧接着的前馈网络(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 Block | MSA轴向注意力 | 无 | - |
| Evoformer Block | MSA -> Pair的外积 | 无 | - |
| Evoformer Block | MSA前馈网络 | 输出后 | 0.1 |
| Evoformer Block | Pair前馈网络 | 输出后 | 0.1 |
| Structure Module | Invariant Point Attention | 无 | - |
| Structure Module | 前馈网络 | 输出后 | 0.1 |
| 输出头 | 全连接层 | 无 | - |
为什么会这样?因为注意力层本身已经有dropout机制了(即attention dropout),再加一层Dropout反而会让梯度信号衰减得太厉害。我刚开始做调优的时候,试着在注意力层后也加了Dropout,结果模型怎么都训不动。
SVG图:AlphaFold核心架构流与Dropout层分布
下面这张图,把整个流程和Dropout位置标清楚了。你存下来画图的时候可以参考:
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是肌肉——骨架歪了,肌肉练得再好也没用。