F1.3~F1.4를 잇는 질문 — 단백질 다음은 DNA
F11~F15에서 ESM 계열이 아미노산 서열을 "언어"로 다뤘던 것을 기억해봅시다. 20종 아미노산 알파벳에 통계적 규칙성이 있어 언어모델이 먹혔다면, 같은 논리가 A·T·G·C 4종 알파벳으로 이루어진 DNA에도 적용될까요? F16부터 F20까지는 이 질문을 다섯 편에 걸쳐 답합니다. 그 첫 시작이 DNABERT(2021)입니다.
단백질과 달리 DNA는 어휘가 훨씬 단순합니다. 그런데 역설적으로 이 단순함이 문제였습니다. 아미노산 서열은 20종의 알파벳이 각기 다른 화학적 성질을 가지고 있어 단일 문자를 토큰으로 삼아도 정보량이 충분했지만, DNA의 4종 알파벳은 한 글자 단위로는 거의 아무 정보도 담지 못합니다. DNABERT는 이 문제를 어떻게 풀었을까요.
원리 — k-mer 토큰화와 BERT 사전학습
왜 한 염기씩 자르면 안 되는가
BERT 계열 언어모델은 원래 자연어를 서브워드(subword) 단위로 토큰화합니다. "unhappiness"를 "un", "happi", "ness"로 쪼개듯, 의미 단위를 문자보다 크게 잡아야 모델이 패턴을 학습할 표현 공간이 생깁니다. DNA 서열을 염기 하나씩(A, T, G, C) 토큰화하면 어휘 크기가 4에 불과해 이 표현 공간이 무너집니다.
DNABERT는 이를 k-mer 토큰화로 해결합니다. 서열을 길이 짜리 겹치는 조각(sliding window)으로 잘라 각 조각을 하나의 토큰으로 취급합니다.
을 예로 들면 어휘 크기는 개가 됩니다. 이는 자연어 BERT의 서브워드 어휘(3만~5만)보다는 작지만, 4개보다는 비교할 수 없이 풍부한 표현력을 제공합니다.
손 계산 예제: 6-mer 토큰 개수 세기
길이 20bp짜리 서열 하나를 6-mer로 토큰화하면 몇 개의 토큰이 나올까요? 겹치는 슬라이딩 윈도우이므로
서열이 길어질수록 토큰 수는 거의 선형으로 늘어나지만, 어휘 자체는 으로 고정되어 있다는 점이 핵심입니다. 같은 6-mer가 게놈 여러 곳에서 반복적으로 등장하며, BERT는 바로 이 반복 패턴에서 문맥 통계를 학습합니다.
사전학습 — masked language modeling 그대로 재활용
DNABERT의 사전학습 목표는 원조 BERT와 동일한 masked k-mer prediction입니다. 입력 서열의 일부 k-mer 토큰을 무작위로 가려두고, 주변 문맥만으로 가려진 토큰을 복원하도록 학습합니다.
레이블이 필요 없는 자기지도학습(self-supervised learning)이므로, 인간 게놈처럼 주석 없이도 방대한 서열 데이터를 그대로 사전학습에 투입할 수 있습니다. 이렇게 사전학습된 모델은 이후 프로모터 예측, 스플라이스 부위(splice site) 예측, 전사인자 결합부위 예측 같은 하위 과제(downstream task)에 미세조정(fine-tuning)됩니다.
DNABERT-2 — k-mer의 한계를 넘어서
k-mer 토큰화에는 근본적 비효율이 있습니다. 겹치는 윈도우 방식이라 서열 길이 에 대해 토큰 수가 거의 에 비례해서 늘어나고, 어휘가 고정된 에 묶여 유연성이 떨어집니다. 후속작 DNABERT-2(2023)는 자연어 처리에서 흔히 쓰는 BPE(Byte Pair Encoding) 방식의 비중첩 서열 토큰화를 도입해 이 비효율을 줄였습니다. 고정 길이 k-mer와 달리 자주 함께 나타나는 염기 패턴을 데이터에서 학습해 어휘로 만들기 때문에, 토큰 수와 입력 길이 부담을 줄이는 것이 목표입니다.
실습: HuggingFace DNABERT로 k-mer 토큰화 체험하기
# Colab T4, 무료 티어로 충분합니다.# HuggingFace 저장소 접근에는 로그인 없이도 공개 가중치를 받을 수 있습니다.
from transformers import AutoTokenizer
# 실습 목적의 6-mer 토큰화 함수 (DNABERT류 모델의 전처리 방식을 재구성)def seq_to_kmer(seq: str, k: int = 6) -> str: """서열을 공백으로 구분된 k-mer 문자열로 변환합니다.""" return " ".join(seq[i:i + k] for i in range(len(seq) - k + 1))
sample_seq = "ACGTGACCTGATCGATCGATCGTACGTAGCTAGCTA"kmer_str = seq_to_kmer(sample_seq, k=6)print(f"토큰 개수: {len(kmer_str.split())}") # 서열 길이 - k + 1 개print(kmer_str[:60])
# 실제 사전학습 가중치를 쓰려면 공식 저장소의 tokenizer 설정을 그대로 불러옵니다.# tokenizer = AutoTokenizer.from_pretrained("zhihan1996/DNA_bert_6") # 예시 경로, 최신 경로는 공식 저장소에서 확인이 코드는 토큰화 개념을 손으로 확인하는 용도입니다. 실제 사전학습 모델을 내려받아 프로모터 예측 같은 다운스트림 미세조정까지 진행하려면 공식 저장소의 현재 모델 카드와 라이선스를 먼저 확인해야 합니다.
CS 매핑
- 서브워드 토큰화: 자연어 처리의 BPE·WordPiece가 어휘를 압축하듯, k-mer 토큰화는 4글자 알파벳을 크기의 어휘로 확장해 표현력을 확보하는 동일한 발상입니다.
- 슬라이딩 윈도우: k-mer 추출은 문자열 처리에서 흔한 슬라이딩 윈도우 순회이며, F04의 MMseqs2가 쓰는 seed 추출과도 같은 계보의 기법입니다.
- 자기지도학습 전이: 레이블 없는 대량 데이터로 사전학습한 뒤 소량 레이블 데이터로 미세조정하는 구조는, F11의 ESM-2가 단백질에서 썼던 것과 동일한 전이학습(transfer learning) 패러다임을 DNA 도메인에 그대로 옮긴 것입니다.
자주 만나는 결함
- k값 선택을 임의로 고정: 가 커지면 어휘가 기하급수적으로 커지고, 작으면 문맥 정보가 희박해집니다. 사전학습된 모델을 쓸 때는 그 모델이 학습된 값과 토큰화 방식을 정확히 맞춰야 합니다.
- k-mer 토큰화의 비효율을 간과: 겹치는 슬라이딩 윈도우 방식은 긴 서열에서 토큰 수가 급격히 늘어나 계산 비용이 커집니다. 이는 F18에서 다룰 롱 컨텍스트 모델이 등장한 배경 중 하나입니다.
더 깊게 파고 싶다면
본문은 BPD 연구진이 직접 재구성한 서술입니다. 원 논문과 공식 자료로 심화해봅시다.
- DNABERT 원 논문: Ji et al. (2021), DNABERT: pre-trained Bidirectional Encoder Representations from Transformers model for DNA-language in genome, Bioinformatics 37(15).
- DNABERT-2 원 논문: Zhou et al. (2024), DNABERT-2: Efficient Foundation Model and Benchmark for Multi-Species Genomes, ICLR 2024.
- BERT 원 논문: Devlin et al. (2019), BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding, NAACL-HLT.
DNABERT가 DNA 언어모델의 문을 열었다면, 다음 편(F17)의 Nucleotide Transformer는 이 아이디어를 여러 종(species)에 걸친 대규모 사전학습으로 확장합니다.