Loading the catalog…
Loading the catalog…
안녕하세요. 하이스트레인저에서 테크리드를 맡고 있는 고수진입니다. 영화를 보고 나서 “재미있었다”는 감상은 남지만, 어떤 장면에서 몰입했고 어디서 관심이 끊겼는지까지 설명하기는 쉽지 않습니다. 저희는 관객이 콘텐츠를 보는 동안 나타나는 생체·행동 신호를 통해 그 반응을 더 구체적으로 이해하고, 콘텐츠 제작과 개선에 참고할 수 있도록 돕고자 합니다. 그러려면 분석 결과부터 믿을 수 있어야 합니다. 서로 다른 센서의 신호가 같은 장면에 연결되어 있는지, 모델이 이미 본 사람이나 구간을 기억해서 높은 점수를 받은 것은 아닌지 확인해야 합니다. 테크리드로서 데이터 수집 구조와 모델 검증을 함께 살펴보는 이유도 여기에 있습니다. 이번 글에서는 서로 다른 신호를 하나의 시간축에 맞추는 일부터, 모델에 정말 새로운 데이터를 보여주는 평가를 설계하는 일까지 이어서 살펴보겠습니다. 먼저, 데이터를 분리했는데도 평가 점수를 그대로 믿기 어려운 상황 하나로 시작해보겠습니다. 학습 데이터와 평가 데이터를 분리했습니다. 같은 행이 양쪽에 들어가지 않는 것도 확인했습니다. 이제 평가 점수를 믿어도 될까요? 5초짜리 데이터를 1초씩 옮겨가며 잘랐다면, 서로 다른 두 행에 같은 원본 신호가 4초나 들어 있을 수 있습니다. 파일에서는 다른 샘플이지만, 모델 입장에서는 상당 부분을 이미 본 셈입니다. 모델이 잘 배운 걸까, 시험 문제가 낯익었던 걸까? 위 상황은 데이터 분할의 함정을 설명하기 위한 예시입니다. 멀티모달 AI를 만들 때는 이보다 앞선 질문도 생깁니다. 그 5초 안에 묶어놓은 뇌파, 맥파, 시선이 애초에 같은 장면의 데이터가 맞을까요? 이전 TRIBE v2 × InsightFlow 비교 실험 에서는 영상 분석의 표본 내 설명력이 시간 순서를 고려한 블록 교차검증에서 유지되지 않았습니다. 당시 결과만으로 원인이 데이터 누수였다고 결론 낼 수는 없습니다. 다만 “관계가 보인다”는 것과 “새로운 데이터에서도 예측할 수 있다”는 것을 구분해야 했습니다. 이번에는 그 결과를 해석하기 위해 돌아봐야 할 데이터의 경로를 살펴보겠습니다. 어떤 신호를 함께 묶었는지, 무엇을 한 샘플로 만들었는지, 그리고 무엇을 처음 보는 데이터로 정했는지. 세 가지를 따라가다 보면 수집 시스템의 설계가 어떻게 모델 평가까지 이어지는지 볼 수 있습니다. 1. 데이터가 만 행이면, 관찰도 만 번일까? 데이터프레임에 만 행이 있다고 해도, 만 번의 독립적인 관찰이 쌓였다고 볼 수는 없습니다. 한 사람이 본 하나의 영상을 잘게 나눠 만든 데이터일 수도 있기 때문입니다. 멀티모달 데이터를 다룰 때는 먼저 ‘데이터 한 건’의 의미를 정해야 합니다. 센서가 보낸 패킷 하나일 수도 있고, 5초 구간의 특징 벡터 하나일 수도 있습니다. 한 사람이 하나의 장면을 본 기록일 수도 있습니다. 무엇을 한 건으로 정의하느냐에 따라 저장 구조, 모델 입력, 검증 단위가 달라집니다. 예를 들어 ‘참여자 한 명이 특정 장면을 보는 동안의 반응’을 분석한다고 가정해보겠습니다. 이 경우 특징값만 저장해서는 그 데이터가 어떤 관찰에서 만들어졌는지 추적하기 어렵습니다. 구분 필드 예시 필요한 이유 관찰 대상 participant_id , session_id 동일 참여자와 반복 측정을 구분 콘텐츠 content_id , scene_id 동일 작품과 장면을 구분 시간 구간 window_start , window_end 특징값이 만들어진 원본 범위를 확인 데이터 품질 valid_ratio , quality_flag 신호 부족과 실제 낮은 반응을 구분 처리 이력 preprocessing_version 어떤 처리 조건으로 만들어졌는지 확인 이 필드들은 분석 결과를 다시 찾기 위한 메타데이터이면서, 학습과 평가 데이터를 나누는 기준이기도 합니다. 참여자 정보가 없으면 새로운 사람에 대한 평가를 구성하기 어렵고, 원본 구간이 없으면 두 샘플이 같은 신호를 공유하는지 확인하기 어렵습니다. 따라서 수집 스키마를 정할 때부터 평가할 상황을 함께 생각할 필요가 있습니다. 2. 관객은 10초 장면을 봤는데, 서버에는 10.8초에 도착했다 영화의 놀라는 장면이 끝난 직후, 조용한 대화 장면이 시작됐다고 가정해보겠습니다. 관객의 반응이 조금 늦게 서버에 도착했다면, 그 반응을 어느 장면에 붙여야 할까요? 이 질문에 답하려면 로그에 찍힌 시간이 무엇을 뜻하는지부터 구분해야 합니다. 시간 의미 측정 시각 센서가 신호를 취득한 시점 수신 시각 앱이나 서버가 데이터를 받은 시점 콘텐츠 재생 위치 사용자가 실제로 보고 있던 영상의 위치 예를 들어 영상의 10초 지점에서 발생한 신호가 통신 지연으로 10.8초에 도착할 수 있습니다. 이때 수신 시각으로 장면을 연결하면 다음 장면의 반응으로 배정될 가능성이 있습니다. 서버에 도착한 순서만으로는 실제 발생 순서를 충분히 설명할 수 없는 이유입니다. 장치가 각각 자신의 시계를 사용한다면 시계 사이의 차이도 고려해야 합니다. 시작 시점의 차이인 오프셋과, 시간이 흐르며 누적되는 드리프트를 구분해야 합니다. LSL의 시간 동기화 문서에서도 샘플 타임스탬프와 시계 오프셋 측정값을 함께 사용해 서로 다른 시계의 데이터를 연결합니다.[1] 여기에 영상 재생 상태가 추가됩니다. 버퍼링이나 일시정지가 발생하면 측정 시작 이후 경과 시간과 영상 재생 위치가 달라집니다. 따라서 재생 시작 시각 하나만 저장하는 방식으로 충분한지, 재생·정지·탐색 이벤트와 중간 재생 위치를 함께 기록해야 하는지 판단해야 합니다. 다음 그림은 전송 지연과 일시정지가 있는 상황을 단순화한 예시입니다. 그림 1. (a) 측정 시각과 수신 시각의 차이, (b) 일시정지로 발생하는 경과 시간과 영상 위치의 차이. 아래 차트의 7초 시점에서 영상은 5초 위치에 있음. 실측값이 아닌 설명용 예시임. 이때 목표는 모든 장치에 동일한 타임스탬프를 붙이는 데서 끝나지 않습니다. 어떤 근거로 시간을 변환했는지, 어느 정도의 오차가 남을 수 있는지까지 확인할 수 있어야 합니다. 허용 가능한 오차도 장면 단위 분석인지, 짧은 이벤트 직후의 반응을 분석하는지에 따라 달라집니다. 3. 같은 5초인데 데이터 개수는 전부 다르다 시간축을 맞췄다고 데이터가 곧바로 같은 형태가 되지는 않습니다. EEG, PPG, 카메라 데이터는 수집 주기가 다르고, 각 신호에서 추출하는 특징도 다릅니다. “모델은 아직 안 돌렸고, 타임스탬프만 세 시간째 보고 있습니다.” 예를 들어 EEG 256Hz, PPG 100Hz, 카메라 30fps인 구성을 가정하면, 누락이 없는 5초 구간에는 각각 1,280개, 500개, 150개의 시점이 들어갑니다. 카메라의 150프레임 모두에서 유효한 시선이나 얼굴 특징을 얻는다는 보장은 없습니다. 그림 2. EEG 256Hz, PPG 100Hz, 카메라 30fps를 가정했을 때 0초 이상 0.25초 미만의 샘플 시각. 각 세로선은 이상적인 수집 시점이며 신호 진폭을 뜻하지 않음. 모든 채널이 0초에서 시작한다는 가정의 예시임. 특징 기반 융합을 한다면 각 신호에서 특징을 추출한 뒤 공통 분석 구간에 연결할 수 있습니다. 원시 신호를 직접 입력하는 모델이라면 별도의 리샘플링이나 마스킹 설계가 필요할 수 있습니다. 어느 방식을 택하든 데이터 개수를 맞추는 것과 시간적 의미를 맞추는 것은 별개의 작업입니다. 또한 모든 특징을 동일한 길이의 원본 구간에서 계산해야 하는 것도 아닙니다. 모델이 1초마다 결과를 출력하더라도, 어떤 특징은 직전의 더 긴 신호 구간을 사용해 계산할 수 있습니다. 이 경우 출력 시각만 기록하면 입력이 참조한 범위를 놓치게 됩니다. 예를 들어 30초 시점의 특징이 0~30초 데이터를 사용했다면, 해당 특징의 원본 범위도 함께 추적해야 합니다. 이 정보는 뒤에서 학습·평가 경계의 중복을 판단하는 데 필요합니다. 결측 처리도 같은 맥락에서 봐야 합니다. 시선이 검출되지 않은 구간을 0으로 채우면, 유효한 측정값 0과 측정 실패를 구분하기 어렵습니다. 보간 여부와 별개로 유효 비율이나 결측 마스크를 남겨야 모델 입력과 결과를 해석할 수 있습니다. 4. train과 test를 나눴는데, 원본은 겹쳤다 이제 도입에서 던진 질문으로 돌아오겠습니다. 학습과 평가에 같은 행이 없는데도, 모델이 평가 데이터의 일부를 이미 보았을 수 있을까요? 슬라이딩 윈도우를 만든 뒤 행 단위로 무작위 분할했다면 가능합니다. 잘라낸 구간들의 행 번호는 달라도 원본 신호가 겹칠 수 있기 때문입니다. 5초 윈도우를 1초씩 이동시키는 예를 보겠습니다. 샘플 원본 구간 배정 예시 A 0초 이상~5초 미만 학습 B 1초 이상~6초 미만 평가 C 2초 이상~7초 미만 학습 그림 3. 5초 윈도우를 1초씩 이동시키면 A와 B가 1~5초의 원본 신호를 공유함. 음영과 점선은 두 구간이 공유하는 4초 범위를 나타냄. A와 B는 4초 분량의 원본 신호를 공유합니다. 서로 다른 행이지만 독립된 관찰로 보기는 어렵습니다. 평가 샘플이 학습 데이터와 얼마나 분리되어 있는지 확인하려면 행 번호보다 원본 신호의 범위를 봐야 합니다. “행 번호가 다른데... 이게... 새로운 데이터인가요?” 이를 피하려면 평가 목적에 맞춰 참여자·콘텐츠·시간 블록을 먼저 나누고 각 영역 안에서 윈도우를 만들거나, 이미 생성된 윈도우의 원본 범위를 확인해 경계를 넘는 샘플을 제외하는 방법을 고려할 수 있습니다. 시간 경계에 간격을 두는 경우에도 윈도우 길이만 보면 충분하지 않을 수 있습니다. 더 긴 과거를 참조한 특징, 필터의 영향 범위, 예측 대상의 시간 범위까지 함께 살펴야 합니다. 원본이 겹치지 않더라도 가까운 구간 사이에 시간적 의존성이 남는지도 별도로 확인해야 합니다. 다만 모든 분할에서 모든 종류의 중복을 없애야 한다는 뜻은 아닙니다. 같은 사람의 다음 구간을 예측하는 서비스와 처음 만나는 사람을 분석하는 서비스는 평가할 조건이 다릅니다. 먼저 무엇에 대한 일반화를 확인하려는지 정해야 합니다. 5. 처음 보는 사람인가, 처음 보는 영화인가? “새로운 데이터에서 잘 맞습니다.” 이 말에서 ‘새로운’이 무엇인지에 따라 실험은 달라집니다. 같은 관객의 다음 장면을 맞히는 것과, 처음 온 관객이 새로운 영화를 볼 때의 반응을 맞히는 것은 다른 문제입니다. 평가하려는 상황 분할의 중심 단위 같은 측정에서 이후 구간을 예측 시간 순서 같은 사람의 다른 날 측정에 적용 세션 처음 참여한 사람에게 적용 참여자 보지 못한 작품에 적용 콘텐츠 새로운 사람과 새로운 작품에 동시에 적용 참여자와 콘텐츠를 모두 분리 scikit-learn도 시계열 데이터와 그룹이 있는 데이터에 서로 다른 교차검증 방식을 제공합니다. 동일 참여자의 여러 샘플이 존재한다면 참여자 단위 분할을 통해 해당 참여자가 평가 시점에 학습 데이터에 포함되지 않도록 할 수 있습니다.[2] 참여자만 분리한 평가로 새로운 콘텐츠에 대한 일반화까지 확인했다고 말할 수는 없습니다. 두 조건을 동시에 평가하려면 학습과 평가 사이에 참여자 집합과 콘텐츠 집합이 각각 겹치지 않도록 설계해야 합니다. 참여자와 콘텐츠를 이어 붙인 조합 ID만 분리하면 같은 사람이 다른 작품으로 양쪽에 등장할 수 있습니다. 이 선택은 제품 요구사항과도 연결됩니다. 서비스가 분석하려는 대상이 기존 사용자인지, 새로운 고객인지, 매번 새롭게 들어오는 콘텐츠인지에 따라 필요한 평가가 달라집니다. 6. 정규화는 끝냈는데, 시험지를 먼저 본 셈이라면 학습·평가 구간을 잘 나눴더라도 그 전에 전체 데이터로 정규화를 끝냈다면 어떨까요? 평가 데이터의 정보가 평균과 표준편차를 통해 이미 학습 과정에 들어갔을 수 있습니다. 정답 라벨을 직접 보여주지 않았어도, 데이터에서 학습하는 전처리 과정은 평가 정보를 참조할 수 있습니다. 데이터에서 학습되는 스케일링, 결측 대체, 특징 선택 등의 변환은 각 학습 폴드에서 추정하고 평가 폴드에는 적용만 해야 합니다. scikit-learn의 Pipeline 은 이러한 단계를 모델과 함께 묶는 데 도움이 됩니다.[3] 실시간 분석을 목표로 한다면 미래 구간을 사용하는지도 확인해야 합니다. 세션 종료 후 전체 기록으로 정규화한 결과가 좋더라도, 분석 도중에는 같은 정보를 사용할 수 없습니다. 초기 보정 구간을 사용하는 제품이라면 평가에서도 같은 보정 조건을 재현해야 합니다. 비교 기준 역시 분명해야 합니다. 멀티모달 모델을 평가한다면 동일한 분할과 평가 표본에서 단일 모달리티 모델과 비교하는 것이 출발점이 될 수 있습니다. 특정 신호를 추가하면서 결측 때문에 평가 대상까지 달라졌다면, 점수 차이에 표본 구성의 영향이 섞였는지도 살펴야 합니다. 이전 TRIBE 실험에서 씬 길이를 통제한 뒤 예측값의 추가 설명력을 살펴본 것도 비교 기준을 명확히 하려는 접근이었습니다. 다만 그 분석 결과를 새로운 데이터에 대한 예측 성능과 동일하게 해석해서는 안 됩니다. 7. 점수가 내려갔다. 이제 무엇을 고칠까? “학습할 땐 맞았는데요...” 처음 보는 데이터: “때...앵...” 검증 결과를 열었을 때의 당혹감에 붙인 상황 캡션. 방송: MBC 《무한도전》. 이미지 게재 출처: 세모짤 . 원본 변경 없음. 검증 결과가 기대보다 낮게 나왔다면 어느 단계의 문제인지 좁혀가야 합니다. 아래는 결과를 바로 원인으로 단정하지 않고 추가 점검으로 연결하는 예입니다. 관찰된 현상 다음에 확인할 내용 장면 전환 부근에서 오차가 커짐 재생 위치 기록, 시간 정렬 오차, 특징이 참조한 구간 참여자를 분리하면 성능이 낮아짐 개인별 차이, 보정 조건, 학습 표본의 다양성 콘텐츠를 분리하면 성능이 낮아짐 콘텐츠별 분포와 라벨 구성, 학습 데이터의 범위 일부 센서가 누락되면 결과가 불안정해짐 결측 처리, 품질 정보, 누락 조건별 평가 오프라인 평가와 실제 운영 결과가 다름 지연, 입력 가용 시점, 전처리 차이 새로운 모델을 적용할 수도 있지만, 수집 이벤트를 추가하거나 분석 구간을 다시 정의하는 것이 다음 작업일 수도 있습니다. 판단의 근거를 남기려면 결과와 함께 데이터 버전, 전처리 조건, 분할 기준, 평가 대상의 구성을 기록해야 합니다. 일을 하면서 생각하게 된 건 이 경계를 연결하는 일이 중요한 것 같다는 것입니다. 수집 단계에서 남기지 않은 정보는 모델 개발 단계에서 복구하기 어렵습니다. 반대로 평가할 상황이 정의되지 않으면 수집 단계에서도 어떤 정보를 반드시 남겨야 하는지 판단하기 어렵습니다. 성능표 옆에 남겨야 할 질문 모델의 점수를 보면 다음 실험을 떠올리기 쉽습니다. 층을 더 쌓을지, 다른 모델을 써볼지, 모달리티를 하나 더 넣을지 고민하게 됩니다. “일단 레이어 추가는 잠깐 멈추고. 원본 로그부터 열자.” 그전에 입력 한 행을 원본까지 따라가 볼 필요가 있습니다. 어떤 사람이, 어떤 장면을 보았고, 어느 구간의 신호가 들어갔는지. 그리고 평가 데이터는 학습 데이터와 무엇을 공유하는지 말입니다. 수집 시스템과 모델 평가를 함께 봐야 하는 이유도 여기에 있습니다. 모델 개발 단계에서 필요한 참여자 ID나 재생 기록을 수집 단계에서 남기지 않았다면, 나중에 코드를 바꾸는 것만으로는 해결하기 어렵습니다. 다음에 좋은 성능표를 보게 된다면 이 질문을 먼저 던져보려고 합니다. 이 모델에게 정말 새로운 것은 무엇이었을까? 그 질문에 답할 수 있어야 점수를 실제 서비스의 조건과 연결할 수 있다고 생각하게 되었습니다. 참고 자료 Lab Streaming Layer — Time Synchronization scikit-learn — Cross-validation: evaluating estimator performance scikit-learn — Common pitfalls and recommended practices Histranger — TRIBE v2 × InsightFlow: 예측된 뇌 반응과 실제 관객 반응을 비교해봤습니다
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
잘 맞던 AI 모델, 정말 처음 보는 데이터였을까?. 안녕하세요. 하이스트레인저에서 테크리드를 맡고 있는 고수진입니다. 영화를 보고 나서 “재미있었다”는 감상은 남지만, 어떤 장면에서 몰입했고 어디서 관심이 끊겼는지까지 설명하기는 쉽지 않습니다. 저희는 관객이 콘텐츠를 보는 동안 나타나는 생체·행동 신호를 통해 그 반응을 더 구체적으로 이해하고, 콘텐츠 제작과 개선에 참고할 수 있도록 돕고자 합니다. 그러려면 분석 결과부터 믿을 수 있어야 합니다. 서로 다른 센서의 신호가 같은 장면에 연결되어 있는지, 모델이 이미 본 사람이나 구간을 기억해서 높은 점수를 받은 것은 아닌지 확인해야 합니다. 테크리드로서 데이터 수집 구조와 모델 검증을 함께 살펴보는 이유도 여기에 있습니다. 이번 글에서는 서로 다른 신호를…
Open source