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)**으로 사전학습됩니다. 서열의 일부 잔기를 무작위로 가리고, 나머지 문맥으로부터 가려진 잔기를 맞히도록 학습시키는 겁니다.
여기서 은 가려진 위치 집합, 은 가려지지 않은 나머지 잔기들입니다. 이 손실을 최소화하려면 모델은 "이 위치에 어떤 아미노산이 올 확률이 높은가"를 문맥으로부터 추론해야 합니다. 그런데 실제 단백질 서열에서 특정 위치의 아미노산이 다른 위치와 통계적으로 얽혀 있는 이유는, 그 두 위치가 구조적으로 접촉하거나 기능적으로 짝을 이뤄 함께 진화했기 때문입니다. 결국 마스크된 잔기를 잘 맞히도록 2억 5천만 개 서열에서 학습한 모델은, MSA를 명시적으로 만들지 않고도 그 통계 — 공진화 신호 — 를 파라미터 안에 암묵적으로 흡수하게 됩니다.
ESMFold의 구조: 언어모델 + 접힘 헤드
ESMFold는 두 부분으로 구성됩니다.
- ESM-2(ESMFold v1에서는 30억 파라미터 체크포인트): 입력 서열을 받아 각 잔기의 고차원 표현을 뽑습니다. ESM-2 계열 자체에는 150억 파라미터 모델도 있지만, 공개 ESMFold v1 코드의 기본 trunk가 쓰는 것은
esm2_3B입니다. 계열 최대 크기와 실제 folding checkpoint를 혼동하면 메모리 요구량과 재현 조건을 잘못 판단하게 됩니다. - 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 깊이를 , 서열 길이를 이라 하면, MSA 행(row)-열(column) attention의 계산량은 대략 다음과 같이 커집니다.
MSA 깊이 이 수백~수천에 이르는 경우가 흔하므로, 이 항이 전체 연산의 큰 부분을 차지합니다. 반면 ESMFold는 MSA 자체가 없으므로 입니다.
, 인 구체적 경우를 넣어 비율을 가늠해보면, 항이 인 데 비해 항은 로, 이 항만 놓고 보면 약 500배 차이가 납니다. 실제 두 모델의 전체 연산 그래프는 이보다 복잡하고 서로 다른 파라미터 수·구현 최적화가 섞여 있어 이 비율이 그대로 실측 속도차로 이어지지는 않지만, "MSA 깊이가 사라지면 연산량이 어느 항에서 얼마나 줄어드는가"를 직관적으로 보여주는 손 계산입니다.
대신 잃는 것 — 정확도 트레이드오프
공짜는 없습니다. 원 논문 벤치마크에서 ESMFold는 CASP14 기준 AlphaFold2보다 평균 정확도(GDT-TS 등)가 다소 낮게 보고됐습니다. 특히 MSA가 원래 깊게 쌓이는 흔한 단백질 패밀리에서는 AlphaFold2가 여전히 유리하고, ESMFold는 MSA가 얕거나 아예 없는 서열(신종 바이러스 단백질, 메타지놈에서 갓 발견된 서열, 인공 설계 서열)에서 상대적 이점이 큽니다. "정확도가 필요하면 AlphaFold2/ColabFold, 속도와 MSA-free가 필요하면 ESMFold"라는 용도 구분이 핵심입니다.
실습: HuggingFace transformers로 ESMFold 한 줄 예측
# Colab T4에서 실행. transformers 라이브러리에 ESMFold가 통합되어 있습니다.!pip install -q transformers accelerate
import torchfrom 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로 넘어갑니다.