본문 바로가기
AI & Data Analysis/Deep Learning

[scGPT] pre-training data sets

by doraemin_dev 2025. 5. 30.

PAPER

https://www.nature.com/articles/s41592-024-02201-0


GitHub ; Data Download

https://github.com/bowang-lab/scGPT/blob/main/data/cellxgene/data_config.py

 

scGPT/data/cellxgene/data_config.py at main · bowang-lab/scGPT

Contribute to bowang-lab/scGPT development by creating an account on GitHub.

github.com

 


1. 공통 변수

  • VERSION = "2023-05-08"
    • CellXGene Census 릴리스 버전
  • MAJOR_TISSUE_LIST
    • 주요 조직 7종:
  • ["heart", "blood", "brain", "lung", "kidney", "intestine", "pancreas"]
  • CANCER_LIST
    • cancer_list.txt에서 불러온 모든 암종 이름들의 리스트

2. 주요 7개 조직 필터

VALUE_FILTER = {
    tissue : f"suspension_type != 'na' and disease == 'normal' and tissue_general == '{tissue}'"
    for tissue in MAJOR_TISSUE_LIST
}
  • 키(필터명): 각 조직명 ("heart", "blood" 등)
  • 값(조건문):
    1. suspension_type != 'na'
      현미경 처리·분리 방식 정보가 없는(cellxgene에선 'na') 데이터는 제외

    2. disease == 'normal'
      질병(disease)이 “normal”(정상)인 세포만

    3. tissue_general == '<조직명>'
      일반 조직명 필드가 해당 조직과 정확히 일치
  •  

모두 AND(그리고)로 묶여 있으므로,

“현미경 분리 정보가 있고, 정상 세포이며, 조직이 X인 것”
만 내려받습니다.


3. 기타(others) 조직 필터

# 초깃값: 정상 세포 전체
VALUE_FILTER["others"] = "suspension_type != 'na' and disease == 'normal'"

# major 7개 조직을 모두 != 로 배제
for tissue in MAJOR_TISSUE_LIST:
    VALUE_FILTER["others"] += f" and (tissue_general != '{tissue}')"
  • 처음엔
    1. suspension_type != 'na'
    2. disease == 'normal'
  • 이후 루프를 돌며
    3. and (tissue_general != 'heart') and (tissue_general != 'blood') … and (tissue_general != 'pancreas')

결과적으로 AND로 모두 연결되어,

“분리정보가 있고, 정상 세포이면서, 주요 7개 조직 중 어느 것도 아닌 세포”
를 가져옵니다.


4. 범(汎)암종(pan-cancer) 필터

# 1) 기본: 분리정보만 체크
VALUE_FILTER['pan-cancer'] = "suspension_type != 'na'"

# 2) cancer_list.txt 안의 모든 암종을 OR로 연결
cancer_condition = ""
for disease in CANCER_LIST:
    if cancer_condition == "":
        cancer_condition = f"(disease == '{disease}')"
    else:
        cancer_condition += f" or (disease == '{disease}')"

# 3) 최종: AND(분리정보) + OR(암종)
VALUE_FILTER['pan-cancer'] = f"(suspension_type != 'na') and ({cancer_condition})"
  • (suspension_type != 'na') and (…)
    분리정보가 있는 데이터를
  • (disease == 'A') or (disease == 'B') or …
    CANCER_LIST에 나열된 어느 하나의 암종이면 내려받음

즉,

“분리정보가 유효하면서, 리스트에 있는 암종 중 하나에 해당하는 세포”
를 모두 포함합니다.


5. AND vs OR의 의미

  • AND (and)
    모든 서브조건을 모두 만족해야 함.
  • OR (or)
    서브조건 중 하나라도 만족하면 됨.
필터명 AND 조건 OR 조건
주요 조직 ① 분리정보 존재② 정상 질환③ 해당 조직 일치
others ① 분리정보 존재② 정상 질환③ 각 주요 조직 모두 불일치 (일곱 번)
pan-cancer ① 분리정보 존재 암종 == A OR 암종 == B OR …

6. 최종적으로 다운로드되는 데이터

  1. 정상 세포 중 7개 주요 조직별 (각각 별도의 카테고리)
  • heart, blood, brain, lung, kidney, intestine, pancreas
  • 예: “정상 & heart” / “정상 & blood” … “정상 & pancreas” (총 7개)
  1. 정상 세포 중 “others”
  • 7개 주요 조직이 아닌 모든 정상 세포
  • “정상 & (tissue_general != heart) & … & (tissue_general != pancreas)”
  1. Pan-cancer (암종) 세포
  • cancer_list.txt에 있는 어느 하나의 암종에 속하는 세포
  • “suspension_type != 'na' & (disease == A or disease == B or …)”

