프로젝트 기록

PROJECT RECORD

더했는데 0이 되는 점수: IRIS 비교 코드에서 찾은 문제

EN 한국어

유전자 발현량 세 개가 2, 4, 6이면 합은 12다. 그런데 더하기 전에 각 값에서 평균 4를 빼면 −2, 0, 2가 되어 합이 0으로 바뀐다. 원래 값이 4, 8, 12여도 평균을 빼고 나면 합은 다시 0이다. 실제 실험값이 아닌 작은 계산 예지만, IRIS의 공개 비교 코드를 점검하면서 확인한 문제를 설명해 준다. 더하려던 정보가 전처리 단계에서 사라지고 있었다.

IRIS는 세포 하나에서 측정한 RNA를 바탕으로 어떤 신호에 반응했는지, 그 신호의 이력이 어떠했는지 추정하는 연구 도구다. Nicholas Hutchins와 동료 연구진은 세포에 여러 신호를 가한 실험으로 신경망을 학습시키고, 다른 세포와 발생 과정으로 옮겨 평가했다. 원논문은 2026년 9월 8일 Nature Methods에 실렸다. 내가 살핀 출발점은 이 신경망의 성능을 비교할 때 쓰는 간단한 기준 계산이었다.

복잡한 모델 옆에 놓인 간단한 비교 기준

특정 신호가 들어왔을 때 반응하는 것으로 알려진 유전자들을 골라 발현량을 더하면, 그 세포가 해당 신호에 얼마나 반응했는지 살펴보는 점수를 만들 수 있다. 여기서는 세포마다 측정된 RNA 총량을 맞춘 뒤 로그 변환한 발현량을 더한다. 이런 간단한 계산을 비교 기준, 즉 baseline으로 두면 신경망이 추가로 얻는 정보가 얼마나 되는지 판단하는 데 도움이 된다.

논문의 Methods가 설명한 response-gene 점수와 공개 코드의 response_gene()가 수행하는 계산은 달랐다. 코드는 한 세포 안에서 선택한 유전자들의 평균을 빼고 표준편차로 나누는 z-score 변환을 한 뒤 합산했다. 같은 묶음의 평균을 뺀 값들의 합은 수학적으로 0이므로, 표준편차로 나눠도 합은 0이다. 실제 컴퓨터에서는 아주 작은 반올림 잔차가 남을 수 있지만, 그것을 세포의 반응 세기로 읽을 수는 없다.

도입의 세 숫자는 이 소실을 보여주기 위한 예시다. 실제 분석은 신호별 유전자 집합, 세포별 총량 정규화, 로그 변환과 가중치를 사용하므로 예시 숫자를 실제 점수로 해석해서는 안 된다. 핵심은 신경망이 틀렸다는 주장을 먼저 하는 데 있지 않았다. 논문에 적힌 비교 계산과 배포된 함수가 같은 질문에 답하도록 연결하는 일이 먼저였다.

불일치를 전달한 뒤, 수정된 함수까지 확인했다

이 불일치를 원저자에게 전달했고, Nicholas Hutchins는 9월 24일 답신에서 함수를 수정했다고 확인하면서 학습된 모델 파일의 위치도 알려 주었다. 수정 자체는 9월 19일 UTC의 공개 커밋에 남아 있다. 문제를 전달하고 확인한 내 역할과 실제 원저장소 코드를 고친 저자의 역할을 구분할 수 있는 기록이다. 저자는 커밋 설명에서 수정된 함수가 논문 그림 생성에 사용한 기존 resp_calc() 계산과 일치한다고 밝혔다.

수정에서는 세포 내부의 z-score 변환과, 입력으로 받은 세포 집합의 최댓값으로 점수를 다시 나누던 연산이 제거됐다. 유전자 가중치는 유지되어 기본값 1일 때는 정규화·로그 변환한 발현량의 합이 된다. 최댓값 나누기도 없어져, 호출할 때 어느 세포를 함께 넣었느냐에 따라 같은 세포의 점수 척도가 달라지는 문제를 피하게 됐다.

9월 27일에는 이전 함수와 수정 함수를 함께 살펴보고, 합성 정수 count 네 행으로 수정된 함수를 실행했다. 선언된 합산식으로 따로 계산한 값과의 최대 차이는 0.0이었다. 이 확인은 해당 함수가 의도한 수식대로 계산한다는 좁은 검증이다. 원논문의 모든 그림이나 신경망 전체를 다시 재현했다는 뜻으로 쓰지는 않았다.

모델을 다른 자료에 옮길 때는 빈 입력이 남았다

