跳到主要内容

08 深度学习入门 — Autoencoder 表征

01-07 章全部用 R + 经典 ML。从这一章开始,进入 Python + PyTorch 深度学习路径。Autoencoder 是最朴素的深度学习模型,适合作为入门:它没有 label,没有"分类目标",只有一个朴素的目标 — 学一个低维表示,能重构出原始数据

为什么从 Autoencoder 开始

模型任务监督性教学难度
Autoencoder自学习低维表示无监督⭐ 入门
Classifier (CNN/MLP)分类有监督⭐⭐
Generative (VAE/GAN)生成新样本无 / 弱监督⭐⭐⭐
Transformer序列建模有 / 弱监督⭐⭐⭐⭐

Autoencoder 的目标函数极简:

loss = MSE(decoder(encoder(x)), x)

不需要 label,不需要负样本,不需要特殊技巧。学完它就能扩展到 VAE / Mask Autoencoder / Contrastive Learning 等更复杂的方法。

为什么选 PyTorch 而不是 TensorFlow

(spec 调整记录,2026-05-27)

原计划 TensorFlow / Keras,实际改用 PyTorch:

  1. 生信社区生态:scvi-tools、DeepChem、ESM(蛋白质)、AlphaFold 全部基于 PyTorch
  2. BioF3 py-server 容器已装齐:PyTorch 2.12 + cu130 直接可用,TF 反而需要装
  3. API 更 Pythonic:nn.Module 类比 Keras 的 Sequential 更灵活,长期来看更值得学

如果你已经会 Keras,5 行就能切换到 PyTorch:

# Keras
model = keras.Sequential([Dense(64, activation='relu'), Dense(16)])
model.compile(loss='mse', optimizer='adam')
model.fit(X, X, epochs=50)

# PyTorch 等价
class AE(nn.Module):
def __init__(self):
super().__init__()
self.encoder = nn.Sequential(nn.Linear(p, 64), nn.ReLU(), nn.Linear(64, 16))
self.decoder = nn.Sequential(nn.Linear(16, 64), nn.ReLU(), nn.Linear(64, p))
def forward(self, x):
return self.decoder(self.encoder(x))

Autoencoder 架构

最简单的 vanilla Autoencoder:

input (5000)
↓ Linear + ReLU
hidden (256)
↓ Linear + ReLU
latent (16) ← 这是我们要的
↓ Linear + ReLU
hidden (256)
↓ Linear (无激活,输出连续值)
output (5000)

关键超参数:

参数推荐值调试经验
latent dim8-648 用于 2D 可视化(再 PCA 到 2),16-32 用于下游分析
hidden layers2-4太深(>4)需要 batch norm + dropout,本章保持简单
activationReLU(中间)/ Linear(输出)生信连续表达数据,输出层不要 sigmoid
optimizerAdam(lr=1e-3)RMSprop 也 OK,SGD 不收敛
epochs50-200early stopping based on val loss
batch size32-128TCGA-LIHC 374 样本,batch=32 即可

在 TCGA-LIHC 上跑

配套脚本 ml08_autoencoder.py(W4 在产):

python scripts/machine-learning/ml08_autoencoder.py

输入:02 章 derived 的 expression_hvg5000.csv(只用 train + val 训,test 留作下游分类)

输出 ml08_figs/:

  • 重构损失曲线(train / val)— 训练健康度诊断
  • Latent embedding 散点(降到 2D 后涂色 Tumor / Normal)
  • PCA vs Autoencoder 对比(同样降到 2D 谁分得开)
  • 重构 vs 真实表达散点(模型学到了什么)

在线一键复现

ml-autoencoder 工具(W4 上线)— 上传 expression matrix,自动训 + 出 latent + 可视化。无需本地装 PyTorch。

重构损失诊断

训练好不好,看 loss 曲线:

