深度学习基础(CNN / RNN / Transformer)¶
一句话说明¶
深度学习是机器学习的子集,用多层神经网络自动从原始数据中学习层次化特征表示;在生信中用于变异检测(DeepVariant)、蛋白质结构预测(ESMFold)、DNA序列建模(DNABERT)等传统方法难以胜任的复杂任务。
与"12_机器学习基础"的区别¶
| 对比维度 | 12_机器学习基础 | 本篇深度学习 |
|---|---|---|
| 核心算法 | 随机森林、SVM、逻辑回归、K-means | CNN、RNN/LSTM、Transformer |
| 特征工程 | 需要人工提取/选择特征 | 自动从原始数据学习特征 |
| 数据量要求 | 小样本也能跑 | 通常需要大数据量 |
| 计算资源 | CPU 即可 | 通常需要 GPU |
| 生信典型场景 | 菌群分类、标志物筛选 | 图像识别、序列建模、蛋白质结构预测 |
一、神经网络基本原理(白话版)¶
1.1 感知机(Perceptron)—— 最简单的神经元¶
白话比方:一个神经元就像一个"打分裁判"——它把所有输入信号乘以各自的权重加起来,再加一个偏置(门槛),得到总分,然后过一个"激活函数"决定是否激活(输出 1 或 0)。
输入x1 ---(w1)---\
输入x2 ---(w2)----→ [加权求和 + 偏置b] → [激活函数] → 输出
输入x3 ---(w3)---/
数学公式:output = f(w1*x1 + w2*x2 + w3*x3 + b)
# f 是激活函数,w 是权重,b 是偏置(门槛)
1.2 激活函数 —— 引入非线性¶
如果没有激活函数,多层网络等价于一层(线性叠线性还是线性)。激活函数让网络能学复杂的弯弯曲曲的规律。
| 激活函数 | 公式 | 白话解释 | 特点 |
|---|---|---|---|
| Sigmoid | 1/(1+e^(-x)) | 把任何数压到 0~1 之间 | 容易梯度消失,现在很少在隐藏层用 |
| ReLU | max(0, x) | 负数变0,正数不变 | 计算快,最常用,但有"死神经元"问题 |
| Tanh | (e^x - e^(-x))/(e^x + e^(-x)) | 把数压到 -1~1 之间 | 比Sigmoid好点但也有梯度消失 |
| GELU | x * Φ(x) | 平滑版ReLU | Transformer里常用 |
1.3 反向传播(Backpropagation)—— 怎么学习¶
白话比方: 1. 正向传播:数据从输入层一层层往后算,得到最终预测结果 2. 算误差:拿预测结果和真实答案比较,算出"损失"(Loss,可理解为"错得多离谱") 3. 反向传播:从输出层往回走,用链式法则算出每个权重对损失的"贡献度"(梯度) 4. 更新权重:按梯度方向调整权重,让下次预测更准
类比:你考试考砸了(Loss大),老师帮你分析每道题错在哪(反向传播算梯度),然后你针对性地补弱项(更新权重)。
1.4 梯度下降(Gradient Descent)—— 怎么调参数¶
白话比方:你闭着眼站在山上想下山(找到Loss最低点),你的策略是"摸一下脚边哪个方向最陡,就往那个方向迈一步"。
- 学习率(Learning Rate):迈步的大小。太大容易跨过最低点来回震荡;太小下山太慢。
- SGD(随机梯度下降):每次只拿一小批数据算梯度,比看完所有数据再动快很多。
- Adam 优化器:自动调整每个参数的学习率,目前最常用的优化器。
二、CNN 卷积神经网络¶
2.1 核心思想¶
白话比方:CNN 就像一个"放大镜检查员"——用一个小窗口(卷积核)在整张图片上滑动,每滑到一个位置就提取一个局部特征。浅层提取边缘、颜色,深层组合出"眼睛""鼻子",最终识别出"这是一只猫"。
2.2 三种核心层¶
| 层类型 | 英文 | 白话解释 | 作用 |
|---|---|---|---|
| 卷积层 | Convolution | 小窗口滑动提取局部特征 | 学习图案(边缘、纹理、形状) |
| 池化层 | Pooling | 把一片区域压缩成一个值(取最大/平均) | 缩小尺寸、减少计算量、增强平移不变性 |
| 全连接层 | Fully Connected | 把所有特征拉平,像传统神经网络一样做分类 | 最终输出分类结果 |
2.3 关键概念¶
- 卷积核(Filter/Kernel):比如 3×3 的小矩阵,在输入上滑动做点乘。一个卷积核检测一种特征。
- 步长(Stride):卷积核每次滑动多少格。步长大=输出更小。
- 填充(Padding):边缘补零,让输出尺寸不缩太小。
- 特征图(Feature Map):卷积核扫过后生成的结果图。
2.4 经典 CNN 架构¶
| 模型 | 年份 | 关键创新 | 深度 |
|---|---|---|---|
| LeNet-5 | 1998 | CNN开山之作,手写数字识别 | 5层 |
| AlexNet | 2012 | ReLU + Dropout + GPU训练,赢ImageNet | 8层 |
| VGG | 2014 | 统一用3×3小卷积核堆叠 | 16/19层 |
| GoogLeNet/Inception | 2014 | 多尺度并行卷积(Inception模块) | 22层 |
| ResNet | 2015 | 残差连接(跳跃连接),解决梯度消失 | 50/101/152层 |
2.5 生信中的 CNN 应用¶
DeepVariant(Google,2018)¶
- 任务:从测序数据中检测基因变异(Variant Calling)
- 核心思路:把 BAM 文件中的比对信息转换成"pileup 图像"(类似彩色图片),然后用 Inception(CNN)来分类"这个位点是纯合变异/杂合变异/无变异"
- 白话:把基因测序数据画成图,让CNN"看图说话"判断哪里有变异
- 意义:精度超越传统 GATK HaplotypeCaller,证明 CNN 在基因组学的强大能力
其他生信 CNN 应用¶
- DeepBind:预测 DNA/RNA 结合蛋白的结合位点(1D卷积)
- Basset/DeepSEA:预测非编码区 DNA 的功能效应
- 病理切片分类:用 CNN 识别组织病理图像中的肿瘤区域
三、RNN 循环神经网络¶
3.1 核心思想¶
白话比方:RNN 就像一个"有记忆的阅读器"——它一个字一个字地读文本,每读一个字就更新自己的"记忆状态"。这样它读到后面的字时还记得前面的内容,能理解上下文关系。
传统神经网络:每个输入独立处理
RNN:h(t) = f(W * x(t) + U * h(t-1) + b)
↑当前输入 ↑上一步的记忆
时间展开:
x1 → [RNN] → h1
↓
x2 → [RNN] → h2
↓
x3 → [RNN] → h3 → 输出
3.2 RNN 的问题:梯度消失/爆炸¶
当序列很长时,反向传播要经过很多步,梯度要么越乘越小(消失,学不到远距离依赖)要么越乘越大(爆炸,训练崩溃)。
3.3 LSTM(长短时记忆网络)¶
白话比方:LSTM 给 RNN 加了三个"门"(gate),就像给记忆加了管理员: - 遗忘门(Forget Gate):决定"之前的记忆哪些该扔掉" - 输入门(Input Gate):决定"新信息中哪些该记住" - 输出门(Output Gate):决定"当前记忆中哪些该输出"
这三个门让 LSTM 能"选择性记忆"——重要的长期记住,不重要的及时遗忘,解决了梯度消失问题。
3.4 GRU(门控循环单元)¶
GRU 是 LSTM 的简化版,把三个门合并成两个(重置门 + 更新门),参数更少、训练更快,效果接近 LSTM。
| 对比 | LSTM | GRU |
|---|---|---|
| 门数量 | 3个(遗忘/输入/输出) | 2个(重置/更新) |
| 参数量 | 更多 | 更少 |
| 训练速度 | 较慢 | 较快 |
| 性能 | 长序列略好 | 短序列差不多 |
3.5 生信中的 RNN 应用¶
- 基因/蛋白质序列预测:把碱基(ATCG)或氨基酸序列当作"文本",用 LSTM 预测下一个位置或分类
- 基因表达时序分析:对时间序列的基因表达数据建模
- RNA 二级结构预测:序列到结构的映射
- 临床事件预测:对患者时间线数据(电子病历)做疾病进展预测
四、Transformer¶
4.1 核心思想:自注意力机制(Self-Attention)¶
白话比方: - RNN 像"一个人从左到右逐字阅读"——读到后面可能忘了开头 - Transformer 像"一群人同时看整篇文章"——每个词都能直接看到所有其他词,不需要按顺序传递
自注意力的白话解释: 对于序列中的每个位置,Transformer 问三个问题: 1. Q(Query,查询):"我想找什么信息?" 2. K(Key,键):"我有什么信息可以提供?" 3. V(Value,值):"我的具体内容是什么?"
然后用 Q 和所有 K 算"相似度"(注意力分数),相似度高的 V 被重点关注。
Attention(Q, K, V) = softmax(Q × K^T / √d_k) × V
白话翻译:
1. 每个词生成 Q、K、V 三个向量
2. 当前词的 Q 和所有词的 K 做点积(算相关性)
3. 除以 √d_k 防止数值太大
4. softmax 变成概率分布(加起来=1)
5. 用概率对所有词的 V 加权求和 = 最终输出
4.2 Transformer 结构¶
完整 Transformer(Encoder-Decoder):
Encoder(编码器,理解输入):
[输入 Embedding + 位置编码]
→ [多头自注意力] → [LayerNorm + 残差]
→ [前馈神经网络] → [LayerNorm + 残差]
× N 层
Decoder(解码器,生成输出):
[输出 Embedding + 位置编码]
→ [掩码多头自注意力]
→ [交叉注意力(看 Encoder 输出)]
→ [前馈神经网络]
× N 层
关键组件: - 多头注意力(Multi-Head):把注意力分成多个"头"并行计算,每个头关注不同方面 - 位置编码(Positional Encoding):因为没有顺序处理,需要额外告诉模型每个词在哪个位置 - 残差连接 + LayerNorm:帮助深层网络稳定训练
4.3 Transformer 的优势¶
| 对比 | RNN/LSTM | Transformer |
|---|---|---|
| 并行性 | 必须按顺序,无法并行 | 完全并行计算 |
| 长距离依赖 | 距离远时信息衰减 | 任意距离直接交互 |
| 训练速度 | 慢(序列长度线性) | 快(可并行,但注意力是 O(n²)) |
| 可扩展性 | 难以做到非常大的模型 | 可以扩展到数十亿参数 |
4.4 生信中的 Transformer 应用¶
ESM / ESM-2(Meta FAIR,2019-2023)¶
- 任务:蛋白质语言模型(Protein Language Model)
- 方法:用 Transformer 在 2.5 亿条蛋白质序列上做无监督预训练(类似 BERT 的掩码语言模型)
- 应用:蛋白质结构预测(ESMFold)、功能预测、变异效应预测、蛋白质设计
- 白话:把蛋白质序列当作"语言",用 Transformer 学会蛋白质的"语法"
- 成果:ESM Atlas 预测了 6.17 亿个宏基因组蛋白质结构
DNABERT / DNABERT-2(2021/2023)¶
- 任务:DNA 序列的预训练语言模型
- 方法:把 DNA 序列用 k-mer 分词(DNABERT-1)或 BPE 分词(DNABERT-2),然后用 BERT 架构做掩码预训练
- 应用:启动子预测、剪接位点识别、表观遗传标记预测等 28 个基因组理解任务
- 白话:把基因组当作"书"来阅读,Transformer 学会理解 DNA 的"语法"
其他生信 Transformer¶
- AlphaFold2:蛋白质结构预测的革命性突破(结合 MSA + Transformer)
- Enformer:从 DNA 序列预测基因表达(取代 CNN 的 Basenji)
- scBERT:单细胞 RNA-seq 数据的细胞类型注释
五、CNN vs RNN vs Transformer 对比表¶
| 维度 | CNN | RNN/LSTM | Transformer |
|---|---|---|---|
| 核心操作 | 局部卷积 | 循环状态传递 | 自注意力 |
| 擅长数据 | 图像、局部模式 | 时序/序列数据 | 长序列、任何序列 |
| 并行能力 | 高(各位置独立卷积) | 低(必须按序) | 高(注意力并行) |
| 长距离依赖 | 弱(受感受野限制) | 中(LSTM可改善) | 强(直接全局交互) |
| 参数量 | 中等 | 中等 | 大(注意力矩阵) |
| 计算复杂度 | O(k·n),k=核大小 | O(n) | O(n²) |
| 典型深度 | 中-深(50-150层) | 浅-中(2-4层) | 中(6-48层) |
| 生信代表 | DeepVariant, DeepBind | 基因序列LSTM | ESM, DNABERT, AlphaFold2 |
| 当前趋势 | 仍在图像领域主导 | 逐渐被Transformer取代 | 大多数新模型首选 |
六、常见框架对比:PyTorch vs TensorFlow¶
| 维度 | PyTorch | TensorFlow |
|---|---|---|
| 开发者 | Meta (Facebook) | |
| 编程范式 | 动态图(define-by-run) | 静态图 → TF2.0后也支持动态图 |
| 学术界使用 | 占主导(>80% 论文) | 逐渐下降 |
| 工业部署 | TorchServe、ONNX | TF Serving、TFLite 更成熟 |
| 调试难度 | 容易(像写普通Python) | 较难(早期静态图难调试) |
| 生信常用 | ESM、DNABERT、AlphaFold2 | DeepVariant |
| 学习建议 | 优先学 PyTorch(学术主流) | 了解即可 |
# PyTorch 快速示例:定义一个简单CNN
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=2):
super().__init__()
# 卷积块:输入1通道,输出32通道,3×3卷积核
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
self.relu = nn.ReLU() # 激活函数
self.pool = nn.MaxPool2d(2) # 2×2最大池化
self.fc = nn.Linear(32 * 14 * 14, num_classes) # 全连接层
def forward(self, x):
x = self.pool(self.relu(self.conv1(x))) # 卷积→激活→池化
x = x.view(x.size(0), -1) # 展平
x = self.fc(x) # 全连接分类
return x
七、训练技巧¶
7.1 学习率(Learning Rate)¶
- 太大:Loss 震荡不下降,甚至发散(NaN)
- 太小:收敛太慢,容易陷入局部最优
- 推荐做法:
- 初始值:1e-3(Adam)或 1e-2(SGD)
- 使用学习率调度器(LR Scheduler):如 CosineAnnealing、ReduceLROnPlateau
- 学习率 warmup:前几个 epoch 从很小慢慢升到目标值
7.2 Batch Size¶
- 小 Batch(16-64):梯度噪声大,正则化效果好,但训练慢
- 大 Batch(256-4096):梯度稳定,GPU利用率高,但泛化可能差
- 实践建议:GPU 显存能装多大就用多大,配合学习率线性缩放(batch翻倍,lr也翻倍)
7.3 过拟合(Overfitting)与正则化¶
白话:模型把训练数据"背下来了"(包括噪声),在新数据上表现差。就像学生只背答案不理解原理,换题就不会了。
应对方法:
| 方法 | 白话解释 | 代码 |
|---|---|---|
| Dropout | 训练时随机"关掉"一部分神经元,防止过度依赖某些路径 | nn.Dropout(0.5) |
| 数据增强 | 对训练数据做变换(翻转、旋转、加噪声)扩充样本 | transforms.RandomFlip() |
| 早停(Early Stopping) | 验证集Loss不再下降就停止训练 | 监控 val_loss |
| 权重衰减 | 给大权重加惩罚,鼓励简单模型 | optimizer(weight_decay=1e-4) |
7.4 Batch Normalization(批归一化)¶
- 白话:每一层的输出做"标准化"(减均值除标准差),让数据分布稳定
- 好处:训练更快、可以用更大学习率、减轻梯度消失
- 代码:
nn.BatchNorm2d(32)(对32通道的特征图做BN)
7.5 Layer Normalization¶
- 和 BatchNorm 类似,但是对单个样本的所有特征做归一化(不依赖 batch)
- Transformer 中用 LayerNorm(因为序列长度可变,BatchNorm 不好用)
八、生信中的深度学习应用场景表¶
| 应用场景 | 模型架构 | 代表工具/论文 | 输入数据 | 输出 |
|---|---|---|---|---|
| 变异检测 | CNN (Inception) | DeepVariant | BAM pileup图像 | 变异类型分类 |
| 蛋白质结构预测 | Transformer + MSA | AlphaFold2 | 蛋白质序列+MSA | 3D坐标 |
| 蛋白质语言模型 | Transformer | ESM-2 / ESMFold | 蛋白质序列 | 结构/功能预测 |
| DNA 序列建模 | Transformer (BERT) | DNABERT-2 | DNA k-mer/BPE序列 | 功能注释 |
| 基因表达预测 | Transformer | Enformer | DNA序列(200kb) | 基因表达量 |
| 单细胞注释 | Transformer | scBERT, scGPT | 基因表达矩阵 | 细胞类型 |
| RNA结构预测 | RNN/Transformer | SPOT-RNA | RNA序列 | 碱基配对 |
| 药物-靶点相互作用 | CNN + RNN | DeepDTA | 蛋白序列+分子SMILES | 结合亲和力 |
| 基因调控预测 | CNN | DeepSEA, Basset | DNA序列 | 转录因子结合/组蛋白修饰 |
| 病理图像分析 | CNN (ResNet) | PathAI | H&E染色切片 | 肿瘤分类/分级 |
| 宏基因组分箱 | CNN/Transformer | VAMB, SemiBin | 序列组成+丰度 | 物种分箱 |
九、面试怎么答(5道高频题)¶
Q1:CNN 和全连接网络有什么区别?为什么图像任务要用 CNN?¶
答:全连接网络把每个像素都和每个神经元连接,参数量爆炸(224×224的图有5万个输入)且丢失空间信息。CNN 通过三个核心设计解决这个问题: 1. 局部连接:每个神经元只看一小块区域(3×3),大幅减少参数 2. 权重共享:同一个卷积核在整张图上滑动复用,进一步减参 3. 平移不变性:同一个特征无论出现在图片哪个位置都能被检测到
生信例子:DeepVariant 把测序比对转为图像,用 CNN 的 Inception 架构检测变异,精度超越 GATK。
Q2:LSTM 怎么解决 RNN 的梯度消失问题?¶
答:普通 RNN 的梯度要经过很多步连乘,容易消失。LSTM 引入了"细胞状态"(Cell State)——一条贯穿始终的"高速公路",信息可以直接流过不被破坏。三个门(遗忘门、输入门、输出门)控制信息的增删,避免了梯度连乘的问题。
类比:普通 RNN 像传话游戏(传到后面全变味了),LSTM 像有一本笔记本一直带着(重要的写在本子上不怕忘)。
Q3:Transformer 的自注意力机制是什么?为什么比 RNN 好?¶
答:自注意力让序列中的每个位置都能直接与所有其他位置计算相关性(Q·K 点积),不需要像 RNN 那样一步步传递。好处有三: 1. 并行计算:所有位置同时计算,训练快得多 2. 长距离依赖:第1个词和第1000个词直接交互,不衰减 3. 可扩展性:可以堆叠到数十亿参数(GPT、ESM等)
代价是 O(n²) 的计算复杂度,序列特别长时需要用 Flash Attention 等优化。
Q4:深度学习在生信中的优势和局限分别是什么?¶
答: - 优势:自动学特征(不需人工设计)、处理复杂数据(图像/长序列)、大数据下性能天花板更高 - 局限:需要大量数据(生物样本往往昂贵)、需要GPU资源、模型可解释性差(黑盒)、小样本不如传统ML - 实践策略:预训练模型 + 微调(如用 ESM-2 的预训练权重微调到自己的蛋白质分类任务),用少量标注数据也能获得好效果
Q5:PyTorch 和 TensorFlow 你用哪个?为什么?¶
答:日常研究和生信分析我用 PyTorch。原因: 1. 学术界主流(80%以上的生信DL论文用PyTorch),ESM、DNABERT、AlphaFold2 都基于 PyTorch 2. 动态图易调试,写起来像普通 Python 3. 社区活跃,HuggingFace 生态完善
TensorFlow 在工业部署(TF Serving、移动端 TFLite)更成熟,如果做模型上线部署会考虑。DeepVariant 是用 TensorFlow 写的。
十、速查表¶
┌─────────────────────────────────────────────────────────────────┐
│ 深度学习速查表 │
├─────────────────────────────────────────────────────────────────┤
│ 架构选择: │
│ 图像数据 / 局部模式 → CNN │
│ 短序列 + 资源有限 → LSTM/GRU │
│ 长序列 + 充足数据 → Transformer │
│ 蛋白质/DNA序列 → 预训练Transformer(ESM/DNABERT) │
│ │
│ 激活函数:隐藏层用ReLU,输出层分类用Softmax,二分类用Sigmoid │
│ │
│ 优化器: 默认选 Adam(lr=1e-3),大模型用 AdamW(带weight_decay) │
│ │
│ 正则化: Dropout(0.1~0.5) + WeightDecay + EarlyStopping │
│ │
│ 归一化: CNN用BatchNorm,Transformer用LayerNorm │
│ │
│ Batch Size:GPU显存装得下的最大值,配合lr线性缩放 │
│ │
│ 过拟合信号:train_loss下降但val_loss上升 │
│ │
│ 生信捷径: │
│ • 蛋白质任务 → 先试ESM-2预训练模型微调 │
│ • DNA任务 → 先试DNABERT-2预训练模型微调 │
│ • 变异检测 → 直接用DeepVariant │
│ • 小样本 → 用传统ML(随机森林)可能更好 │
└─────────────────────────────────────────────────────────────────┘
十一、延伸资源¶
| 资源 | 类型 | 说明 |
|---|---|---|
| 3Blue1Brown 神经网络系列 | 视频 | 最好的神经网络可视化教程 |
| 李沐《动手学深度学习》 | 书+代码 | PyTorch版深度学习入门经典 |
| Stanford CS231n | 课程 | CNN经典课程 |
| The Illustrated Transformer | 博客 | Transformer 最佳图解 |
| ESM GitHub | 代码 | 蛋白质语言模型 |
| DNABERT-2 GitHub | 代码 | DNA预训练模型 |
| DeepVariant GitHub | 代码 | CNN变异检测 |
| HuggingFace Transformers | 框架 | 预训练模型库(含生信模型) |
总结:深度学习的核心是用多层神经网络自动学特征。CNN 擅长图像和局部模式,RNN/LSTM 擅长序列但被 Transformer 逐渐取代,Transformer 凭借自注意力机制成为当前主流架构。在生信中,预训练大模型(ESM、DNABERT)+ 下游微调是当前最强范式。面试时重点说清楚"什么数据用什么架构"以及"生信有哪些成功应用"。