BioPlayground

🧬
목록으로

ESMFold: MSA 없이 서열 하나로 구조를 예측하는 법

MSA 검색 없이 단일 서열만으로 구조를 예측하는 ESMFold의 원리와, 진화 정보를 언어모델 안에 녹여낸다는 것이 무슨 뜻인지 다룹니다.

중급
|
20
|
검증 완료 (2026-07-29)
ESMFoldESM-2protein language modelpLDDT
진행률0/120 (0%)

F05에서 놓친 질문 — MSA는 왜 항상 필요한가

F02부터 F05까지 다룬 AlphaFold 계열은 예외 없이 한 가지를 전제로 깔고 있었습니다. 바로 **MSA(다중 서열 정렬)**입니다. 진화적으로 가까운 서열을 대량으로 모아 어떤 위치가 함께 변이하는지(공진화, coevolution)를 읽어야 구조 예측이 가능하다는 전제였습니다. F04에서 ColabFold + MMseqs2로 이 검색을 몇 분으로 줄였다고 했지만, 그래도 검색은 검색입니다. 데이터베이스가 필요하고, network I/O가 필요하고, 무엇보다 진화적 근연 서열이 거의 없는 단백질(고아 유전자, 극한 환경 미생물, 새로 설계된 인공 서열)에서는 MSA 자체가 부실해 예측 품질이 떨어집니다.

ESMFold(Lin et al., 2023, Science)는 이 전제를 뒤집습니다. MSA 검색 없이, 딱 하나의 아미노산 서열만 넣고 구조를 예측합니다. 어떻게 가능할까요? 답은 "진화 정보를 아예 안 쓴다"가 아니라 "진화 정보를 미리 다른 곳에 압축해 넣어뒀다"입니다.

원리 — 언어모델이 진화 정보를 대신 기억한다

마스크 언어 모델링(MLM)이 학습하는 것

ESMFold의 핵심은 그 자체가 아니라 그 앞단에 붙는 ESM-2라는 단백질 언어모델입니다. ESM-2는 UniRef의 약 2억 5천만 개 서열을 대상으로, BERT와 같은 방식의 **마스크 언어 모델링(Masked Language Modeling)**으로 사전학습됩니다. 서열의 일부 잔기를 무작위로 가리고, 나머지 문맥으로부터 가려진 잔기를 맞히도록 학습시키는 겁니다.

LMLM=iMlogP(xixM)\mathcal{L}_{\text{MLM}} = -\sum_{i \in M} \log P(x_i \mid x_{\setminus M})

여기서 MM은 가려진 위치 집합, xMx_{\setminus M}은 가려지지 않은 나머지 잔기들입니다. 이 손실을 최소화하려면 모델은 "이 위치에 어떤 아미노산이 올 확률이 높은가"를 문맥으로부터 추론해야 합니다. 그런데 실제 단백질 서열에서 특정 위치의 아미노산이 다른 위치와 통계적으로 얽혀 있는 이유는, 그 두 위치가 구조적으로 접촉하거나 기능적으로 짝을 이뤄 함께 진화했기 때문입니다. 결국 마스크된 잔기를 잘 맞히도록 2억 5천만 개 서열에서 학습한 모델은, MSA를 명시적으로 만들지 않고도 그 통계 — 공진화 신호 — 를 파라미터 안에 암묵적으로 흡수하게 됩니다.

ESMFold의 구조: 언어모델 + 접힘 헤드

ESMFold는 두 부분으로 구성됩니다.

  1. ESM-2(ESMFold v1에서는 30억 파라미터 체크포인트): 입력 서열을 받아 각 잔기의 고차원 표현을 뽑습니다. ESM-2 계열 자체에는 150억 파라미터 모델도 있지만, 공개 ESMFold v1 코드의 기본 trunk가 쓰는 것은 esm2_3B입니다. 계열 최대 크기와 실제 folding checkpoint를 혼동하면 메모리 요구량과 재현 조건을 잘못 판단하게 됩니다.
  2. folding trunk와 구조 모듈: AlphaFold2의 전체 MSA 처리 경로 대신, ESM-2의 residue·attention 표현을 sequence state와 pair state로 투영해 반복적으로 정제한 뒤 OpenFold 계열 구조 모듈로 3차원 좌표를 생성합니다.

