출처
https://blog.zyphra.com (ZUNA1.1)
논문: https://arxiv.org (ZUNA: Flexible EEG Superresolution with Position-Aware Diffusion Autoencoders)
지저분한 EEG — 채널 빠지고, 잡음 끼고, 몽타주가 제각각인 그거 — 를 채널 개수에 묶이지 않고 복원·디노이즈·업샘플하는 오픈 EEG 파운데이션 모델입니다.
•
프로젝트명: ZUNA1.1 (Zyphra)
•
380M 파라미터 / Apache 2.0 / HuggingFace 가중치 공개
•
핵심 작업: 결손 채널 복원, 잡음 제거, 성긴 몽타주 → 조밀 몽타주 업샘플
•
VRAM 1GB 미만에서도 돌고, pip 한 방이면 시작
이게 왜 필요할까요??
현장 EEG는 논문 벤치마크랑 완전히 다릅니다.
녹음 길이 = 들쭉날쭉 (0.5초 ~ 수십 분)
전극 배치 = 4ch 헤드밴드 ↔ 256ch 캡
세션 도중 = 전극 떨어짐 / 동작 아티팩트 / 구간 결손
Plain Text
복사
고정 채널 U-Net이나 "항상 24→48" 같은 초해상도 모델은
이 현실 앞에서 바로 깨집니다. 스플라인 보간(MNE)도 채널이 많이 비면 진폭이 폭발합니다.
그래서 ZUNA의 질문 자체가 다릅니다:
채널 = 배열 인덱스? ❌❌❌❌❌❌❌❌❌❌❌❌❌
채널 = 두피 위 3D 좌표? ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
Plain Text
복사
위치가 정체성이면, 한 번도 본 적 없는 전극 위치도 "상상"해서 채울 수 있습니다.
여기서 우리가 꼭 알아가야할 핵심 개념!!: Position-Aware Diffusion AE
ZUNA는 트랜스포머 인코더-디코더 확산 오토인코더입니다.
세 조각으로 보면 편합니다.
1) 토큰화 EEG 채널을 0.125초 조각 → 연속값 토큰
2) 4D-RoPE (x, y, z, t) 로 위치 주입
3) 확산 디코더 잡음 → 신호로 여러 스텝 정제 (rectified flow)
Plain Text
복사
토큰화 + 4D RoPE
각 채널을 256Hz 기준 32샘플(0.125초)로 자른 뒤 MLP로 토큰화하고,
채널×시간 래스터 순으로 직렬화합니다.
C채널 × 5초 → 40C 개 토큰
Plain Text
복사
여기까지만 하면 트랜스포머는 "몇 번째 토큰인지"만 압니다.
ZUNA는 각 토큰에 전극 3D 좌표 + 시간 인덱스를 붙여 4D RoPE로 넣습니다.
한 줄: 시퀀스 순서가 아니라 물리적 위치가 채널 ID다 → channel-agnostic.
왜 확산인가
한 번에 찍는 모델과 달리, 여러 스텝으로 신호를 다듬습니다.
EEG처럼 연속 실수값 신호랑 궁합이 좋고, 실제로는 안정성·효율을 위해 rectified flow를 씁니다.
인코더는 전체 신호를 잠재 벡터로 압축해 디코더를 돕고,
파라미터는 인코더/디코더 각 16층 · 총 380M (1.0과 동일).
ZUNA1 → ZUNA1.1 에서 바뀐 것 세 가지
아키텍처는 거의 같고, 학습·사용성을 손봤습니다.
피드백 요약: "정확도도 중요하지만, 현장 마찰이 더 아프다."
1. 가변 길이 (0.5초 ~ 30초)
ZUNA1은 딱 5초만 받았습니다.
1.1은 학습 때 길이를 bin으로 샘플링하고, packing + flex attention으로 배치합니다.
짧은 시행 조각도 OK
긴 연속 구간도 OK
재학습/재설정 없음
Plain Text
복사
덤으로 매 스텝 마스크·정규화가 달라져 공짜 데이터 증강 효과도 납니다.
2. 드롭아웃 패턴 4종 혼합
1.0은 "채널 통째 랜덤 제거" 하나였습니다.
실제 손상은 훨씬 다양해서, 1.1은 네 가지를 섞습니다.
방식 | 무엇을 흉내 내는가 |
Whole-channel | 죽은 전극 / 성긴 몽타주 |
Full-time | 순간 전체 끊김 / 머리 움직임 |
Channel-time | 인접 전극 무리의 동작 아티팩트 |
Random-uniform | 근육 경련·국소 순간 오류 |
3. 품질 인식 전처리 + 코퍼스 확장
채널을 녹음 통째로 버리던 파이프라인을
채널별·초 단위 품질 점수로 바꿨습니다.
학습 코퍼스 ≈ 2M → 3.5M channel-hour
전처리 변형 2종을 같이 학습 (엄격 bandpass / 느슨한 highpass+notch)
Plain Text
복사
실험에서 기억할 숫자들
홀드아웃 + 미학습 공개 데이터셋 4개에서 평가:
•
ANPHY-Sleep (83ch), Berlin BCI III-V (32ch), BCI2000 (64ch), AAD (255ch)
•
채널 20% / 50% / 75% / 90% 드롭 (= 1.25× ~ 10× 업샘플)
결과 요약:
1.
ZUNA1.1 ≥ ZUNA1 (NMSE), 둘 다 스플라인 보간을 뚜렷이 이김
2.
드롭이 심해질수록(특히 90%) 스플라인과의 격차가 커짐
3.
초고밀도(AAD 255ch)에서는 이웃이 가까워 절대 격차는 작음
4.
뇌 영역 통째 삭제 같은 현실적 결손에서도 학습된 다변량 구조가 유리
유연성을 늘렸는데 정확도를 거의 안 깎았다 — 이게 1.1의 포인트입니다.
기본 사용법
git clone <https://github.com/Zyphra/zuna.git> && cd zuna
# GPU면 CUDA 맞는 torch를 먼저
pip install torch --index-url <https://download.pytorch.org/whl/cu128>
pip install zuna
Bash
복사
핵심 API는 .fif → 복원/디노이즈/업샘플 한 방인 reconstruct_fif입니다.
from zuna import reconstruct_fif
reconstruct_fif(
input_dir="fif_in",
output_dir="fif_out",
figures_dir="figures",
gpu_device=0, # CPU면 ""
repair_channels=["Cz"], # 완전 복원할 채널
target_channel_count=["Fz", "Pz"], # 이름으로 업샘플 (정수 지정도 가능)
bad_segments=[(5, 6), (10, 11, "C3")], # 불량 구간
)
Python
복사
실무 팁:
입력 .fif 에 전극 3D 좌표 필요 (없으면 몽타주로 표준 위치 부여)
짧게 자른 epoch보다 연속 raw가 유리 (필터 경계 아티팩트)
동작: 256Hz / 한 패스당 0.5~30초
설치 싫으면 Zyphra Cloud EEG Playground 에서 브라우저 추론
Plain Text
복사
자주 하는 실수들입니다!
실수 1. 복원 결과를 "측정값"으로 취급한다
생성 모델입니다. 환각(hallucination) 이 가능합니다.
복원 채널은 실측이 아니라 대치(imputed) 데이터입니다.
임상 의사결정 근거로 쓰면 안 되고, 저자도 진단 도구가 아니라고 명시합니다.
실수 2. 고정 몽타주 모델이랑 같은 줄에 세운다
ZUNA의 가치는 SOTA 1% 포인트가 아니라
임의 채널 수·위치·결손 패턴을 한 모델로 받는 쪽에 있습니다.
실수 3. 짧은 에포크만 넣고 성능이 별로라고 한다
경계 아티팩트 + 문맥 부족이 겹칩니다.
가능하면 연속 raw, 길이는 0.5~30초 범위 안에서 넉넉히.
실수 4. torch를 CPU로 깔아놓고 "느리다"고 한다
CUDA 맞는 torch를 zuna보다 먼저 설치하세요.
안 그러면 조용히 CPU fallback → 체감이 지옥입니다.
정리해봅시다!
1.
ZUNA1.1은 위치 인식 확산 오토인코더로, EEG 채널을 인덱스가 아니라 3D 좌표로 다룬다.
2.
하는 일: 결손 복원 / 디노이즈 / 몽타주 업샘플 — channel-agnostic.
3.
1.1의 핵심 업그레이드는 가변 길이(0.5~30s), 4종 드롭아웃, 품질 인식 전처리다.
4.
정확도는 1.0과 동등 이상, 극단 드롭·영역 결손에서 스플라인을 크게 이긴다.
5.
오픈 가중치 + pip install zuna + Playground까지 있어, EEG 전처리/BCI 파이프에 바로 꽂아 볼 수 있다.
6.
다만 출력은 추정값이다. 연구·프로토타이핑용으로 쓰고, 진단용으로 쓰지 말 것.