그래서 합치면

  • 7 (주요 조직별 정상)
  • 1 (others 정상)
  • 1 (pan-cancer)
    = 총 9개 필터를 이용해 데이터를 내려받습니다.
heart, blood, …, pancreas 7개 조직별로 “정상(normal) 세포”만 내려받고, others로 “주요 7개 조직이 아닌(normal) 세포”를 내려받으면,

이 둘을 합친 것이 곧 “TileDB에 존재하는 모든 정상 세포” 전체가 됩니다.

즉, 
주요 7개 조직의 정상 세포 → 7개의 분리된 파티션 그 외 조직의 정상 세포 → 1개의 파티션

이렇게 8개 필터로 나눠서 다운로드하다 보니, 결과적으로는 전부 정상 세포를 다 내려받는 셈이에요. 이후 pan-cancer 필터까지 합치면 총 9개 파티션으로 학습용 데이터를 구성하는 거고요.

 

코드에 명시된 필터에 따르면
disease == 'normal' 이거나
cancer_list.txt 에 포함된 암종일 때만 데이터가 다운로드됩니다 .

따라서 disease 값이 “normal”이 아니고, 암종 리스트에도 없다면 해당 세포는 사전학습 데이터에 포함되지 않습니다 .
실제 scGPT 논문에서도 CellXGene Census에서 필터링된 65개 데이터셋만을 사용해 모델을 학습했다고 보고하고 있습니다.


scGPT의 사전학습(pre-training) 워크플로우는 크게 두 가지 축으로 데이터가 분리됩니다.

건강한 조직(tissue-specific normal) 암종(pan-cancer, malignant + non-malignant)

이렇게 구분하는 이유는, 정상 세포와 암세포가 생물학적 분포(biological distribution)와 표현형(phenotypic heterogeneity)이 본질적으로 다르기 때문입니다.

 정상 조직만 학습하는 이유
1. 베이스라인 표현 학습 (Baseline Representation)
- scGPT의 “whole-human” 모델은 33 million개의 정상(normal) 세포만을 사용해 사전학습을 진행합니다 (GitHub).
- 이로써 질병 상태에 따른 특이 신호(disease-specific signals) 없이, 각 조직(tissue) 고유의 유전자 발현 패턴(gene expression patterns)을 균일하게 학습할 수 있습니다 (바이오아카이브).

2. 질병 이질성(disease heterogeneity) 회피
- 조직별(normal) 세포만 사용할 때, 질환 상태(예: 염증, 종양)로 인한 과도한 변이를 피하며 일관된 데이터 분포를 유지합니다 (바이오아카이브).
- 후속 downstream task(예: cell type annotation, batch 교정)에서 “건강한 조직”의 대표 표현을 토대로 미세한 차이를 잡아내기가 용이해집니다 (ScienceDirect).

3. 조직 특화 모델들
- ‘brain’, ‘blood’, ‘heart’, ‘lung’, ‘kidney’ 등 5개 조직별로도 모두 정상 세포만 별도 체크포인트로 제공됩니다 (GitHub).
- 이는 각 조직의 고유한 정상 표현을 더욱 정밀하게 학습하기 위함이며, “whole-human” 대비 소규모(1–13M cell) 데이터로 전용 organ-specific 모델을 얻을 수 있게 합니다 (GitHub).

암종(pan-cancer) 모델은 왜 따로 만드는가
1. 암 특이 표현 학습 (Cancer-Specific Features)
- README에서 “pan-cancer” 모델은 5.7 million개의 “various cancer types” 세포로 학습된다고 명시되어 있습니다 (GitHub).
- 이를 통해 정상 세포 모델로는 잡아내기 힘든 종양 미세환경(tumor microenvironment) 및 암 특이 신호(cancer-specific signals) 를 학습할 수 있습니다.
2. malignant + non-malignant
- 후속 연구인 CancerFoundation에서, scGPT (cancer) 버전은 malignant 세포와 non-malignant 세포를 모두 포함해 사전학습했다고 보고하고 있습니다 (바이오아카이브).
- 이 이중 라벨링(disease vs. normal)이 종양 내 셀 상호작용(cell–cell interaction)과 암조직 특이적 발현 패턴을 동시에 포착하는 데 유리합니다.
3. 모델 분리의 이점
- 건강 조직과 암 조직의 분포가 크게 달라, 한 모델로 두 영역 모두 학습 시 도메인 쉬프트(domain shift) 문제를 야기할 수 있습니다 (BioMed Central).
- 별도의 pan-cancer 모델로 분리하면, 각각의 데이터 분포(distribution) 에 최적화된 표현(embeddings)을 얻을 수 있습니다 (PMC).



