1. 为什么RNA速度的方向总在摇摆
做过单细胞转录组分析的人,大概率都经历过这样的场景:跑完RNA速度(RNA velocity),在UMAP或者t-SNE图上画出一堆箭头,结果发现箭头方向乱得离谱——同一个细胞簇里,有的箭头指向分化终点,有的却指向完全相反的方向,甚至还有一堆箭头在原地打转。你盯着那张图看了半天,心里只有一个念头:这到底是生物学信号,还是算法在跟我开玩笑?
这个问题不是个例。RNA速度从2018年那篇经典文章出来之后,迅速成为单细胞分析里的热门工具,但它的"翻车率"也一直居高不下。核心原因在于,传统RNA速度的计算逻辑是:利用未剪接(unspliced)和已剪接(spliced)mRNA的比值,去推断每个细胞当前所处的转录动力学状态,然后把这个状态投射到低维嵌入空间里,形成方向向量。听起来很合理,但问题出在两个地方:第一,低维嵌入本身可能扭曲了真实的细胞间关系;第二,速度的估计高度依赖基因筛选、kNN图构建、稳态假设等一系列超参数,任何一个环节出问题,方向就会"摇摆"。
更麻烦的是,当你试图把空间转录组的数据也纳入进来时,事情会变得更复杂。空间位置信息告诉你细胞在哪里,RNA速度告诉你细胞要去哪里,但这两者之间的耦合关系并不是简单的"位置+方向"就能解决的。空间邻域里的细胞可能处于完全不同的分化阶段,而时间动力学上的相似细胞可能在空间上相隔很远。怎么把这两类信息有机地融合起来,同时还能让结果具备可解释性,就成了一个非常实际的问题。
STEER这个框架,就是冲着这个痛点来的。它的全称是Spatial-Temporal Expert Ensemble for RNA velocity,核心思路是把空间位置和时间动力学分别交给不同的"专家"网络去学习,然后通过一个可解释的门控机制来动态整合两路信息。我第一次看到这个思路的时候,觉得它比那些"一把梭"把所有特征拼接在一起的做法要聪明得多——因为空间和时间本来就是两个不同维度的信息,强行拼接只会让模型学到一堆噪声。
这篇文章我会从实际使用的角度,把STEER的核心设计、实操流程、参数调优、常见坑点全部拆开讲一遍。如果你正在做单细胞或者空间转录组的轨迹分析,尤其是被RNA速度的方向问题折磨过,那这篇内容应该能帮你省下不少试错时间。
2. STEER的核心设计思路拆解
2.1 为什么要把空间和时间拆成两个专家
先说一个我自己的观察:在传统的RNA速度分析里,空间信息通常是"事后"加上去的。比如你先在表达空间里算出速度向量,然后再把它投影到空间坐标上,看看方向是否合理。这种做法的问题在于,速度的计算过程完全没有考虑空间约束,所以当空间上相邻的细胞在表达上差异很大时,速度方向就会显得很突兀。
STEER的做法是反过来:它在计算速度的同时,就把空间邻域信息作为一个独立的专家网络输入进去。具体来说,整个框架包含三个主要模块:
- 时间动力学专家:输入是每个细胞的未剪接/已剪接表达谱,输出是该细胞在分化时间轴上的相对位置和速度方向。这个专家本质上是一个动力学建模网络,它学习的是基因表达随时间变化的规律。
- 空间位置专家:输入是细胞的空间坐标和空间邻域内的表达模式,输出是该细胞在空间上的局部结构特征。这个专家关注的是细胞在组织中的物理排布关系。
- 可解释门控网络:根据每个细胞当前的状态,动态决定时间专家和空间专家各自的权重。比如在分化中期、空间结构清晰的区域,空间专家的权重会更高;而在分化早期、空间信号较弱的区域,时间专家的权重会占主导。
这种设计的精妙之处在于,它没有强行假设空间和时间信息应该以某种固定比例融合,而是让模型自己根据数据去学习。更重要的是,门控权重本身就是一个可解释的输出——你可以直接看到每个细胞更依赖哪一路信息,这对于后续的生物学解释非常有帮助。
2.2 可解释性到底体现在哪里
很多号称"可解释"的模型,实际上只是给你一个注意力热图,你看了半天也不知道它到底在解释什么。STEER的可解释性体现在三个层面:
第一,专家分工明确。时间专家和空间专家各自负责一个明确的维度,不存在"黑箱混合"的问题。你可以单独看时间专家的输出,也可以单独看空间专家的输出,两者之间的差异本身就是有价值的信息。
第二,门控权重可视化。每个细胞的门控权重是一个二维向量(时间权重,空间权重),你可以把它投影到空间坐标或者UMAP上,直接观察哪些区域更依赖空间信息,哪些区域更依赖时间信息。我在实际数据上跑过之后发现,在组织边界或者结构清晰的区域,空间权重通常更高;而在分化过渡区域,时间权重会明显上升。
第三,速度方向可追溯。因为最终的速度向量是由两个专家的输出加权得到的,所以当某个细胞的速度方向看起来"不对劲"时,你可以直接回溯到是哪个专家给出了错误的方向,从而定位问题。这比传统方法里"一锅粥"式的速度估计要友好得多。
2.3 和传统RNA速度方法的本质区别
传统RNA速度方法(比如velocyto、scVelo)的核心是稳态假设或者动态模型,它们只关注表达谱本身,空间信息是后来加上去的。STEER则是在建模阶段就把空间信息作为一等公民纳入进来,而且不是简单地拼接特征,而是通过专家网络和门控机制来融合。
另一个关键区别是,STEER不依赖于预先定义的低维嵌入。传统方法通常要先做PCA或者UMAP,然后在低维空间里计算速度。但低维嵌入本身可能丢失重要的空间结构信息。STEER直接在原始表达空间和空间坐标上操作,避免了嵌入带来的信息损失。
当然,这种设计也带来了更高的计算复杂度。专家网络的训练需要更多的数据和更长的训练时间,而且门控网络本身也需要仔细调参。但从实际效果来看,这个代价是值得的——尤其是在空间转录组数据上,STEER的速度方向一致性明显优于传统方法。
3. 实操流程与核心环节实现
3.1 数据准备与预处理
在开始跑STEER之前,你需要准备两类数据:单细胞表达矩阵(包含未剪接和已剪接计数)和空间坐标信息。如果你用的是Visium或者Slide-seq这类空间转录组数据,空间坐标通常是spot或者bead的物理位置;如果是MERFISH或者seqFISH,坐标就是每个细胞的精确位置。
预处理步骤和常规单细胞分析类似,但有几个地方需要特别注意:
- 基因筛选:不要直接用全部基因跑速度。我一般会先筛选出在未剪接和已剪接计数上都至少有10个细胞表达的基因,然后再根据方差或者与分化相关的基因集进一步过滤。基因太多会引入噪声,太少又会丢失信号。
- 归一化:未剪接和已剪接计数需要分别归一化,但不要用同一个缩放因子。我通常会用scVelo推荐的归一化方式,然后对未剪接计数做额外的对数变换。
- 空间邻域构建:STEER需要每个细胞的空间邻域信息。对于Visium数据,我一般用最近邻的6-10个spot;对于MERFISH数据,可以用半径范围内的所有细胞。邻域大小会影响空间专家的学习效果,太小会丢失结构信息,太大会引入无关细胞。
注意:如果你的空间数据分辨率很低(比如每个spot包含多个细胞),建议先做去卷积,否则空间专家的输入会非常嘈杂。
3.2 时间动力学专家的训练要点
时间动力学专家的核心是一个变分自编码器(VAE)或者类似的动力学模型,输入是每个细胞的未剪接/已剪接表达向量,输出是潜在时间变量和速度向量。训练过程中有几个关键参数需要关注:
- 潜在维度:我一般从10维开始试,如果数据复杂度高可以增加到20-30维。维度太低会欠拟合,太高会过拟合。
- KL散度权重:这个参数控制潜在空间的正则化强度。权重太高会导致潜在变量过于平滑,丢失分化动态;太低则会让潜在空间过于分散。我通常从0.1开始,根据重构误差和速度一致性来调整。
- 训练轮数:时间专家通常需要比空间专家更多的训练轮数,因为动力学建模本身就更复杂。我一般会跑2000-3000个epoch,然后用早停策略防止过拟合。
训练完成后,你可以用时间专家的潜在变量做拟时序分析,看看是否和已知的生物学过程一致。如果潜在变量和已知的分化标记基因表达高度相关,说明时间专家学到了合理的动力学。
3.3 空间位置专家的构建细节
空间位置专家的输入是每个细胞的空间坐标和邻域表达模式,输出是空间结构特征。这个专家通常用图神经网络(GNN)或者卷积神经网络(CNN)来实现。对于不规则的空间坐标(比如MERFISH),GNN更合适;对于规则的网格数据(比如Visium),CNN也可以。
构建空间专家时,我踩过的一个坑是:直接用原始坐标作为输入。原始坐标的尺度可能差异很大,而且绝对位置本身并不包含太多生物学信息。更好的做法是用相对坐标或者局部邻域内的坐标差异作为输入。另外,邻域表达模式可以用邻域内细胞的平均表达或者表达差异来表示,这样能更好地捕捉空间结构。
空间专家的输出维度一般比时间专家低,因为空间结构的信息量相对较少。我通常用5-10维,然后通过门控网络和时间专家融合。
3.4 门控网络的设计与训练
门控网络是STEER的核心创新点,它的输入是时间专家和空间专家的中间层特征,输出是每个细胞的两路权重。门控网络通常是一个简单的多层感知机(MLP),但训练时需要特别注意:
- 权重初始化:门控网络的初始权重不要设得太大,否则训练初期会偏向某一路专家。我一般用较小的随机初始化,然后让模型自己学习平衡。
- 正则化:为了防止门控网络过度偏向某一路,我会加一个熵正则项,鼓励权重分布稍微均匀一些。但也不能太均匀,否则就失去了动态融合的意义。
- 联合训练:门控网络不能单独训练,必须和时间专家、空间专家一起联合优化。我通常先用预训练的时间专家和空间专家初始化,然后再联合微调。
训练完成后,你可以把门控权重投影到空间坐标上,看看哪些区域更依赖空间信息,哪些区域更依赖时间信息。这个可视化结果本身就是一篇很好的生物学故事。
3.5 速度向量的生成与后处理
最终的速度向量是时间专家和空间专家输出的加权和。生成速度向量后,还需要做一些后处理:
- 平滑处理:在空间邻域内对速度向量做平滑,可以减少噪声。但平滑窗口不要太大,否则会模糊真实的方向变化。
- 一致性检验:计算每个细胞的速度向量和其空间邻域内平均速度向量的余弦相似度,如果相似度太低,说明该细胞的速度估计可能不可靠。
- 可视化:我一般会用箭头图或者流线图来展示速度场,同时叠加门控权重的热图,这样能直观地看到空间和时间信息的贡献。
4. 常见问题与排查技巧实录
4.1 速度方向依然摇摆怎么办
即使用了STEER,速度方向还是可能在某些区域出现摇摆。这时候不要急着怀疑模型,先检查以下几个地方:
- 基因筛选是否合理:如果筛选出的基因里包含大量与分化无关的基因,时间专家的输出就会很嘈杂。我一般会先用已知的分化标记基因做一次验证,看看这些基因是否在筛选结果里。
- 空间邻域是否合适:邻域太大或者太小都会影响空间专家的学习。可以尝试不同的邻域大小,看看速度一致性是否改善。
- 门控权重是否极端:如果某个区域的门控权重几乎全部分配给了一路专家,说明另一路专家可能没有学到有效信息。这时候需要检查对应专家的输入和训练过程。
4.2 门控权重总是偏向一路专家
这是训练初期最常见的问题。原因通常是两路专家的输出尺度差异太大,导致门控网络倾向于选择尺度更大的那一路。解决方法是对两路专家的输出做标准化,让它们在同一个尺度上。另外,可以在门控网络的损失函数里加一个平衡项,惩罚权重分布的极端偏斜。
4.3 空间专家学不到有效结构
如果空间专家的输出和随机噪声差不多,说明它没有学到空间结构。可能的原因包括:空间坐标没有做归一化、邻域构建不合理、或者空间专家的网络容量太小。我一般会先用一个简单的空间自相关指标(比如Moran's I)来验证空间结构是否存在,如果数据本身就没有空间结构,那空间专家学不到东西也是正常的。
4.4 计算资源不够怎么办
STEER的训练确实比传统方法更耗资源,尤其是当细胞数量超过10万时。如果计算资源有限,可以考虑以下优化:
- 降采样:在训练时对细胞做降采样,但保留空间结构。比如可以按空间网格均匀采样,而不是随机采样。
- 分批训练:把数据分成多个批次,分别训练专家网络,然后再联合微调。
- 减少专家网络层数:在保证性能的前提下,适当减少网络层数和隐藏单元数。
4.5 如何验证STEER的结果是否可靠
验证速度分析的可靠性一直是个难题。我通常会用以下几个策略:
- 与已知生物学过程对比:如果速度方向指向已知的分化终点,说明结果至少是合理的。
- 跨样本一致性:如果有多个生物学重复,可以比较不同样本的速度场是否一致。
- 扰动实验:如果数据里有基因扰动或者药物处理,可以看看速度场是否发生了预期中的变化。
下面是一个常见问题的速查表,方便你快速定位和解决:
| 问题现象 | 可能原因 | 排查方法 | 解决建议 |
|---|---|---|---|
| 速度方向随机 | 基因筛选不当 | 检查分化标记基因是否在筛选结果中 | 重新筛选基因,增加与分化相关的基因 |
| 门控权重偏斜 | 专家输出尺度差异大 | 检查两路专家输出的均值和方差 | 对专家输出做标准化,加平衡正则项 |
| 空间专家无效 | 空间结构不明显 | 计算Moran's I | 检查空间坐标归一化,调整邻域大小 |
| 训练不收敛 | 学习率过高 | 观察损失曲线 | 降低学习率,增加训练轮数 |
| 速度场过于平滑 | 平滑窗口太大 | 检查平滑参数 | 减小平滑窗口,或不做平滑 |
5. 参数调优与实战经验分享
5.1 学习率与优化器的选择
STEER的训练涉及三个网络(时间专家、空间专家、门控网络),它们的学习率最好分开设置。我一般会给时间专家和空间专家用较小的学习率(1e-4到5e-4),门控网络用稍大的学习率(1e-3)。优化器方面,Adam基本够用,但如果训练不稳定,可以试试AdamW或者带梯度裁剪的SGD。
另外,学习率调度也很重要。我通常会用余弦退火或者阶梯式衰减,在训练后期降低学习率,帮助模型收敛到更稳定的解。
5.2 批次大小的选择
批次大小会影响训练的稳定性和速度。对于细胞数量在1万到5万之间的数据,我一般用256或者512的批次大小。如果细胞数量超过10万,可以用1024或者2048,但要注意内存占用。批次太小会导致梯度噪声大,批次太大则可能陷入局部最优。
5.3 早停策略的设置
早停是防止过拟合的关键。我一般会监控验证集上的速度一致性指标(比如速度向量和拟时序的相关系数),如果连续20个epoch没有提升,就停止训练。早停的耐心值不要设得太小,否则可能过早停止;也不要太大,否则浪费计算资源。
5.4 多专家数量的扩展
STEER最初的设计是两个专家(空间和时间),但实际上你可以扩展到更多专家。比如如果你有蛋白质表达数据(CITE-seq),可以加一个蛋白专家;如果你有染色质可及性数据(ATAC-seq),可以加一个表观专家。每增加一个专家,门控网络的输入维度就增加一维,但整体框架不变。我在一个多模态数据集上试过三个专家的版本,效果确实比两个专家更好,但训练时间也明显增加。
5.5 结果的可视化技巧
STEER的输出很丰富,但可视化时要注意不要信息过载。我一般会分层次展示:
- 第一层:速度场箭头图,叠加细胞类型或者聚类标签,展示整体趋势。
- 第二层:门控权重热图,展示空间和时间信息的贡献分布。
- 第三层:单个基因或者基因集的表达动态,验证速度方向的生物学合理性。
如果要做报告或者写文章,我建议把门控权重的可视化放在补充材料里,主图还是以速度场和生物学验证为主。
6. 从实际项目中学到的几个关键教训
6.1 不要迷信单一指标
速度分析的质量很难用单一指标衡量。我见过很多项目只盯着速度一致性或者拟时序相关性,结果忽略了生物学合理性。实际上,一个速度场可能在统计指标上很漂亮,但方向完全不符合已知的生物学过程。所以,一定要结合领域知识来评估结果。
6.2 空间信息不是万能的
虽然STEER把空间信息作为一等公民,但空间信息本身也有局限性。比如在细胞迁移活跃的区域,空间位置和分化阶段可能完全不相关。这时候如果门控网络过度依赖空间专家,反而会引入错误的方向。所以,门控网络的动态调节能力非常关键,不能简单地给空间信息一个固定权重。
6.3 预处理比模型更重要
我做过的好几个项目里,最终效果的好坏很大程度上取决于预处理,而不是模型本身。基因筛选、归一化、邻域构建这些步骤,每一个都可能显著影响最终结果。所以,不要急着调模型参数,先把预处理做扎实。
6.4 可解释性需要主动挖掘
STEER提供了可解释的门控权重,但这些权重本身不会自动告诉你生物学故事。你需要主动去分析:为什么这个区域空间权重高?为什么那个区域时间权重高?这些问题的答案往往藏在数据的空间结构和分化动态里。我一般会结合已知的解剖结构或者分化标记基因来做交叉验证。
6.5 计算成本要提前规划
STEER的训练时间比传统方法长不少,尤其是在大规模数据上。如果你要在集群上跑,建议提前规划好计算资源,并且做好断点续训的准备。我一般会把训练过程分成多个阶段,每个阶段保存检查点,这样即使中途中断也不用从头开始。
7. 后续可以尝试的扩展方向
STEER的框架其实很有扩展性。除了前面提到的多专家扩展,还可以考虑以下几个方向:
- 时间序列空间数据:如果你有多个时间点的空间转录组数据,可以把时间维度也作为一个专家,构建时空四维的分析框架。
- 扰动预测:在门控网络里加入扰动条件,预测不同扰动下的速度场变化。
- 跨样本整合:把多个样本的空间和时间专家联合训练,学习共享的动力学模式。
这些扩展方向我目前还在探索中,有些已经看到了不错的效果,有些还在踩坑阶段。等有更成熟的结论,再单独写一篇来分享。
最后说一个我自己的体会:RNA速度分析从来都不是一个"跑完就完事"的流程,它需要你不断地在计算结果的统计合理性和生物学合理性之间做权衡。STEER提供了一个很好的框架,把空间和时间信息拆开又融合,让这个过程变得更可控、更可解释。但工具再好,最终还是要靠你对数据的理解和判断。