학습된 모델을 확보한 뒤에는 별도의 인간 신경 오가노이드 연구에서 제한된 전이 시험을 진행했다. 오가노이드는 실험실에서 배양한 세포들이 조직의 일부 특징을 나타내도록 만든 모델이다. 이 자료에는 레티노산(RA)에 노출한 조건과 대조 조건이 있어, 공개된 RA 분류기가 기록된 노출 이력을 구분하는지 볼 수 있었다. 이 실험의 배양 조직은 IRIS 모델의 학습 맥락과 같지 않다.

9월 24일에 평가 조건을 고정하고, 두 실험 배치·네 세포주·두 배양배지와 세 조건의 조합에서 각각 32개 세포를 정해 총 1,536개를 사용했다. 대조군 512개와 RA_A·RA_E 각 512개다. 세포 선택은 모델의 점수를 보기 전에 정했으며, 9월 27일 계산에서는 새 학습이나 임계값 조정을 하지 않았다.

모델이 요구한 유전자 입력 13,222개 가운데 13,078개는 현재 이름으로, 88개는 고유하게 대응되는 예전 이름으로 맞출 수 있었다. 남은 56개는 자료에서 측정되지 않았다. 이 자리를 0으로 채우는 규칙을 미리 정했지만, ‘측정하지 않았다’와 ‘생물학적으로 발현하지 않는다’는 다르다. 따라서 이 규칙은 내가 이번 시험을 위해 정한 입력 처리이며, 원저자가 검증한 외부 자료 처리법으로 소개할 수 없다.

전체 점수와 조건별 결과를 함께 읽었다

비교에는 공개된 gastrulation RA 모델 하나와, 미리 정한 RA 반응 유전자 아홉 개의 합을 사용했다. 표의 AUROC는 노출 세포와 대조 세포를 하나씩 골랐을 때 노출 세포에 더 높은 점수를 주는 정도를 요약한다. 무작위 순위는 0.5 부근이며, 0.8이라는 값을 ‘세포의 80%를 정확히 분류했다’는 뜻으로 읽으면 안 된다.

고정한 비교 방법전체 1,536개 세포의 AUROC
IRIS RA 분류기 · 미측정 입력 0 채움0.7994
RA 반응 유전자 9개의 합0.8311

전체를 합친 값에서는 간단한 유전자 합이 더 높았다. 하지만 배치·배지·세포주를 맞춘 16개 묶음으로 나누면 IRIS가 높은 경우가 9개, 유전자 합이 높은 경우가 7개였다. 전체 세포를 합쳐 계산한 AUROC만 보고 간단한 방법이 모든 조건에서 더 좋다고 결론 내릴 수 없었다.

미측정 유전자 56개를 모두 1 count 또는 10 counts로 채우는 두 가지 스트레스 조건도 미리 정해 비교했다. 이는 실제 발현량을 추정한 값이 아니라, 입력 가정에 따라 출력이 얼마나 움직이는지 보는 인위적인 시험이다. 고정 분류 기준 0.5에서 0 채움 대비 결과가 바뀐 세포는 각각 80개(5.21%)와 225개(14.65%)였다.

세포 1,536개는 독립된 실험 1,536회가 아니다. 같은 배양 묶음과 두 실험 배치 안에 들어 있는 관찰값이므로 세포 수를 그대로 반복 수로 삼은 유의성 검정은 하지 않았다. 또한 정답으로 쓴 것은 기록된 RA 노출 여부다. 측정 시점의 세포 내부 신호 활성을 직접 확인한 값은 아니며, 세포 종류의 구성도 점수 차이에 영향을 줄 수 있다. RA_A와 RA_E의 정확한 농도·시간 대응 역시 이 작업에서는 확정하지 않았다.

수정된 문제와 남은 질문

이번 작업에서 닫을 수 있었던 것은 공개 비교 함수의 불일치였다. 저자의 수정과 제한된 재실행 근거를 함께 남겼다. 별도 자료에서 진행한 시험은 입력이 빠졌을 때 어떤 가정을 썼는지, 전체 점수와 조건별 결과가 어떻게 달랐는지까지 보여준다.

외부 자료 시험을 원논문의 생물학적 결론을 반박하는 결과로 키우지는 않았다. 원논문은 이미 별도의 검증과 전이 평가를 보고하고 있으며, 이번 입력 처리는 그 방법을 그대로 재현한 것이 아니다. 추가로 판단하려면 56개 미측정 입력에 대한 저자 측의 지원 가능한 처리법과 RA 조건의 정확한 의미부터 확인해야 한다. 완성된 계산은 보존하고, 후속 판단은 미측정 입력의 처리법과 RA 조건이 확인될 때로 남겼다.

원자료와 코드: IRIS 논문 · 공식 저장소 · response_gene 수정 · 학습된 모델 · 외부 오가노이드 자료의 논문. 분석 코드와 재현성 점검, 글 정리에 OpenAI Codex의 도움을 받았다.

연구 목록 · 작업 목록

Research index · Work index

Woong Works에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기