scBert的输入是什么?怎么构造的,有例子吗?
1. scBERT 的输入是什么?
scBERT 的输入是单细胞 RNA 测序(scRNA-seq)数据中单个细胞的基因表达谱。
- 原始数据形式:原本是连续变量,代表单个细胞中数万个基因的表达水平。
- 序列长度:由于使用了 Performer 架构,scBERT 可以支持超过 16,000 个基因作为输入序列,无需像传统方法那样进行基因选择(如高变基因选择)或降维处理。
2. 输入是如何构造的?
输入由两部分嵌入(Embedding)逐元素相加(Element-wise addition) 而成:
A. 表达嵌入 (Expression Embedding, ):
- 分箱处理(Binning):由于原始基因表达量是带有噪声的连续变量,scBERT 借鉴了词袋技术,将连续的表达值进行“分箱”处理。
- 离散化:分箱将表达值转换成离散值(可理解为该细胞中基因的转录频率),从而降低数据噪声,使其更符合 Transformer 模型的处理习惯。
B. 基因嵌入 (Gene Embedding, ):
- 身份表示:在 BERT 中使用位置嵌入(Positional Embedding),但在单细胞数据中,基因的排列顺序没有意义。因此,scBERT 使用 gene2vec 预训练得到的向量来代表基因的身份。
- 语义捕捉:这种嵌入可以看作是“相对嵌入”,它捕捉了基因之间的通用共表达信息和语义相似性(功能接近的基因在向量空间中更接近)。
3. 构造例子
构造过程如下:假设情景:我们要输入某个细胞中的“第一个基因”。
- 第一步(表达量处理): 该基因在这个细胞里的原始表达量经过分箱后,落入了“第二个箱子”(Bin 2)。模型会提取对应的表达嵌入向量 \(E_{e}\)。
- 第二步(基因身份提取): 该基因本身的身份(例如它是 TP53 基因)对应一个由 gene2vec 预定义的唯一嵌入向量 \(E_{g}\)。
- 第三步(合成输入): 将该基因的身份向量 \(E_{g}\) 和表达量向量 \(E_{e}\) 相加。最终结果:这个相加后的向量作为该基因的表征,输入到 Performer 编码器中进行处理。
总结:
scBERT 的输入构造公式可以简述为:
输入 = 分箱后的离散表达嵌入 (\(E_e\)) + 基于 gene2vec 的基因身份嵌入 (\(E_g\))
表达嵌入和基因嵌入具体是怎么做的,能否有详细的过程?
scBERT 的表达嵌入(Expression Embedding) 和基因嵌入(Gene Embedding) 的构造过程可以拆解为以下详细步骤:
1. 表达嵌入 (Expression Embedding) 的构造过程
这一步的目的是将原始的、带有噪声的连续数值(基因表达量)转化为模型能够处理的离散特征。
- 第一步:原始数据获取
获取单细胞测序后的原始矩阵,其中每一行代表一个细胞,每一列代表一个基因。单元格里的数值是连续变量(反映基因表达水平)。 - 第二步:分箱处理 (Binning)
为了处理连续变量并降低生物/技术噪声,scBERT 借鉴了 NLP 中的词袋技术。它将基因表达值的范围划分为若干个“箱子”(Bins)。例如,如果设定了 10 个等级,那么表达量在 0-1 之间的可能归入 Bin 1,1-5 之间的归入 Bin 2,以此类推。 - 第三步:离散化 (Discretization)
经过分箱,原本的连续数值(如 1.28, 5.67)被转换成了离散的索引值(如 Bin 2, Bin 5)。这代表了该细胞中基因的转录频率等级。 - 第四步:映射为向量
每一个 Bin 索引会被映射为一个高维实数向量。这个向量的维度与基因嵌入的维度保持一致,以便后续相加。
2. 基因嵌入 (Gene Embedding) 的构造过程
这一步的目的是赋予每个基因一个“身份证明”,并携带基因之间的功能相似性信息。
-
第一步:基因身份确定
每个基因(如 TP53、GAPDH 等)都有一个唯一的标识。在 scBERT 中,每个基因的绝对位置是不重要的(不像文本中词的顺序),因为打乱列顺序不改变生物学含义。 -
第二步:利用 gene2vec 预训练
scBERT 不使用随机初始化的嵌入,而是直接采用 gene2vec 生成的预训练向量。 -
原理:gene2vec 类似于 NLP 中的 Word2vec,它是通过大规模基因共表达数据训练出来的。
-
效果:如果两个基因经常在各种组织中同时表达(共表达),那么它们在向量空间中的距离就会非常接近。
-
第三步:提取固定嵌入
对于输入的每一个基因,根据其 ID 从 gene2vec 库中提取对应的唯一向量 。这个向量捕捉了基因的“语义信息”和潜在的相互作用。
3. 最终输入的合成:逐元素相加
得到上述两个向量后,构造完整输入的最后一步是:
- 对齐:对于细胞中的每一个基因 ,找到其对应的基因嵌入向量 和表达嵌入向量 。
- 求和:将这两个向量进行逐元素相加(Element-wise addition):
- 输入 Performer:相加后的结果作为一个整体序列,输入到 Performer 编码器中。
详细例子(以一个基因为例):
假设我们要处理一个细胞里的 A 基因:
- 基因嵌入:查询 gene2vec 词典,发现 A 基因 的身份向量是
[0.1, -0.2, 0.5, ...]。 - 表达嵌入:该细胞中 A 基因 的表达量很大,经过分箱被归为 第 9 箱 (Bin 9)。Bin 9 对应的表达向量是
[0.05, 0.1, -0.1, ...]。 - 合成:将两个向量相加,得到
[0.15, -0.1, 0.4, ...]。 - 意义:这个最终向量既告诉了模型“我是哪个基因”(身份信息),也告诉了模型“我在这个细胞里表达量有多高”(状态信息)。
gene2vec怎么训练,输入是什么,token是什么,句子是什么?
要深入理解 gene2vec 的训练过程,最直白的办法就是对照自然语言处理(NLP)中的 Word2vec。在生物学语境下,研究者把“生命的代码”当成了一门“语言”。
以下是 gene2vec 训练的详细拆解:
1. 概念类比表(核心逻辑)
要理解它的输入,首先要进行角色转换:
| NLP 概念 | gene2vec 对应概念 | 说明 |
|---|---|---|
| 词 (Token) | 基因 (Gene) | 每一个唯一的基因(如 TP53)就是一个单词。 |
| 句子 (Sentence) | 共表达基因集合/对 | 在同一个生物样本或实验中,表现出高度相关性的基因群。 |
| 语料库 (Corpus) | GEO 等公共数据库 | 包含数千个不同实验、数万个样本的基因表达大数据集。 |
| 语义相近 | 功能相关/共表达 | 经常一起出现的词意思相近;经常一起表达的基因功能相关。 |
2. gene2vec 到底是怎么练出来的?
第一步:准备语料库(数据输入)
训练 gene2vec 的输入通常不是单一的数值,而是从海量公共数据(如 GEO 数据库)中提取的基因关系图。
- 原始输入:数千个矩阵,每个矩阵记录了成千上万个样本中基因的表达量。
- 预处理:计算基因之间的相关性(例如皮尔逊相关系数)。如果基因 A 和基因 B 在 1000 个样本中总是同步忽高忽低,它们就被打上“强关联”的标签。
第二步:构造“句子”
在 NLP 中,句子是单词的序列。在 gene2vec 中,没有天然的顺序,所以研究者通过以下方式构造“句子”:
- 方法 A(对齐法):将相关性极高的基因两两配对,比如
(基因A, 基因B),这对就是一个微型“句子”。 - 方法 B(邻居法):对于每一个基因,找到与其关联最紧密的 Top N 个基因,把它们排在一起作为一个“上下文窗口”。
第三步:模型训练(算法)
scBERT 引用的 gene2vec 通常采用 Word2vec 的 Skip-gram 模式进行训练:
- 输入 (Center Word):选定一个基因(如 CD4)。
- 预测 (Target Context):让模型去预测这个基因的“邻居”是谁(比如 CD3)。
- 调整:如果模型猜对了,就加强这两个基因向量的相似度;猜错了就推开。
- 结果:经过数亿次的预测尝试,模型为每个基因生成了一个固定长度的向量(通常是 200 或 300 维)。
3. 一个具体的例子
假设我们要训练一个关于“免疫系统”的基因向量:
- 数据输入:我们拿到了 1000 个 T 细胞的实验数据。
- 发现规律:数据显示,每当 CD3D 基因高表达时,CD3E 基因也必然高表达。
- 构造 Token 和句子:
- Token:
CD3D,CD3E,TP53,MYC... - 生成的“句子”/对:
[CD3D, CD3E],[CD3D, CD247]。
- 训练过程:模型学习到,在向量空间中,把
CD3D的向量往CD3E的方向拉近。 - 最终产物:当你去查
CD3D的 gene2vec 向量时,你会发现它和CD3E的余弦相似度极高。
4. 为什么 scBERT 不直接自己练,而是用 gene2vec?
这是为了“迁移学习”:
- gene2vec 的知识:来源于全人类过去几十年积累的宏观基因关系(这种关系在所有细胞中具有一定的普适性)。
- scBERT 的预训练:是在单细胞层面学习更精细的表达模式。
总结:
gene2vec 的Token是基因 ID,句子是共表达的基因对/群。它训练的本质是把生物学上的“共表达关系”编码进数字向量中。
这样,当 scBERT 看到两个基因时,即使这两个基因在当前的单细胞数据中表达很低,它也能通过 gene2vec 知道它们在生物学逻辑上其实是“亲戚”。
Skip-gram 模式具体是什么?
Skip-gram 是 Word2vec 算法中的一种核心架构(另一种是 CBOW)。它的核心思想非常直观:给定一个“中心词”,去预测它周围可能出现的“背景词”(上下文)。
在 gene2vec 的语境下,Skip-gram 的目标就是:给定一个特定的“基因”,预测哪些基因最可能与它同时表达。
1. Skip-gram 的核心逻辑:以点带面
想象你在读一句话,或者在观察一个细胞里的基因表达列表。
- CBOW (另一种模式):像是在做“完形填空”。给周围的词,让你猜中间那个词是什么。
- Skip-gram:像是“举一反三”。给中间那个词,让你猜它的邻居是谁。
为什么 gene2vec 偏好 Skip-gram?
因为 Skip-gram 在处理大规模语料(或庞大的基因数据库)时,对于出现频率较低但具有重要生物学意义的基因,能学习到更好的向量表示。
2. 具体训练过程(以基因为例)
第一步:定义“窗口”(Window Size)
在文本中,窗口是中心词前后 2-5 个词。在基因数据中,我们会根据基因之间的相关性排序,定义一个“功能窗口”。
例如,我们有一个关联序列:[基因A, 基因B, 基因C, 基因D, 基因E]。
如果我们选 基因C 为中心词,窗口大小为 2,那么它的上下文就是 {基因A, 基因B, 基因D, 基因E}。
第二步:构造训练样本(Training Pairs)
Skip-gram 会把这个窗口拆解成多对“输入-输出”组合:
- (输入: 基因C) -> (输出: 基因A)
- (输入: 基因C) -> (输出: 基因B)
- (输入: 基因C) -> (输出: 基因D)
- (输入: 基因C) -> (输出: 基因E)
第三步:神经网络的前向传播
- 输入层:输入中心基因的 One-hot 编码(一个极长的向量,只有基因 C 的位置是 1,其余是 0)。
- 隐藏层(嵌入层):One-hot 向量乘以一个巨大的权重矩阵 。这个矩阵的每一行其实就是我们要找的基因嵌入向量。
- 输出层:通过另一个权重矩阵 ,计算出全词库(所有基因)中每个基因出现的概率。
第四步:计算误差与更新
- 目标:我们希望模型预测“基因A”的概率尽可能高。
- 优化:如果模型预测基因 A 的概率很低,就通过反向传播算法调整权重矩阵 和 中的数值。
- 结果:经过数百万次这种“看中心基因猜周围基因”的练习,功能相似的基因在权重矩阵 里的数值会变得非常接近。
3. 数学表达(简略)
Skip-gram 的目标是最大化在给定中心基因 时,观察到上下文基因 的条件概率:
-
\(v_{g_c}\) 是中心基因的向量。
-
\(v_{g_o}\) 是目标上下文基因的向量。
-
分母是对所有基因的求和(用于归一化)。
4. 总结:它对 scBERT 意味着什么?
通过 Skip-gram 训练出的 gene2vec,本质上是一个“基因关联图谱”的浓缩版。
当 scBERT 使用这些向量作为输入时,它不再只是处理一堆互不相关的数字。比如,当输入包含 CD3D 的 gene2vec 向量时,Skip-gram 已经提前告诉了模型:“注意,这个基因通常和免疫识别有关,它在功能上和 CD3E 非常接近。” 这种先验知识极大地降低了 scBERT 学习细胞类型的难度。