Search

260723_2338_ZUNA1.1: 위치 인식 확산 오토인코더 기반 EEG 복원 파운데이션 모델 (feat. Zyphra)

출처

논문: 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.
다만 출력은 추정값이다. 연구·프로토타이핑용으로 쓰고, 진단용으로 쓰지 말 것.

끝!