文章目錄
- ? 空間轉錄組測序方式總體劃分
- 🧬 成像型空間轉錄組(Imaging-based ST)
- 原理:
- 技術代表 & 特點:
- 優點:
- 局限:
- 🧬 測序型空間轉錄組(Sequencing-based ST)
- 原理:
- 技術代表 & 特點:
- 優點:
- 局限:
- 📊 成像型 vs 測序型空間轉錄組對比表
- ? 回到你問的 SpatialHuman30M 構建策略理解:
- 🎯 總結你的問題:
- ? ① **Neighborhood Enrichment Analysis:空間鄰近富集分析**
- 🔍 方法目標:
- 🧠 背后原理:
- 📘 文章中怎么用的?
- 📌 應用意義:
- ? ② **Graph-based tissue segmentation:STAGATE 空間聚類方法**
- 🔍 方法目標:
- 🧠 背后原理:
- 📘 文章中怎么用的?
- 📌 應用意義:
- ? ③ **Spatial Autocorrelation (Moran's I):空間自相關性分析**
- 🔍 方法目標:
- 🧠 背后原理:
- 📘 文章中怎么用的?
- 📌 應用意義:
- 🎯 三者之間的關系總結圖
- ? 總結對照表
- 核心背景:空間轉錄組技術的天然局限
- 技術流程(對應圖 3A)
- 關鍵實驗與結果
- 1. 細胞類型反卷積:提升混合斑點解析力(對應圖 3B)
- 2. 基因表達插補:跨技術補全基因信息(對應圖 3C、3D)
- 總結
- 1. 已知純細胞類型的參考數據(“真實”細胞組成的直接來源)
- 2. 人工注釋或已有權威標注(間接但可靠的驗證依據)
- 3. 多技術聯合驗證(“交叉印證” 出的 ground truth)
- 一、Tangram 是干啥的?核心目標
- 二、圖里流程到底在干啥?分步拆解
- 步驟 1:準備 “參考特征矩陣” 和 “構建矩陣 \( M \)”
- 步驟 2:優化 \( M \),讓 “參考” 和 “實際” 匹配
- 步驟 3:用優化好的 \( M \),做反卷積/插補
- 三、Tangram 矩陣方法的本質:“找映射,用參考補目標”
- 四、舉個生活化例子,幫你理解
- ? 按照“數據流動順序”重新完整講解模型預訓練流程(函數+結構)
- 🟢 Step 0:入口函數 `forward(**kwargs)`
- ? 作用:
- 🔷 分支 1:感知路徑 `perceptual_forward()`
- 輸入:
- 🧩 步驟一:編碼 `_encode()`
- 🧩 步驟二:表達值預測 `self.decoder(...)`
- 🧩 步驟三:多任務模塊 `_extend_output(...)`
- 🔷 分支 2:生成路徑 `generative_forward()`
- 輸入:
- 🧩 步驟一:`transformer_generate()`
- 🧩 步驟二:合并輸出 → `transformer_output`
- 🧩 步驟三:表達值預測(觀測段 + 生成段)
- 🧩 步驟四:多任務 `_extend_output(...)` 同感知路徑
- 🔶 總結整體數據流(簡潔圖解)
- ? 回到你的問題核心
- ? 所在背景回顧
- ? 這句代碼的本質行為:
- 🔍 這有什么意義?為什么要這么做?
- 🧠 背后核心思想是:
- 🧪 舉個實際使用場景
- ? 小結這句代碼的作用:
- ? 你的理解核心是正確的:
- 📌 `get_batch_cell_embeddings(...)` 的作用:
- ? 在這段代碼中,關鍵過程是:
- 🔹 1. 構建 Dataset
- 🔹 2. `_encode()` 模型編碼函數調用
- 🔹 3. 返回矩陣 `cell_embeddings`
- ? 所以你說的結論完全正確:
- ? 那接下來它能做什么用?(你可以怎么用它)
- ? 1. 用于生成任務的“條件注入”
- ? 2. 用于下游分類/聚類任務
- ? 3. 用于 KNN 相似性查找
- 🔍 附加建議(你可以拓展的點)
- ? 最后總結一下你這段代碼的定位:
非常好的問題!你提到的 SpatialHuman30M 數據集中采用了兩大類空間轉錄組技術:成像型(imaging-based) 和 測序型(sequencing-based)。這是目前空間轉錄組研究中最核心的技術劃分之一。
下面我會系統總結這兩種方式的原理差異、技術代表、優缺點對比,并結合你列出的 Xenium、MERFISH、Visium、Visium HD 來分別講解它們的技術特點與使用意義。
? 空間轉錄組測序方式總體劃分
分類 | 成像型空間轉錄組 | 測序型空間轉錄組 |
---|---|---|
代表技術 | MERFISH, Xenium, seqFISH, CosMx | 10x Visium, Visium HD, Slide-seq |
數據獲取方式 | 通過熒光成像識別RNA分子在組織切片中的位置 | 通過高通量測序讀取轉錄本并結合位置條碼還原空間分布 |
主要原理 | 原位雜交(FISH) + 圖像識別 | 條碼探針(barcode)定位 + RNA捕獲 + RNA-seq |
🧬 成像型空間轉錄組(Imaging-based ST)
原理:
直接在組織切片上,通過熒光探針原位雜交(FISH),結合高分辨率顯微成像,將每個mRNA分子精確定位到單細胞甚至亞細胞水平。
技術代表 & 特點:
技術 | 特點 |
---|---|
MERFISH | 基于多輪次熒光雜交編碼,檢測數百到數千個基因;精度高,分辨率達亞細胞級,空間結構精準 |
Xenium(10x Genomics) | 最新成像平臺,支持 400+ 目標轉錄本檢測,支持FFPE樣本,兼具通量與空間分辨率 |
CosMx(NanoString) | 支持 RNA + 蛋白同時空間成像,適合細胞間互作分析 |
優點:
- 🔍 單細胞/亞細胞級別的精度
- 🔬 保留完整組織結構,可分辨組織微環境
- ? 非破壞性檢測,適合組織病理配合分析
局限:
- ?? 探針數目有限(目標基因型,數百到幾千個)
- 💰 成本高、流程復雜、圖像處理計算量大
- 🧪 不支持全轉錄組檢測
🧬 測序型空間轉錄組(Sequencing-based ST)
原理:
將組織切片放置在帶有空間條碼探針的芯片(如Visium)上,通過位置條碼捕獲組織中的mRNA,然后提取RNA進行高通量測序,將表達譜回推至空間位置。
技術代表 & 特點:
技術 | 特點 |
---|---|
Visium | 主流平臺,基于 55 μm 大小 spot,支持全轉錄組測序,空間分辨率中等 |
Visium HD | 10x 最新升級版,spot 縮小至 <5μm,空間分辨率接近單細胞 |
Slide-seqV2 | 用珠子陣列實現 10μm 分辨率的全轉錄組捕獲,數據稀疏度高 |
優點:
- 🧬 全轉錄組覆蓋(不限制目標基因)
- 🚀 通量高,支持大組織切片或批量樣本處理
- 💰 成本相對較低,適合大規模Atlas構建
局限:
- 🧭 分辨率有限(Visium為spot級,通常包括多個細胞)
- ? 需組織穿透處理,會影響某些組織結構
- 🔬 需要計算反卷積來恢復單細胞信息
📊 成像型 vs 測序型空間轉錄組對比表
比較維度 | Imaging-based(如Xenium, MERFISH) | Sequencing-based(如Visium) |
---|---|---|
空間分辨率 | ? 高(單細胞甚至亞細胞) | ?? 中(Visium為55μm spot) |
檢測通量 | ?? 中(幾百-幾千基因) | ? 高(全轉錄組) |
成本 | 高 | 較低 |
適合用途 | 精細結構、生物互作驗證 | Atlas構建、基因發現、區域表達 |
數據類型 | 圖像 + 表達矩陣 | 表達矩陣 + 空間坐標 |
分析難度 | 圖像分割復雜 | 表達建模復雜(需反卷積) |
? 回到你問的 SpatialHuman30M 構建策略理解:
技術 | 占比 | 使用目的 |
---|---|---|
Xenium (48%) | 大量使用,兼顧成像和商業可及性 | 在多個器官中精確定位細胞類型,用于組織微結構標注 |
MERFISH (40%) | 大規模精細標注 epithelial/免疫細胞位置 | 用作細胞互作、高保真空間驗證 |
Visium/HD (12%) | 雖占比低,但是全轉錄組 backbone | 提供組織級表達圖譜,是反卷積訓練和標注核心來源 |
🎯 總結你的問題:
問題 | 答案 |
---|---|
為什么有成像和測序兩類? | 因為兩者各有優勢:成像精準但通量低,測序全景但分辨率低,互補 |
Xenium和MERFISH的特點? | 都是成像型技術,分辨率極高,適合做cell type定位和組織微結構分析 |
Visium為什么也被使用? | 它是最成熟的測序型 ST平臺,雖然分辨率不高,但可用于構建全器官轉錄組表達Atlas,是基礎“骨架”數據 |
如果你需要,我可以:
- 提供成像型 ST(如MERFISH)數據的常用預處理/空間配準/細胞分割流程
- 幫你設計一個用于反卷積訓練的 ST數據整合策略(多平臺混合訓練)
- 或進一步分析 SpatialHuman30M 的樣本分布與器官組織編碼結構
是否繼續?
A spatially resolved single-cell genomic atlas of the adult human breast 文章總結
你對空間結構分析部分的關注非常精準!這是目前空間組學中最具研究潛力的方向之一 —— 如何從表達數據中識別出組織結構與細胞互作的“空間邏輯”。下面我將圍繞你關心的三項方法:
① Neighborhood enrichment analysis
② Graph-based tissue segmentation (STAGATE)
③ Spatial autocorrelation (Moran’s I)
進行詳細解釋,每一項都結合論文原文使用情況 + 原理 + 應用效果,幫助你建立空間建模完整認知。
? ① Neighborhood Enrichment Analysis:空間鄰近富集分析
🔍 方法目標:
識別不同細胞類型是否在組織切片中有特定的共定位模式,即:誰跟誰經常靠在一起?
🧠 背后原理:
- 基于 smFISH/CODEX 空間坐標數據,每個細胞都有(x, y)位置和 cell type。
- 統計某一細胞類型A周圍的細胞類型B是否顯著富集(與隨機分布相比)。
- 利用 permutation test 或 Monte Carlo 模擬進行顯著性檢驗。
📘 文章中怎么用的?
在 Fig. 3 中,作者使用該方法分析:
- 哪些細胞類型具有共生關系(如 LumSec 常與 CD4+ T cell 相鄰)
- 哪些細胞類型具有互斥關系(如 fibroblast 避開免疫細胞)
原文:
“To investigate potential cell–cell interactions, we performed neighborhood enrichment analysis using spatial coordinates of smFISH-identified cells…”
📌 應用意義:
應用 | 舉例 |
---|---|
構建組織微環境圖譜 | 發現免疫細胞聚集區域、上皮細胞嵌套結構 |
指導功能研究 | 識別免疫抑制區、旁分泌調控熱點 |
增強空間反卷積可信度 | 如果某類細胞總是一起出現,可以作為結構先驗 |
? ② Graph-based tissue segmentation:STAGATE 空間聚類方法
🔍 方法目標:
讓ST表達數據不只是表達上的聚類,還能融合空間鄰接信息,實現空間感知的組織分割。
🧠 背后原理:
- 每個 spot 看作圖節點,構建空間圖(鄰接spot用邊連接)。
- 表達數據作為節點特征。
- 利用圖神經網絡(Graph Attention Network),在聚類前對節點進行空間感知的特征更新。
- 最終聚類不僅表達相似,還空間上連續。
工具名為:STAGATE
論文來源:Nature Communications, 2022
📘 文章中怎么用的?
- 用于分析ST數據形成的組織區域,如導管、腺泡、結締組織等。
- 與 scRNA-seq 無需直接匹配,作為一種組織層級結構提取方法。
- 對多個患者樣本進行對齊后比較。
原文:
“We applied STAGATE to identify spatially coherent clusters that corresponded to histological regions across breast tissue…”
📌 應用意義:
應用 | 說明 |
---|---|
提取組織功能模塊 | 比如識別出整個腺泡區域 vs 免疫侵潤區域 |
為反卷積提供區域先驗 | Cluster 1可能是腺泡樣結構,反卷積時只考慮上皮細胞亞型 |
跨樣本組織結構對齊 | 多個患者的乳腺結構自動識別,便于meta分析 |
? ③ Spatial Autocorrelation (Moran’s I):空間自相關性分析
🔍 方法目標:
判斷某個基因的表達在空間中是否“成片狀”集中,還是“隨機分布”。
🧠 背后原理:
- 每個 spot 是一個地理點,某個基因在這些點上的表達值是變量。
- 計算Moran’s I 系數(類似于空間版的 Pearson 相關):
I = N W ? ∑ i ∑ j w i j ( x i ? x ˉ ) ( x j ? x ˉ ) ∑ i ( x i ? x ˉ ) 2 I = \frac{N}{W} \cdot \frac{\sum_{i}\sum_{j} w_{ij}(x_i - \bar{x})(x_j - \bar{x})}{\sum_{i}(x_i - \bar{x})^2} I=WN??∑i?(xi??xˉ)2∑i?∑j?wij?(xi??xˉ)(xj??xˉ)?
其中 w i j w_{ij} wij? 是鄰接矩陣, x i x_i xi? 是表達值。
- I > 0 表示空間上聚集;I ≈ 0 表示無空間結構;I < 0 表示互斥分布。
📘 文章中怎么用的?
- 在 ST 數據中對每個基因計算 Moran’s I 值。
- 識別出具有空間特異性表達模式的關鍵基因。
原文:
“We applied spatial autocorrelation analysis (Moran’s I) to the ST data to identify genes with spatially coherent expression patterns…”
📌 應用意義:
應用 | 舉例 |
---|---|
找到“空間 marker gene” | 比如某基因只在導管邊緣表達,提示其結構功能作用 |
增強空間聚類可信度 | 可以作為 STAGATE 的空間特征補充輸入 |
構建空間表達網絡 | 聚集表達的基因可能共調控或功能相關 |
🎯 三者之間的關系總結圖
smFISH/CODEX定位的單細胞↓【1. Neighborhood Enrichment】判斷細胞類型間的空間共存關系↓反映微環境結構ST表達譜↓[2. STAGATE 圖聚類]空間結構 + 表達模式 → 區域劃分↓獲得組織功能區域ST表達譜↓[3. Moran’s I 空間自相關分析]找到空間上富集的基因
? 總結對照表
方法 | 原理 | 在文中作用 | 應用意義 |
---|---|---|---|
Neighborhood Enrichment | 細胞間空間鄰近頻率統計 | 分析不同cell type是否共現 | 揭示細胞互動結構 |
STAGATE(圖神經聚類) | GNN感知表達+空間圖 | 拓撲一致的空間結構聚類 | 建立組織功能模塊 |
Moran’s I | 空間統計:表達的聚集程度 | 找到空間顯著表達基因 | 構建空間marker集 |
如果你希望深入分析或復現這些方法,我可以提供 Python 代碼框架(如:用 scanpy
, squidpy
, torch-geometric
實現 STAGATE 和 Moran’s I),或幫助你將這些方法遷移到自己的數據集上。是否需要?
這部分內容圍繞 scGPT-spatial 在細胞類型反卷積和基因表達插補任務中的應用 展開,結合技術原理與實驗驗證,展現其提升空間轉錄組數據解析能力的優勢,以下是具體總結:
核心背景:空間轉錄組技術的天然局限
不同空間轉錄組技術存在互補性缺陷:
- 測序類(如 Visium):分辨率低,每個 “斑點” 常是多種細胞的混合,需計算反卷積推測細胞類型占比;
- 成像類(如 MERFISH、Xenium):分辨率高(單細胞 / 亞細胞級),但基因檢測Panel 有限(僅幾百個基因),對未檢測基因需 “插補” 補全表達值。
scGPT-spatial 聚焦解決這些問題,通過 參考數據驅動的細胞類型反卷積 + 基因表達插補,增強空間轉錄組數據的分辨率與基因覆蓋度。
技術流程(對應圖 3A)
基于 Tangram 提出的 “檢索式” 方法,核心流程分兩步:
- 構建矩陣優化:用非負矩陣分解(NMF),從參考特征矩陣中優化出 “構建矩陣”,使其能重構實際特征矩陣;
- 任務適配:
- 細胞類型反卷積:構建矩陣的行向量,將單細胞測序(scRNA-seq)參考的細胞特征,映射到 Visium 斑點,推測細胞類型組成;
- 基因表達插補:同理,用行向量從參考數據中檢索相關基因表達譜,補全目標數據的缺失值。
關鍵實驗與結果
1. 細胞類型反卷積:提升混合斑點解析力(對應圖 3B)
- 實驗:在人類乳腺 Visium 數據集(10 張切片)上,對比 scGPT-spatial、Tangram、Cell2location;
- 指標:用 Macro F1 衡量主要細胞類型預測準確性;
- 結論:scGPT-spatial 平均 Macro F1 達 0.58,超 Tangram 約 6%;且預測的細胞類型空間分布,與真實組織模式高度吻合(Tangram 相對模糊,Cell2location 易 “過度平滑” 丟失細節 )。
2. 基因表達插補:跨技術補全基因信息(對應圖 3C、3D)
-
場景 1:MERFISH + scRNA-seq 參考(圖 3C)
- 以人類丘腦發育數據為例,對 6 個空間差異基因插補,scGPT-spatial 中位 Pearson 相關系數超 0.6;
- 如基因 MKI67,scGPT-spatial 預測的表達模式與真實高度一致,Tangram 空間結構還原度更低。
-
場景 2:Xenium + Visium 參考(圖 3D)
- 在胎兒肺多模態數據中,對上皮標記基因 IGFBP5 插補,scGPT-spatial 整體 Pearson 相關系數更高,能精準還原氣道組織基因表達,展現跨分辨率數據整合能力。
總結
scGPT-spatial 通過 檢索式矩陣優化流程,有效解決空間轉錄組技術的 “混合細胞解析難”“基因覆蓋不全” 問題:
- 反卷積任務中,提升混合斑點的細胞類型預測精度;
- 插補任務中,跨技術(測序 / 成像)、跨分辨率補全基因表達,為下游分析提供更完整數據支撐。
實驗驗證其在多數據集(乳腺、丘腦、胎兒肺等)中,性能優于 Tangram 等方法,凸顯基礎模型對空間轉錄組數據的增強價值。
(注:圖中 A 是技術流程示意圖,B - D 分別對應細胞反卷積、MERFISH 基因插補、Xenium 基因插補的實驗結果可視化,用指標、熱圖、箱線圖等對比不同方法表現 )
在細胞類型反卷積(cell - type deconvolution)任務中,ground truth(真實標簽)的獲取通常依賴于“金標準”數據或已知的參考信息 ,以下結合研究場景具體說明常見來源,也對應你提到的空間轉錄組研究里的反卷積場景:
1. 已知純細胞類型的參考數據(“真實”細胞組成的直接來源)
-
單細胞測序(scRNA - seq)數據:
若研究目標是解析 Visium 等 “混合斑點” 的細胞類型,可先對同組織(或同類組織)做單細胞測序,篩選出 純細胞類型的基因表達譜(比如純上皮細胞、純基質細胞的 scRNA - seq 數據 )。這些純細胞的基因表達,就是反卷積中 “單個細胞類型應有的特征”,可作為反卷積的參考 ground truth 基礎。
例如在文章里,反卷積會用 scRNA - seq 參考數據,本質是因為 scRNA - seq 能分離出純細胞,其表達譜就是 “理想狀態下該細胞類型的真實特征”,后續反卷積預測的混合斑點細胞占比,可與基于 scRNA - seq 推斷的 “理論占比” 對比驗證。 -
高分辨率成像技術數據(如 MERFISH、Xenium):
這類技術能實現單細胞 / 亞細胞分辨率的空間定位,若某組織先用 MERFISH 測過,已知每個小區域的純細胞類型(比如明確標記出 “此處是純內皮細胞” ),這些 高分辨率下的純細胞標注,也能作為反卷積任務的 ground truth 。比如用 MERFISH 先給組織 “精準打標簽”,再拿 Visium 低分辨率數據做反卷積,用 MERFISH 的標注驗證結果。
2. 人工注釋或已有權威標注(間接但可靠的驗證依據)
-
組織學染色 + 專家注釋:
對研究的組織切片,補充傳統組織學染色(如免疫組化、熒光標記特定細胞類型),再由領域專家手動標注 “哪些區域是哪種細胞類型主導” 。這種 人工標注的 “細胞類型分布地圖”,可作為反卷積結果的 ground truth 對比依據。
比如文章里提到的人類乳腺、胎兒肺數據集,可能就結合了這類專家注釋的組織學信息,輔助確定 “真實的細胞類型分布”,用于驗證反卷積是否準確。 -
公共數據庫 / 已有研究的權威標注:
像人類大腦皮層、腫瘤組織等研究,已有大量公開的、經過驗證的 “細胞類型空間分布” 標注(比如某腦區各層細胞類型的經典分布 )。新研究做反卷積時,可直接引用這些 領域內公認的標注 作為 ground truth ,驗證算法是否能復現已知的細胞類型分布規律。
3. 多技術聯合驗證(“交叉印證” 出的 ground truth)
實際研究中,常 把 scRNA - seq 的純細胞譜、高分辨率成像標注、組織學染色結果結合,交叉驗證出更可靠的 ground truth 。比如:先用 scRNA - seq 確定組織里有哪些細胞類型及各自的基因特征,再用 MERFISH 看這些細胞在空間里的真實分布,最后結合組織學染色修正細節,形成一套 “多方共識” 的 ground truth ,用于反卷積模型的訓練 / 驗證。
簡單說,反卷積的 ground truth 就是 “能精準反映‘每個空間位置實際細胞類型組成’的參考標準” ,核心靠 “純細胞數據(scRNA - seq / 高分辨率成像) + 人工 / 領域標注 + 多技術交叉驗證” 來構建,目的是給反卷積算法提供 “正確答案” ,判斷其預測準不準~
如果你的研究場景里有特定數據集,想更細究,就得看對應論文 / 數據說明里的 “標注方法” 啦,不同研究可能結合自身數據特點選 ground truth 構建方式~
好的!咱們從 Tangram 核心邏輯 到 圖中流程拆解 ,一步步講清楚,保證你能看懂~
一、Tangram 是干啥的?核心目標
Tangram 是解決 “空間轉錄組數據解析” 的工具,主要干兩件事:
- 細胞類型反卷積:把 Visium 這類 “混合斑點”(一個斑點里有多種細胞),拆成 “每種細胞占多少比例”;
- 基因表達插補:把 MERFISH/Xenium 這類 “基因少、分辨率高” 的數據,補全更多基因的表達(讓低基因數數據變 “全基因” )。
核心邏輯是 “用‘參考數據’和‘目標數據’的‘矩陣匹配’,實現解析/插補” ,類似 “找參考和目標的映射關系,用參考‘補全/拆解’目標” 。
二、圖里流程到底在干啥?分步拆解
圖里是 scGPT - spatial 結合 Tangram 邏輯的流程 ,但核心矩陣匹配邏輯和 Tangram 一致,咱們拆解成 3 步:
步驟 1:準備 “參考特征矩陣” 和 “構建矩陣 ( M )”
-
參考特征矩陣(粉色):
這是 “已知的、精準的細胞/基因特征” ,比如:- 若做反卷積 → 用 scRNA - seq 測的 純細胞基因表達譜(比如純上皮細胞、純免疫細胞的基因表達,每行是細胞類型,每列是基因 );
- 若做插補 → 用 Visium 測的 全基因表達譜(比如高分辨率區域的基因表達,作為參考補全低分辨率數據 )。
-
構建矩陣 ( M )(藍色):
這是個 “待優化的映射關系” ,維度是 [目標斑點數 × 參考點/細胞數] 。簡單說,( M ) 的每個元素 ( M_{i,j} ) ,表示 “參考里的第 ( j ) 個細胞/基因,對目標里的第 ( i ) 個斑點的‘貢獻度’” 。
步驟 2:優化 ( M ),讓 “參考” 和 “實際” 匹配
-
實際特征矩陣(黃色):
這是 “目標數據的特征” ,比如:- 若目標是 Visium 斑點 → 是這些混合斑點的基因表達譜(每個斑點是一行,基因是一列 );
- 若目標是 MERFISH 數據 → 是這些高分辨率點的(少部分)基因表達譜 。
-
優化過程:
讓 ( M \times \text{參考特征矩陣} \approx \text{實際特征矩陣} ) ,通過數學優化(比如非負矩陣分解、最小二乘法 ),調整 ( M ) 的值,直到 “參考×M” 盡可能接近 “實際特征” 。這一步的核心是 “讓 ( M ) 學到‘怎么用參考數據,去擬合目標數據的特征’” 。比如,若目標是混合斑點的基因表達,( M ) 就會學到 “哪些參考細胞類型,以什么比例混合,能生成目標斑點的表達” 。
步驟 3:用優化好的 ( M ),做反卷積/插補
-
反卷積(細胞類型拆解):
用 ( M \times \text{參考細胞類型矩陣} ) → 得到 “反卷積后的細胞類型比例” 。
解釋:參考細胞類型矩陣里,存的是 “每個參考細胞屬于哪種類型”(比如第 ( j ) 個參考細胞是上皮細胞,就標 1,其他標 0 )。乘以 ( M ) 后,就會算出 “每個目標斑點里,各種細胞類型的占比” 。 -
基因插補(補全基因表達):
用 ( M \times \text{參考基因表達矩陣} ) → 得到 “插補后的基因表達” 。
解釋:參考基因表達矩陣里,存的是 “全基因的表達譜”(比如 Visium 測的全基因數據 )。乘以 ( M ) 后,就能給目標數據(比如 MERFISH 只測了幾百個基因 )補全其他基因的表達。
三、Tangram 矩陣方法的本質:“找映射,用參考補目標”
簡單總結 Tangram 邏輯:
- 找一批 精準的參考數據(scRNA - seq 純細胞、Visium 全基因等 );
- 建一個 映射矩陣 ( M ) ,學 “參考怎么組合,能匹配目標數據”;
- 用學好的 ( M ) ,反向用參考數據,解析/補全目標數據(拆細胞比例、補基因表達 )。
圖里的流程,就是把這一套邏輯可視化了:藍色 ( M ) 是映射關系,粉色是參考,黃色是目標,優化 ( M ) 后,用 ( M ) 做反卷積/插補~
四、舉個生活化例子,幫你理解
假設你想 “解析一碗混合果汁的成分”(類似解析混合斑點 ):
- 參考特征矩陣:已知純蘋果汁、純橙汁、純梨汁的 “味道特征”(比如酸甜度、香氣成分 );
- 構建矩陣 ( M ):你需要找的 “每種純果汁放了多少”(比如蘋果汁占 30%、橙汁 50%、梨汁 20% );
- 實際特征矩陣:混合果汁的實際味道(酸甜度、香氣 );
- 優化過程:調整 ( M ) 里的比例,讓 “參考果汁×比例” 調出的味道,盡可能接近實際混合果汁的味道;
- 反卷積/插補:學好比例后,就知道 “混合果汁里各種純果汁的占比”(反卷積 ),甚至能根據參考果汁的其他特征,補全混合果汁的 “營養成分”(類似插補基因 )。
這樣是不是就清楚啦?Tangram 本質是用 “矩陣匹配” 找參考和目標的關系,實現空間轉錄組數據的解析~ 核心就是 “用已知的精準參考,通過數學優化,解析未知的混合/低覆蓋數據” !
你說得非常對,這種模型結構復雜的架構,確實應該**沿著“數據的流動順序”**來講,尤其是從 forward()
進入之后,怎么走 perceptual_forward()
和 generative_forward()
兩條路徑,它們又在內部如何處理,是需要結構清晰、流程式地梳理。
? 按照“數據流動順序”重新完整講解模型預訓練流程(函數+結構)
我們從 forward()
函數開始,帶你一步步追蹤數據是怎么在模型中流動的。你會清晰知道:
- 數據從哪兒進來;
- 在哪一層做了什么處理;
- 哪些模塊是共享的;
- 哪些是任務分支。
🟢 Step 0:入口函數 forward(**kwargs)
def forward(self, *args, **kwargs):if "generative_training" not in kwargs:return self.perceptual_forward(*args, **kwargs)if kwargs.pop("generative_training"):return self.generative_forward(*args, **kwargs)else:return self.perceptual_forward(*args, **kwargs)
? 作用:
根據 generative_training
參數選擇模型走哪條路徑:
False
→ 感知路徑perceptual_forward()
:輸入一段表達值,輸出預測與表示;True
→ 生成路徑generative_forward()
:輸入一段“觀測表達”,生成后續表達。
🔷 分支 1:感知路徑 perceptual_forward()
輸入:
src: 基因ID序列
values: 對應表達值
src_key_padding_mask: mask
batch_labels: 可選,表示樣本屬于哪個批次
🧩 步驟一:編碼 _encode()
def _encode(self, src, values, src_key_padding_mask, batch_labels)
src
→GeneEncoder
→ gene token embeddingvalues
→ValueEncoder
→ 表達值 embedding- 兩者融合(加法或乘法)→
total_embs
total_embs
送入TransformerEncoder
→transformer_output
?? 如果有 batch_labels
,這個時候還沒有用上,只是先保存下來。
🧩 步驟二:表達值預測 self.decoder(...)
- 默認使用
ExprDecoder
- 若設置
use_moe_dec=True
,用MoeDecoder
走專家融合路徑
mlm_output = self.decoder(transformer_output)
如果設置了 explicit_zero_prob=True
,還會額外輸出 zero_probs
表示稀疏概率。
🧩 步驟三:多任務模塊 _extend_output(...)
def _extend_output(self, transformer_output, CLS=True, MVC=True, ECS=True, ...)
會從 transformer_output
中提取 cell_emb
(方式有 cls/avg/w-pool),用于:
分支 | 功能 |
---|---|
ClsDecoder | 分類 |
MVCDecoder | 掩碼值重建 |
AdversarialDiscriminator | 批次對抗 |
ECS Module | 相似度正則 loss |
MVCDecoder_Impute | 結合空間KNN進行表達補全(如果開啟MVC_impute) |
所有這些模塊的執行都取決于對應的布爾參數,如 CLS=True
才會執行分類任務。
🔷 分支 2:生成路徑 generative_forward()
適用于生成式預訓練:給出部分表達 → 生成另一部分表達。
輸入:
pcpt_genes: 觀測段 基因ID
pcpt_values: 觀測段 表達值
pcpt_key_padding_mask: 觀測段 maskgen_genes: 生成段 基因ID
gen_key_padding_mask: 生成段 mask
🧩 步驟一:transformer_generate()
def transformer_generate(self, pcpt_genes, pcpt_values, gen_genes, ...)
-
觀測部分:
pcpt_genes
→ GeneEncoderpcpt_values
→ ValueEncoder- 相加后 →
pcpt_total_embs
-
生成部分:
gen_genes
→ GeneEncoder- 加上
FlagEncoder(1)
表示“這是生成段” →gen_total_embs
-
拼接兩個部分 → 輸入 Transformer(共享結構)→
pcpt_output
,gen_output
🧩 步驟二:合并輸出 → transformer_output
transformer_output = cat([pcpt_output, gen_output])
🧩 步驟三:表達值預測(觀測段 + 生成段)
decoder_output = self.decoder(transformer_output)
輸出:
output["pcpt_preds"] = decoder_output[:pcpt_len]
output["gen_preds"] = decoder_output[pcpt_len:]
🧩 步驟四:多任務 _extend_output(...)
同感知路徑
跟 perceptual_forward()
一樣,會調用:
ClsDecoder
→ 分類MVCDecoder
→ 重建AdversarialDiscriminator
→ 批次ECS Module
→ 相似度約束MVCDecoder_Impute
→ 空間插值(使用 coordinates)
🔶 總結整體數據流(簡潔圖解)
forward() ├─ if generative_training:│ └── generative_forward()│ ├─ transformer_generate()│ ├─ decoder (pcpt + gen)│ └─ _extend_output() → 多任務└── perceptual_forward()├─ _encode()├─ decoder└─ _extend_output() → 多任務
? 回到你的問題核心
我想知道數據在 forward 中是怎么一步步走的、在哪里被處理的。
答案總結如下:
步驟 | 哪個函數 | 做了什么 |
---|---|---|
入口 | forward | 判斷走哪條路徑(感知 or 生成) |
感知 | perceptual_forward → _encode | 將 src、values 編碼成 total_embs,送入 Transformer |
生成 | generative_forward → transformer_generate | 編碼觀測和生成段,加上 flag 融合,送入 Transformer |
解碼 | self.decoder() | 輸出表達值(支持稀疏) |
多任務 | _extend_output() | 提取 cell_emb,調用分類、重建、對抗、ECS、空間插值等模塊 |
如果你現在想:
- 查看每一步所在
.py
文件行號; - 輸出完整流程圖;
- 理解 loss 是怎么計算的(包括 ECS/CLS/MVC);
我可以繼續按你的節奏講。現在是否需要把這段流程畫成一張流程圖?
你問的這句代碼:
if input_cell_emb is not None:pcpt_total_embs[:, 0, :] = input_cell_emb
在 transformer_generate()
函數中的作用是非常關鍵和特殊的,它強行覆蓋了觀測段序列中的第一個 token 的 embedding 表達。下面我從多個維度解釋它的用意。
? 所在背景回顧
在 transformer_generate()
中:
-
pcpt_total_embs
是“觀測段”輸入部分,它由:pcpt_token_embs + pcpt_values
構成,是 Transformer 的第一個輸入。
-
input_cell_emb
是一個可選參數(Optional[Tensor]
),形狀為:(batch, embsize) or (batch, seq_len, embsize)
? 這句代碼的本質行為:
pcpt_total_embs[:, 0, :] = input_cell_emb
用外部提供的 cell embedding(input_cell_emb)替換掉觀測段序列中的第一個 token 的 embedding。
也就是說:
- 原本
pcpt_total_embs[:, 0, :]
是代表第一個 token(通常是 special token,比如<cls>
)的 embedding; - 現在,它被外部傳入的某個細胞表示向量強行替換。
🔍 這有什么意義?為什么要這么做?
🧠 背后核心思想是:
用一個先驗的 cell embedding 來“引導”Transformer在生成階段如何編碼上下文。
具體解釋如下:
用意 | 描述 |
---|---|
① 引導生成 | 這相當于注入一個“高層語義表示”(整個細胞的embedding)給Transformer,以影響后續 token 的生成結果。 |
② 實現條件生成 | 如果你想“讓這個模型模擬某個特定細胞”,就可以把那個細胞的 embedding 塞進去。 |
③ 控制潛在空間 | 這是常見于 CVAE / Diffusion / GPT-Conditional 生成中的一種做法:將先驗表示注入模型。 |
④ 替換 [CLS] 位 | 該模型一般默認 token 0 是 [CLS] ,所以替換這一位就是替換整個序列的代表性 token。 |
🧪 舉個實際使用場景
假設你已經有一個訓練好的模型,并得到了某個細胞的 cell_emb
表示。現在你想:
🔁 “基于這個細胞的語義表達,生成一段新的表達譜(即 gen_genes 的表達)。”
那么你就可以:
model.generate(cell_emb=某個細胞的 cell_emb,src=some_genes,...
)
此時傳入的 input_cell_emb
會用作 Transformer 的第一個 token 表示,用于調制 Transformer 的解碼過程,從而實現 個性化、條件化的生成任務。
? 小結這句代碼的作用:
代碼片段 | 作用 |
---|---|
pcpt_total_embs[:, 0, :] = input_cell_emb | 將整個輸入序列的第一個位置(通常是 [CLS] token)替換為外部提供的 cell_emb ,用于條件控制或特定表達引導。 |
如你愿意,我可以幫你:
- 模擬一個“用 cell_emb 控制表達生成”的例子;
- 把這段行為畫成圖;
- 或將這個機制寫進論文方法部分。
是否繼續深入講講這種“條件注入機制”與 Transformer 控制生成的技術背景?
你的理解非常準確,而且已經抓住了核心邏輯。你說的這段:
? “這段代碼負責生成一個 CLS token 的矩陣,有了這個細胞特征矩陣,接下來做其他任務就可以使用關于這個細胞的預訓練信息了。”
完全正確。
下面我來幫你系統性地確認你的理解,并補充一些細節,幫你把整個細胞 embedding 的使用閉環構建完整。
? 你的理解核心是正確的:
這段代碼的功能可以總結為:
📌 get_batch_cell_embeddings(...)
的作用:
將原始表達矩陣 AnnData(或類似 count_matrix)通過模型編碼器處理,抽取每個細胞的
cell_emb
(即 Transformer 的[CLS]
輸出向量),作為細胞的預訓練表示。
? 在這段代碼中,關鍵過程是:
🔹 1. 構建 Dataset
- 每一行是一個細胞;
- 非零表達值用 gene ID + expression 表達;
genes = np.insert(..., 0, <cls>)
→ 在最前加<CLS>
token;values = np.insert(..., 0, pad_value)
→ 對應地為<CLS>
位置填一個無用值(稍后不參與預測)。
🔹 2. _encode()
模型編碼函數調用
embeddings = model._encode(input_gene_ids,input_expr,src_key_padding_mask,batch_labels,
)
這一步走的路徑是:
- GeneID →
GeneEncoder
- Expr →
ValueEncoder
- 兩者融合后 →
TransformerEncoder
- 輸出整個序列的
hidden_states
你只取了:
embeddings = embeddings[:, 0, :] # 只取第一個 token,即 <CLS> 的位置
這就是 細胞的全局表示 cell embedding。
🔹 3. 返回矩陣 cell_embeddings
每一行代表一個細胞的全局向量(長度為 embsize
),比如 (num_cells, 512)
,你還做了 L2 歸一化。
? 所以你說的結論完全正確:
得到這個細胞表示矩陣之后,你可以在下游任務中使用它作為細胞的語義特征。
? 那接下來它能做什么用?(你可以怎么用它)
這是重點補充!
? 1. 用于生成任務的“條件注入”
你前面看到:
if input_cell_emb is not None:pcpt_total_embs[:, 0, :] = input_cell_emb
這句話就是:
把你這個 cell embedding 塞進 Transformer 的輸入序列首位,讓模型以這個“預設細胞語義”來生成后續表達值。
這種做法被稱為 “prompt injection” / “semantic priming”。
? 2. 用于下游分類/聚類任務
你也可以直接拿這些 cell_embeddings
去做:
- 聚類(t-SNE / UMAP / KMeans)
- 分類(細胞類型識別)
- 對抗訓練(批次校正:
AdversarialDiscriminator
)
? 3. 用于 KNN 相似性查找
你還可以:
- 構建基于 cell_emb 的空間或圖結構(如 cell graph);
- 在空間預測任務中,查找最近鄰,進行表達填補(MVC Impute);
- 用于構建 Nearest Neighbor Attention、Graph Transformer 等結構。
🔍 附加建議(你可以拓展的點)
用法 | 描述 |
---|---|
💡 降維可視化 | 對 cell_embeddings 做 UMAP / PCA 可視化 |
📊 和標簽對齊 | 用已有的 cell type 標簽訓練分類器 |
🔁 生成實驗 | 將 cell_emb 作為 prompt 做表達生成、perturbation simulation |
🎯 多模態融合 | 用其他模態(ATAC / 圖像)訓練模型,把它對齊到同一個 cell_emb 空間 |
? 最后總結一下你這段代碼的定位:
你這段 get_batch_cell_embeddings()
是整個預訓練模型的重要橋梁模塊:
它將 稀疏的原始表達矩陣 → 通過 Transformer 提取 → 成為稠密的語義表示向量(CLS),進而作為各種下游任務的基礎。
如你需要,我可以:
- 幫你畫出這段 embedding 提取流程圖;
- 把它寫成方法小節、結果小節;
- 教你如何用這些 cell_emb 在 downstream 任務中快速構建 pipeline。
是否接下來你想看看“如何將這些 cell_emb 用在一個分類或生成任務中”?我可以寫出完整調用示例。