즉 ESMFold는 "MSA로부터 공진화를 읽는 무거운 Evoformer" 대신 "언어모델 표현을 그대로 구조로 변환하는 가벼운 헤드"를 씁니다. MSA 검색과 Evoformer의 반복적 정제(recycling) 과정이 통째로 생략되므로, 추론 속도가 AlphaFold2 대비 최대 60배 빠르다고 원 논문은 보고합니다.

손 계산 예제: 왜 속도가 이만큼 벌어지는가

F02에서 다룬 AlphaFold2의 병목은 Evoformer의 attention 연산입니다. MSA 깊이를 NN, 서열 길이를 LL이라 하면, MSA 행(row)-열(column) attention의 계산량은 대략 다음과 같이 커집니다.

AlphaFold2 Evoformer 비용O(NL2)+O(N2L)\text{AlphaFold2 Evoformer 비용} \sim O(N \cdot L^2) + O(N^2 \cdot L)

MSA 깊이 NN이 수백~수천에 이르는 경우가 흔하므로, 이 항이 전체 연산의 큰 부분을 차지합니다. 반면 ESMFold는 MSA 자체가 없으므로 N=1N=1입니다.

ESMFold 비용O(L2)\text{ESMFold 비용} \sim O(L^2)

N=500N=500, L=300L=300인 구체적 경우를 넣어 비율을 가늠해보면, NL2N \cdot L^2 항이 500×3002=4.5×107500 \times 300^2 = 4.5 \times 10^7인 데 비해 L2L^2 항은 3002=9×104300^2 = 9 \times 10^4로, 이 항만 놓고 보면 약 500배 차이가 납니다. 실제 두 모델의 전체 연산 그래프는 이보다 복잡하고 서로 다른 파라미터 수·구현 최적화가 섞여 있어 이 비율이 그대로 실측 속도차로 이어지지는 않지만, "MSA 깊이가 사라지면 연산량이 어느 항에서 얼마나 줄어드는가"를 직관적으로 보여주는 손 계산입니다.

대신 잃는 것 — 정확도 트레이드오프

공짜는 없습니다. 원 논문 벤치마크에서 ESMFold는 CASP14 기준 AlphaFold2보다 평균 정확도(GDT-TS 등)가 다소 낮게 보고됐습니다. 특히 MSA가 원래 깊게 쌓이는 흔한 단백질 패밀리에서는 AlphaFold2가 여전히 유리하고, ESMFold는 MSA가 얕거나 아예 없는 서열(신종 바이러스 단백질, 메타지놈에서 갓 발견된 서열, 인공 설계 서열)에서 상대적 이점이 큽니다. "정확도가 필요하면 AlphaFold2/ColabFold, 속도와 MSA-free가 필요하면 ESMFold"라는 용도 구분이 핵심입니다.

실습: HuggingFace transformers로 ESMFold 한 줄 예측

python
# Colab T4에서 실행. transformers 라이브러리에 ESMFold가 통합되어 있습니다.
!pip install -q transformers accelerate
import torch
from transformers import AutoTokenizer, EsmForProteinFolding
tokenizer = AutoTokenizer.from_pretrained("facebook/esmfold_v1")
model = EsmForProteinFolding.from_pretrained("facebook/esmfold_v1", low_cpu_mem_usage=True)
model = model.cuda()
model.esm = model.esm.half() # 메모리 절약을 위한 half precision
# 예시: 짧은 리소자임(lysozyme) 조각 서열
sequence = "KVFGRCELAAAMKRHGLDNYRGYSLGNWVCAAKFESNFNTQATNRNTDGSTDYGILQINSRWWCNDGRTPGSRNLCNIPCSALLSSDITASVNCAKKIVSDGNGMNAWVAWRNRCKGTDVQAWIRGCRL"
inputs = tokenizer([sequence], return_tensors="pt", add_special_tokens=False)
inputs = {k: v.cuda() for k, v in inputs.items()}
with torch.no_grad():
output = model(**inputs)
# 잔기별 pLDDT (0~100, F02에서 다룬 것과 동일한 신뢰도 지표)
# atom37 표현의 Cα(index 1) pLDDT를 잔기 대표값으로 사용합니다.
plddt_ca = output["plddt"][0, :, 1]
print(f"평균 Cα pLDDT: {plddt_ca.mean().item():.2f}")
print(f"최저 pLDDT 잔기 위치(1-based): {plddt_ca.argmin().item() + 1}, 값: {plddt_ca.min().item():.2f}")

