深度学习基础回顾:从神经元到Transformer

我个人觉得,要啃下AlphaFold这块硬骨头,先得把地基打牢。深度学习这些年,几个关键的思想和架构,就像搭积木一样,一层一层叠上去的。今天我就带着大家捋一捋这几块积木:神经网络、卷积网络、残差网络,还有Transformer。不复杂,但全是干货。

1. 神经网络:最基本的单元

咱们从最土的神经元说起。一个神经元就是个简单函数:输入加权求和,然后扔进一个非线性激活函数里。就是这么个玩意儿,堆多了,就成了网络。

# 一个最简单的线性层
import torch.nn as nn

# 输入维度100,输出维度200
layer = nn.Linear(100, 200)
# 前向传播
output = layer(input_tensor)

我在早年做蛋白质性质预测时,遇到过一个大坑。数据量不大,硬堆了5层全连接层。结果就是过拟合得一塌糊涂。模型把训练集背得滚瓜烂熟,但一遇新数据,全歇菜。后来我发现,对于小数据集,少点层数,加点Dropout,反而更稳。

避坑指南:我建议你在全连接层后,一定要搭配BatchNorm或LayerNorm。不然后面找梯度就像在黑暗中摸石头,很可能就摸到悬崖下去了。

3. 卷积网络:捕捉局部模式的高手

卷积神经网络(CNN)的核心,就是局部连接和权值共享。你想想看,一张图里,一个物体特征通常只占一小块区域,CNN用一个小窗口(卷积核)扫过整个图,既抓住了局部细节,又大大减少了参数量。

核心直觉:CNN天然适合处理有网格结构的数据,比如图像、语音频谱。在蛋白质领域,序列和结构也可以看成一种特殊的网格。
# 一个典型的2D卷积层
conv_layer = nn.Conv2d(in_channels=3, out_channels=64,
                       kernel_size=3, padding=1)
# 输入: [batch, 3, H, W]
feature_map = conv_layer(input_image)

我经常看到初学者对“感受野”这个概念一脸懵。简单说就是:输出层上的一个点,对应原图上多大区域。层数越深,感受野越大。在蛋白质结构预测里,早期的残基相互作用预测,很多就是靠堆叠CNN来扩大感受野的。

3. 残差网络:让深层网络真正“深”起来

你以为网络越深效果越好?早年的深度网络,层数一多,就出现“退化”问题——训练误差反而增大。ResNet的解决方案非常优雅:让网络学习残差映射。本来要学一个H(x),现在学 F(x) = H(x) - x,然后输出 F(x) + x。这就是那个著名的“跳过连接”。

# 一个残差块的核心代码
class ResidualBlock(nn.Module):
    def __init__(self, channels):
        super().__init__()
        self.conv1 = nn.Conv2d(channels, channels, 3, padding=1)
        self.conv2 = nn.Conv2d(channels, channels, 3, padding=1)
        self.relu = nn.ReLU()

    def forward(self, x):
        out = self.relu(self.conv1(x))
        out = self.conv2(out)
        return self.relu(out + x)  # 跳过连接在这里
我的经验:做ResNet的时候,输入输出维度必须一致。如果维度对不上,可以用1x1卷积做个投影。我在AlphaFold的Evoformer里看到了大量的残差连接,这成了结构生物信息学里非常稳定的设计模式。

我还遇到过这种情况:自己手写残差块时,忘记把x加到输出上。结果训练半天,loss纹丝不动。排查了一整天,才发现这个低级错误。嗯,这种错误犯过一次,你这辈子都不会再犯了。

4. Transformer:从序列到自注意力

Transformer不再依赖局部窗口,而是用自注意力机制,直接计算序列中任意两个位置间的依赖关系。这很关键,因为AlphaFold里,我们需要知道第5个残基和第150个残基在三维空间里是不是挨着的。

自注意力是怎么做的?输入序列经过三个线性变换,得到查询Q、键K、值V。然后计算Q和K的点积,经过softmax归一化,加权求和V。公式很简单:

Attention(Q, K, V) = softmax(Q * K^T / sqrt(d_k)) * V
个人笔记:那个除以根号下d_k的操作,是为了防止点积结果太大,导致softmax梯度消失。我一开始看论文没注意这个,自己实现时模型根本训不收敛。
# PyTorch实现一个简化版自注意力
import torch
import torch.nn.functional as F

def scaled_dot_product_attention(Q, K, V):
    d_k = Q.size(-1)
    scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
    attn_weights = F.softmax(scores, dim=-1)
    output = torch.matmul(attn_weights, V)
    return output

Transformer还引入了多头注意力。把Q、K、V分成8个或16个头,每个头在不同的子空间里学习关系,最后拼接起来。这就像是组专家小组,每人从不同角度分析问题,综合起来就是全面的判断。

知识结构图:本章脉络

下面的SVG图概括了本章讲到的几个核心概念,以及它们之间的演进关系。从最基础的神经元,到捕捉局部特征的CNN,再到解决深层网络退化问题的ResNet,最后到建立全局依赖的Transformer。AlphaFold就是沿着这条路,把这些组件巧妙地组合起来的。

深度学习基础回顾:知识体系图 神经元 / 全连接 线性 + 激活函数 CNN 局部连接 + 权值共享 ResNet 残差连接 / 跳连 Transformer 自注意力 + 多头 AlphaFold 融合 图例 → 演进方向 方框: 核心架构

看完这张图,你大概明白了。AlphaFold并没有凭空创造什么颠覆性技术,而是恰当地运用了深度学习的几块积木。ResNet保证了上百层网络也能收敛,CNN有效提取了局部序列特征,Transformer则让模型能“看到”相距甚远的残基之间的相互作用。这三者组合,就成了蛋白质结构预测的魔法。

关键差异对比:四架马车

架构 核心机制 关键优势 在AlphaFold中的体现
神经网络 线性映射 + 非线性激活 万能逼近能力 基础层,用于特征变换
CNN 局部感受野 + 滑动窗口 参数少,捕捉局部模式 结构模块中的一维卷积
ResNet 跳过连接 / 恒等映射 缓解退化,支持极深层网络 Evoformer中的残差块设计
Transformer 自注意力 + 多头机制 捕获全局依赖,并行计算 Evoformer核心:成对注意力和串行注意力
总结我的感悟:搞懂了这四个组件,AlphaFold的结构模块其实就清晰了。我经常会想,如果没有残差连接,那Evofromer推演个几十层早崩了。而如果没有Transformer的注意力,模型也学不到蛋白质折叠这种长程相互作用。这四样东西,少了谁都会少了味儿。