train_loss
|\
| \
| \____ ← 平稳收敛 = 模型 OK
| \
+--------→ epochs
损失曲线形态诊断
平稳下降到 plateau✓ 健康
训练 loss 一直降,val loss 反弹✗ 过拟合 — 加 dropout / 减 latent dim
训练 loss 不降✗ 学不动 — 加 capacity / 增大 lr
loss 跳来跳去不收敛✗ lr 太大 / batch 太小

Latent embedding 干什么用

学好的 16 维 latent 比原始 5000 维好用得多:

  1. 下游分类:把 latent 喂 04 章工具,通常比原始特征更稳(降维抗噪)
  2. 可视化:再 PCA 到 2D 或 UMAP,看亚型 / batch / 临床特征是否分开
  3. 新样本评分:训完 encoder,新样本一行 forward 就有 latent — 不用重训
  4. 跨数据集对齐:在 train cohort 训 encoder,把 test cohort 数据投到同一 latent 空间

PCA vs Autoencoder vs scVI 对比

方法假设适用速度
PCA数据线性可分bulk RNA-seq baseline极快
Autoencoder非线性可分中等数据(N > 100)
scVI(09 章)单细胞 + count noise model + batch单细胞特定慢但准

PCA 永远先跑一次作为 baseline。如果 PCA 已经把任务分得很开(比如 LIHC Tumor vs Normal 在 PC1 分得清清楚楚),Autoencoder 复杂度 overkill。

实务约定:N < 100 用 PCA,100-1000 看任务难度,N > 1000 上 Autoencoder/scVI

何时该用 Deep Learning

不该用 — 样本量 < 200 / 特征数 < 1000 / 已知线性可分(PCA 先看)

该用 — 样本量 > 1000 / 高维稀疏数据 / 跨数据集迁移 / 多模态融合(表达 + 临床 + 影像)

生信场景(TCGA 几百到几千样本),Autoencoder 是"试试能不能比 PCA 强"的 hypothesis,不是必胜方案。

常见坑

训不收敛就加 epochs — 通常是 lr 太大或 capacity 太小,加 epochs 浪费时间。先看 loss 曲线诊断

latent dim = 2 直接画散点 — 2D latent 表达力极弱,16 维 + UMAP/PCA 到 2D 可视化更稳

不设 random seed → 每次结果不同torch.manual_seed(42) + np.random.seed(42) + torch.use_deterministic_algorithms(True) 三件套

train + test 一起训 — Autoencoder 看似无监督但仍要 train/test split,否则 latent embedding 在 test 上没泛化

混淆"重构损失低"和"latent 好用" — 重构 loss 只反映 fidelity,不反映 latent 可分性。latent embedding 散点 + 下游分类 AUC 才是终验

GPU 没生效白等model.to('cuda') + data.to('cuda') 都要,只 model 不 data 等于 CPU 跑

Methods 段写法模板

We trained a vanilla autoencoder using PyTorch v2.12 with the following
architecture: encoder = [Linear(5000, 256), ReLU, Linear(256, 16)],
decoder = [Linear(16, 256), ReLU, Linear(256, 5000)]. Training used Adam
optimizer (lr=1e-3), MSE loss, batch size 32, and 100 epochs with early
stopping on validation loss (patience=10). All training was performed on
n=294 train samples; n=62 val samples were used for early stopping. Latent
embeddings (16-d) were extracted for all samples and used as input features
for downstream classification (Module 04).

在线工具

(W4 完成后)ml-autoencoder 工具 — 上传 expression CSV,自动训 + 出 latent + 可视化。

本章状态

✅ Wave 4 正文完成(2026-05-27)。配套 ml08_autoencoder.py + ml-autoencoder 工具在产(W4-A)。

AI 陪学

让 AI 陪我学这一篇

AI 会读这篇文章后给你 3-5 步学习计划, 逐步陪你学完,最后出 1-3 道题验证你掌握得怎么样。 登录后 AI 才能记住你的进度。

静态文件

离线资料下载

手册 HTML / PDF 已在后台预生成,点击后直接下载网站静态资源。