MSA 검색 단계 자체가 코드에 없다는 점에 주목합시다. 노트북 하나에서 F04의 ColabFold 파이프라인과 나란히 돌려 pLDDT 분포와 예측 구조를 비교해볼 수 있습니다. 다만 한두 서열만 보고 “MSA가 얕을수록 반드시 격차가 좁아진다”거나 우열이 역전된다고 일반화해서는 안 됩니다. MSA 깊이 외에도 길이, 도메인 구성, 무질서 영역과 학습 분포가 함께 영향을 줍니다.

CS 매핑

  • 전이학습(Transfer Learning): 대량의 비지도 데이터(2억 5천만 서열)로 사전학습한 표현을 다운스트림 태스크(구조 예측)에 재사용하는 것은, ImageNet으로 사전학습한 비전 모델을 특정 분류 태스크에 fine-tuning하는 것과 같은 패턴입니다.
  • 마스크 언어 모델링: BERT가 자연어에서 하는 것과 동일한 self-supervised objective를 아미노산 알파벳(20자)에 적용한 것입니다. "문맥으로 빈칸을 채운다"는 목표가 자연어 의미론 대신 단백질 진화·구조 정보를 학습하게 만듭니다.
  • 표현 압축 vs 명시적 검색: MSA 검색이 "그때그때 데이터베이스를 뒤져 관련 정보를 가져오는" retrieval-based 접근이라면, 언어모델의 사전학습 표현은 "학습 시점에 정보를 파라미터로 미리 압축해두는" parametric 접근입니다. 이 구분은 RAG(검색 증강 생성) vs 순수 파라메트릭 LLM의 트레이드오프와 정확히 같은 축입니다.

자주 만나는 결함

  • 모든 상황에서 ESMFold가 더 낫다는 오해: 앞서 다룬 대로 MSA가 풍부한 흔한 패밀리 단백질에서는 AlphaFold2/ColabFold가 여전히 우세합니다. "빠르니까 항상 ESMFold"는 틀린 일반화입니다.
  • pLDDT를 절대 정확도로 착각: F02에서도 다뤘듯, pLDDT는 모델의 자기 신뢰도 추정치이지 실측 정답과의 거리 그 자체가 아닙니다. ESMFold는 MSA가 없다는 구조적 이유로 신뢰도 보정(calibration)이 AlphaFold2와 다르게 나타날 수 있어, 절대값 비교보다 같은 모델 안에서의 상대 비교에 더 적합합니다.
  • 긴 서열에서 메모리 폭주: 실습 코드의 half() 변환 없이 긴 서열(1,000잔기 이상)을 Colab T4에 그대로 넣으면 GPU 메모리가 부족해질 수 있습니다.

더 깊게 파고 싶다면

본문은 BPD 연구진이 직접 재구성한 서술입니다. 원 논문과 공식 자료로 심화해봅시다.

  • ESMFold 원 논문: Lin et al. (2023), Evolutionary-scale prediction of atomic-level protein structure with a language model, Science 379(6637).
  • ESM-2 / ESM 시리즈 공식 저장소: github.com/facebookresearch/esm — 모델 카드에 라이선스(MIT)와 파라미터 규모별 체크포인트가 정리돼 있습니다.
  • HuggingFace ESMFold 모델 카드: huggingface.co/facebook/esmfold_v1 — 실습 코드의 API 레퍼런스.

다음 편 F07에서는 구조 예측에서 한 걸음 더 나아가, 구조와 **결합 친화도(binding affinity)**를 동시에 예측하는 Boltz-2로 넘어갑니다.