결론적으로, scGPT는
정상 조직(normal tissue) → “whole-human” 및 organ-specific 모델로, 암종(pan-cancer) → “scGPT (cancer)” 모델로
를 분리 사전학습함으로써, 두 가지 상이한 생물학적 콘텍스트를 각각 최적화된 방식으로 학습하도록 설계되어 있습니다.

 


scGPT의 사전학습(pre-training) 단계에서는 “정상(normal)” 세포 표현만을 사용해 모델이 유전자 발현의 기본 구조와 공동 발현 패턴(co-expression patterns) 을 학습합니다. 하지만 이로부터 얻은 잠재 표현(latent representation) 은 단지 정상 세포에만 국한되지 않고, 세포들 사이의 일반적인 관계(예: 특정 유전자들이 함께 발현되거나 억제되는 양상)를 포착합니다. 이 학습된 표현은 질병 세포의 분포를 볼 때에도 다음과 같은 이유로 유용하게 작동합니다:

1. 기저 표현의 일반화(Generalization)
정상 상태에서 유전자들이 어떻게 서로 상호작용하는지 학습한 정보는, 질병 상태에서도 여전히 기초가 되는 구조를 많이 공유합니다. 예를 들어, 염증이든 암이든 “면역 관련 유전자”나 “세포 주기 유전자” 같은 축들은 정상과 병리 모두에서 중요한 역할을 하므로, 정상에서 학습한 축을 따라 질병 세포를 임베딩해 보면 자연스럽게 분포의 차이가 드러납니다.

2. 마스킹 기반 사전학습(Masked Modeling)
scGPT는 무작위로 일부 유전자 발현 값을 가리고, 주변 유전자 발현으로 빈칸을 예측하도록 학습합니다. 이 과정에서 “어떤 유전자들이 서로 예측력을 가지는지”를 배워 두면, 병리 상태에 놓인 세포에서도 같은 예측 메커니즘이 적용되기 때문에, 모델이 질병 세포를 만나더라도 “이 유전자가 이 정도로 낮게/높게 발현됐다는 건 평소 패턴과 달라”라는 식으로 이상치를 감지할 수 있습니다.

3. 파인튜닝(fine-tuning)의 활용
실제 질병 데이터(예: 감염, 심장병, 기타 비암성 질환 등)에 대해 downstream task로 분류기나 군집화를 할 때, 사전학습된 scGPT 모델을 초기값으로 삼아 파인튜닝하면, 정상에서 학습한 표현이 “질병 특이 신호”를 더 빠르고 정확하게 포착하도록 도와줍니다. 이런 방식으로, 비록 사전학습 단계에 직접 보지 못한 질병 세포라도, 파인튜닝만으로도 빠르게 적응할 수 있습니다.

4. pan-cancer 모델의 존재
암에 대해서는 별도의 pan-cancer 체크포인트(암종 리스트 기반)를 사전학습해 두었기 때문에, 암 세포 특유의 발현 패턴도 이미 학습된 상태입니다. ‘질병’이 바로 암 종(disease == 암종)이라면, pan-cancer 모델을 불러와 쓰면 정상 모델보다 암 분포를 더 잘 이해할 수 있습니다.


결국, scGPT가 정상 세포만을 학습했다고 해서 “질병 세포 분포를 전~혀 이해하지 못한다”는 뜻은 아닙니다.

정상 세포에서 학습한 공통 기저 구조(basal structure) 가 대부분의 세포 상태에서 유효하기 때문에, 마스킹 예측을 통한 조건부 의존성 학습이 다양한 상태로 일반화되며, 파인튜닝으로 질병 특이 패턴을 빠르게 적응할 수 있기 때문입니다.

이 덕분에 scGPT는 정상만 보아도, downstream에서 질병 세포를 만나면 자연스럽게 분포 차이를 포착하고, 질병 여부나 질병 유형을 분석하는 데 유용한 임베딩을 제공합니다.

 

각 카테고리별 필터 문자열(VALUE_FILTER[...])을 array_download_partition.sh 등에 넘겨주면,
TileDB(CellXGene Census) API가 해당 AND/OR 조합대로 하위 청크를 내려받고,
이후 array_build_scb.sh를 통해 학습용 SCB 포맷으로 변환합니다.