분류 모델을 처음 만들면 보통 이런 기대를 하게 됩니다.
고양이와 강아지를 학습시켰으면, 테스트에서도 잘 구분해주겠지 하는 기대입니다.
그런데 실제 환경은 그렇게 단순하지 않습니다.
현실에서는 학습할 때 보지 못한 데이터가 계속 들어옵니다.
감시 카메라 장면에서는 평소 보지 못한 움직임이 등장할 수 있고, 일반 이미지 분류기에는 애초에 학습 대상이 아니었던 물체가 들어올 수 있습니다.
문제는 대부분의 모델이 모르는 것을 모른다고 말하도록 훈련되어 있지 않다는 점입니다. 그래서 정상과 비정상을 구분하는 문제, 그리고 학습 분포 안과 밖을 구분하는 문제가 중요해집니다. 보안·감시 분야에서는 평소와 다른 데이터 패턴을 빠르게 파악하고, 이전에 보지 못했던 종류의 데이터도 감지해야 한다는 점이 강조된다.
이번 글에서는 이 흐름을 처음부터 정리해보려고 합니다.
먼저 Anomaly Detection이 무엇인지 보고, 그 안에서 OOD Detection이 왜 따로 중요한지 살펴본 다음, 마지막에는 PyTorch로 가장 기본적인 OOD 실험을 어떻게 구성할 수 있는지도 함께 정리해볼겁니다. OOD 구현 예시로는 FashionMNIST를 in-distribution으로, MNIST를 out-of-distribution으로 두고 Maximum Softmax와 Temperature Scaling(ODIN)을 비교하는 구성이 제시된다.
먼저, Anomaly Detection은 무엇일까
Anomaly Detection은 말 그대로 이상한 샘플을 찾아내는 문제입니다.
데이터가 평소에는 어떤 범위나 패턴 안에 모여 있는데, 가끔 그 흐름을 벗어나는 샘플이 등장할 수 있습니다.
그럴 때 그 샘플을 “이상하다”고 판단하는 것이 핵심입니다. 문서에서는 anomaly를 흔치 않은 사건, 항목, 또는 관측치로 설명하고, 데이터가 특정 범위에 분포할 때 그 바깥으로 들어오는 샘플을 anomaly로 볼 수 있다고 정리한다.
이 개념은 감시 시스템에서 특히 직관적입니다.
예를 들어 평소에는 사람들이 걷기만 하던 공간에서 갑자기 넘어짐, 폭력, 절도, 차량 침입 같은 상황이 발생하면 시스템은 그것을 빨리 감지해야 합니다.
중요한 점은 “평소 패턴만 잘 아는 것”으로는 부족하다는 것입니다.
실제 시스템은 익숙하지 않은 장면이 들어왔을 때도 이상하다고 감지할 수 있어야 합니다.

그런데 모든 이상 탐지가 같은 문제는 아니다
Anomaly Detection은 하나의 단일한 방식이 아니라,
어떤 데이터가 있고 어떤 라벨이 있느냐에 따라 접근이 달라집니다.
가장 먼저 생각할 수 있는 것은 supervised 방식입니다.
정상과 이상 라벨이 모두 준비되어 있다면, 결국 분류 문제처럼 학습할 수 있습니다.
입력과 정답을 함께 주고 “이건 정상, 이건 이상”을 배우게 하면 되기 때문입니다.
다만 현실에서는 이상 데이터가 상대적으로 적고, 수집도 어렵고, 클래스 불균형도 심하다는 문제가 따라옵니다.
그다음은 semi-supervised 방식입니다.
이건 정상 샘플만 충분히 있고, 이상 샘플은 거의 없거나 아예 없는 상황을 가정합니다.
즉 모델에게 “정상은 이런 모양이다”를 충분히 익히게 한 뒤, 거기서 멀어지는 샘플을 이상으로 보는 방식입니다.
자료에서는 이를 one-class classification이라고도 설명하고, 새로운 유형의 anomaly에 대처하기 쉽다는 장점이 있다고 정리한다. 다만 supervised와 같은 조건에서 비교하면 성능은 다소 불리할 수 있다.
마지막은 unsupervised 방식입니다.
정상인지 이상인지 라벨 자체가 없는 경우입니다.
이 경우에는 데이터 전체 구조를 보고 군집이나 밀도, 재구성 오차 같은 기준으로 이상치를 찾아야 합니다.
장점은 라벨 없이도 적용 가능하다는 점이지만, 그만큼 최적화가 더 어렵고 성능 해석도 까다롭습니다.
이 세 가지를 처음 공부할 때는 이름이 어렵게 느껴질 수 있지만, 결국 질문은 단순합니다.
- 이상 샘플을 직접 봤는가
- 정상 샘플만 있는가
- 아니면 아무 라벨도 없는가
이 차이만 먼저 잡아도 이후의 알고리즘이 훨씬 덜 복잡해집니다.

딥러닝 이전에도 이상 탐지는 존재했다
딥러닝이 등장하기 전에도 이상 탐지는 중요한 문제였습니다.
이 시기에는 주로 거리, 밀도, 군집 구조를 이용한 방법들이 많이 사용되었습니다.
대표적으로는 밀도 기반 접근이 있습니다.
새 샘플이 들어왔을 때 주변 이웃들과의 거리를 보고, 그 점이 기존 데이터와 잘 어울리는지 판단하는 방식입니다.
가까운 이웃들과의 거리가 전반적으로 크다면, 분포에서 떨어져 있는 이상치일 가능성이 높아집니다. 문서에서는 Euclidean distance나 Hamming distance를 사용한 k-nearest neighborhood 계산이 대표적인 non-parametric 방식으로 정리된다.
또 하나는 클러스터링 기반 접근입니다.
데이터가 여러 군집으로 나뉜다고 보면, 각 군집의 경계 바깥으로 나간 샘플을 이상으로 볼 수 있습니다.
K-means나 spectral clustering 같은 알고리즘이 이런 직관과 연결됩니다.
마지막으로 SVM 기반 접근도 자주 언급됩니다.
분류에서 익숙한 SVM이지만, one-class 설정에서는 정상 데이터가 위치하는 영역을 감싸고 그 바깥을 이상으로 보는 식으로 사용할 수 있습니다.
딥러닝 이후의 Deep SVDD도 직관적으로는 이 계열의 연장선에서 이해할 수 있습니다.
이 고전적인 방법들을 굳이 먼저 보는 이유는,
딥러닝 방법들도 결국 “정상 데이터가 모여 있는 공간”과 “그 바깥”을 어떻게 정의할 것이냐를 더 정교하게 푸는 방향으로 발전했기 때문입니다.
Supervised anomaly detection은 왜 직관적일까
supervised anomaly detection은 가장 이해하기 쉽습니다.
정상과 이상 데이터가 둘 다 있고, 이를 가지고 바로 분류기를 학습하면 되기 때문입니다.
감시 비디오 분야의 대표 예로 소개된 방법은 비디오를 여러 시간 구간으로 잘라 각 구간 feature를 추출한 뒤, anomaly score가 높은 구간을 학습하도록 구성합니다.
실제 문서에서는 비디오를 여러 temporal segment로 나누고, 각 구간 feature를 모아 ranking loss 성격의 학습을 수행하며, smoothness term과 sparsity term을 함께 둔다고 설명한다. 또한 다양한 이상 상황 데이터셋을 구성해 절도, 폭력 등 여러 범죄 상황을 감지하는 분류 모델을 제안했다는 점도 강조된다.
이 접근이 좋은 이유는 명확합니다.
정답이 있으니 학습이 쉽고, 잘 설계하면 성능도 강하게 나옵니다.
하지만 현실에서는 한계도 분명합니다.
정상 장면은 쉽게 모을 수 있지만, 모든 이상 상황을 충분히 수집하는 것은 어렵습니다.
특히 실제 서비스에서는 미래에 어떤 새로운 이상 상황이 들어올지 알 수 없기 때문에, supervised만으로 모든 문제를 해결하기는 어렵습니다.
그래서 semi-supervised가 중요해진다
이 지점에서 많은 사람들이 semi-supervised 혹은 one-class 방법으로 넘어갑니다.
핵심 생각은 꽤 자연스럽습니다.
“정상 데이터만 잘 모아도, 정상의 모양을 배운 뒤 거기서 많이 벗어나는 것은 이상으로 볼 수 있지 않을까?”
Deep SVDD가 대표적인 예입니다.
이 방법은 입력 데이터를 feature space로 보낸 뒤, 정상 샘플들이 어떤 중심점 근처에 최대한 조밀하게 모이도록 학습합니다.
결과적으로 테스트 샘플이 그 중심에서 멀수록 anomaly score가 커집니다. 문서에서도 Deep SVDD는 data space를 feature space로 변환한 뒤 one-class SVM 성격의 목적함수를 통해 샘플들이 중심 cc 근처에 모이도록 학습하고, anomaly score는 중심과의 거리로 해석된다고 설명한다.
이 방법의 직관은 아주 좋습니다.
정상은 하나의 조밀한 구름처럼 보이고, 이상은 그 구름 바깥에 찍히는 점처럼 보입니다.
다만 여기서도 함정은 있습니다.
정상 데이터 자체가 너무 다양하면, 그것을 하나의 작은 구 형태로 모으는 것이 쉬운 일이 아닙니다.
그래서 feature space를 어떻게 잘 만들 것이냐가 성능에 큰 영향을 줍니다.
라벨이 전혀 없을 때는 어떻게 할까
unsupervised anomaly detection은 더 어렵습니다.
라벨이 전혀 없으니 무엇이 정상이고 무엇이 이상인지 직접 배우기 어렵기 때문입니다.
이때 자주 등장하는 방법 중 하나가 DAGMM입니다.
이 접근은 autoencoder로 입력을 압축한 뒤, 그 압축 표현과 재구성 오차 통계 등을 함께 사용해 Gaussian Mixture Model 계열의 분포 적합을 수행합니다.
간단히 말해 “정상 데이터가 어느 분포를 이루는지”를 재구성과 밀도 두 관점에서 함께 보려는 시도입니다. 문서에서는 DAGMM을 autoencoder와 Gaussian mixture model의 결합으로 설명하고, compression network와 estimation network로 구성되며, 재구성 손실과 likelihood 성격의 목적을 함께 최적화한다고 정리한다.
이런 방식은 라벨이 없어도 적용 가능하다는 점에서 매력적입니다.
하지만 직관적으로도 알 수 있듯이, 모델이 정상 구조를 스스로 잘 요약해야 하고 분포 추정도 안정적으로 되어야 하므로 최적화 난도가 높습니다.
여기까지가 넓은 의미의 anomaly detection입니다.
그런데 실제 분류 시스템에서는 여기서 조금 더 좁고 중요한 문제가 하나 더 생깁니다.
바로 OOD detection입니다.
그런데 OOD Detection은 왜 따로 이야기할까
OOD는 Out-of-Distribution의 약자입니다.
말 그대로 학습 분포 밖에 있는 샘플을 뜻합니다.
예를 들어 개와 고양이만 학습한 모델이 있다고 해보겠습니다.
테스트 시에도 개와 고양이만 들어오면 큰 문제가 없습니다.
하지만 돌고래 사진이 들어오면 어떨까요?
모델은 돌고래를 본 적이 없더라도, 결국 개나 고양이 중 하나를 골라서 높은 확률을 내놓을 수 있습니다.
바로 이 상황이 OOD 문제의 핵심입니다. 문서에서는 학습 데이터와 유사한 샘플을 in-distribution, 학습에 없던 분포의 샘플을 out-of-distribution이라고 설명하고, 개·고양이 분류기에 돌고래가 들어왔을 때 OOD 클래스로 따로 다뤄야 한다는 예시를 제시한다.
즉 OOD detection의 목적은
“정답 클래스를 더 잘 맞히는 것”이 아니라
“애초에 이 입력이 내가 아는 세계 바깥인지 먼저 판단하는 것”입니다.
이 차이는 생각보다 큽니다.
실제 서비스에서는 틀린 답을 자신 있게 말하는 모델보다,
모르는 입력에 대해 “이건 내가 학습한 범위를 벗어난 것 같다”고 경고하는 모델이 훨씬 신뢰할 만합니다. surveillance 환경에서도 기존에 보지 못한 새로운 이상 상황이 테스트에 등장할 수 있으므로 OOD detection이 중요하다고 설명된다.

OOD를 평가할 때 AUROC와 AUPR을 보는 이유
OOD detection은 결국 이진 판별 문제입니다.
주어진 입력이 in-distribution인지, out-of-distribution인지 나눠야 하기 때문입니다.
이때 가장 자주 보는 지표가 AUROC입니다.
threshold를 바꿔가며 true positive rate과 false positive rate의 관계를 그린 ROC curve 아래 면적을 보는 방식입니다.
랜덤 분류기라면 대각선에 가깝고, 좋은 알고리즘일수록 곡선이 왼쪽 위에 가까워집니다. 문서에서도 FPR과 TPR 정의, ROC curve의 의미, 그리고 AUROC가 클수록 좋은 이진 분류기라는 해석이 설명된다.
또 하나가 AUPR입니다.
precision-recall curve 아래 면적을 보는 방식인데, 클래스 불균형 상황에서 ROC보다 더 민감하게 차이를 볼 때 자주 함께 사용됩니다.
OOD에서는 무엇을 positive로 보느냐에 따라 해석이 조금 달라질 수 있어서, in-distribution 기준과 out-of-distribution 기준을 따로 보고하는 경우도 많습니다.
입문 단계에서는 너무 수식에 매달리기보다 이렇게 기억하면 됩니다.
- AUROC: 전체적인 분리 능력
- AUPR: 불균형 상황에서의 정밀한 분리 감각
가장 단순한 OOD 아이디어는 Maximum Softmax다
OOD detection의 출발점으로 가장 자주 소개되는 방법은 Maximum Softmax Probability입니다.
이 아이디어는 놀라울 만큼 단순합니다.
분류 모델이 어떤 입력에 대해 softmax 확률을 출력한다고 해보겠습니다.
in-distribution 샘플이라면 보통 특정 클래스 하나에 확률이 강하게 몰리는 경향이 있습니다.
반면 OOD 샘플은 확신이 덜하기 때문에 여러 클래스에 확률이 퍼질 수 있습니다.
그래서 softmax 결과 중 최댓값이 너무 작으면 OOD로 간주하는 방식입니다. 문서에서는 maximum softmax 값이 threshold 이하이면 OOD로 보는 baseline이 소개된다.
이 방법은 간단하고 빠르다는 장점이 있습니다.
모델을 새로 만들 필요도 없고, 기존 분류기의 출력만 이용하면 되니까요.
하지만 단점도 분명합니다.
딥러닝 분류기는 종종 과도하게 확신하는 경향이 있어서, OOD 샘플에도 높은 softmax를 줄 수 있습니다.
즉 “최대 softmax가 크다 = 반드시 in-distribution이다”라고 믿기 어렵습니다.
그래서 이후 방법들은 이 단순한 기준을 더 안정적으로 만들려는 방향으로 발전했습니다. maximum softmax 분포만으로는 in/out이 겹치는 부분이 많아 부정확할 수 있다는 설명도 이어진다.
ODIN은 왜 유명할까
OOD detection을 공부하다 보면 거의 반드시 만나는 이름이 ODIN입니다.
이 방법이 유명한 이유는 아이디어가 비교적 간단하면서도 baseline보다 확실히 좋아지는 경우가 많기 때문입니다.
ODIN의 핵심은 두 가지입니다.
첫째는 temperature scaling입니다.
softmax에 들어가기 전 logits를 TT로 나누어 분포를 다시 조정합니다.
이렇게 하면 maximum softmax 분포가 더 날카롭게 정리되면서, in-distribution과 out-of-distribution의 겹침이 줄어드는 방향을 기대할 수 있습니다. 문서에서는 temperature scaling이 maximum softmax 분포를 더 잘 분리하게 만들어 baseline보다 성능을 높인다고 설명한다.
둘째는 input preprocessing입니다.
입력에 아주 작은 perturbation을 주는데, softmax 점수가 더 커지는 방향으로 gradient를 이용해 조정합니다.
육안으로는 거의 구분되지 않는 작은 변화지만, 점수 분포에는 의미 있는 차이를 만들 수 있습니다. 문서에서는 softmax 확률을 높이는 방향의 gradient를 계산해 perturbation을 더하는 방식으로 설명한다.
결국 ODIN은
“softmax 최댓값을 그냥 쓰지 말고, 분포를 더 잘 분리되도록 손봐서 쓰자”
라는 발상으로 이해하면 됩니다.
자료에서는 두 기법을 적용한 뒤 최종 maximum softmax 값이 일정 threshold 이하이면 OOD로 판단한다고 정리하며, baseline 대비 성능이 크게 좋아지는 예를 제시한다.
Feature space를 보면 더 좋아질 수도 있다
Maximum softmax와 ODIN은 결국 최종 출력 확률을 이용하는 방식입니다.
그런데 어떤 연구들은 softmax보다 마지막 feature layer 자체가 더 좋은 단서를 준다고 봅니다.
그 대표가 Mahalanobis distance 기반 방법입니다.
아이디어는 분류기의 마지막 feature 공간에서 각 클래스의 분포를 가우시안처럼 보고, mean과 covariance를 이용해 샘플이 그 분포에서 얼마나 멀리 떨어져 있는지를 측정하는 것입니다.
즉 softmax 확률이 아니라, feature 자체가 학습 데이터 분포와 얼마나 어울리는지를 보는 방식입니다. 문서에서는 Mahalanobis distance를 데이터 분포를 고려한 거리 측정으로 설명하고, softmax 이전 마지막 layer의 feature에 대해 이 거리를 계산해 OOD detection에 사용한다고 정리한다. 또한 ODIN과 유사한 input perturbation을 함께 쓸 수 있고, softmax보다 feature space가 OOD detection에 더 유리할 수 있음을 보여준다고 설명한다.
이 흐름은 꽤 중요한 시사점을 줍니다.
OOD detection은 꼭 “출력 확률만 잘 보면 되는 문제”가 아니라,
모델 내부 표현 공간을 어떻게 해석하느냐의 문제이기도 하다는 점입니다.
Anomaly Detection과 OOD Detection은 어떻게 연결될까
여기까지 읽으면 아마 이런 생각이 들 수 있습니다.
“결국 둘 다 이상한 걸 찾는 거 아닌가?”
맞습니다. 둘은 확실히 닿아 있습니다.
실제로 문서에서도 OOD는 anomaly detection의 일종으로 볼 수 있다고 설명합니다.
다만 강조점이 조금 다릅니다.
Anomaly Detection은 더 넓은 개념입니다.
정상 패턴과 다른 드문 샘플을 찾는 문제 전반을 가리킵니다.
반면 OOD Detection은 보통
“여러 클래스로 학습된 분류기가, 학습 분포 밖의 입력을 구별하는 문제”
라는 문맥에서 더 자주 쓰입니다.
즉 anomaly 중에서도 특히 학습 분포 밖이라는 관점이 더 강한 문제라고 보면 됩니다.
그래서 실무에서는 두 용어가 겹쳐 쓰이기도 하지만,
어떤 모델을 전제로 하고 있는지에 따라 조금 더 정확한 표현을 고르는 편이 좋습니다.
- 감시 카메라에서 평소와 다른 장면을 찾는다 → anomaly detection
- 개/고양이 분류기에서 돌고래 입력을 거른다 → OOD detection
이 정도 감각으로 구분해두면 대부분의 글을 읽을 때 큰 어려움이 없습니다.
마무리하며
Anomaly Detection과 OOD Detection은 처음 보면 비슷해 보여도,
문제를 정의하는 기준이 조금 다릅니다.
하지만 두 문제 모두 결국은 같은 질문을 던지고 있습니다.
“이 입력은 내가 익숙하게 아는 데이터인가, 아니면 뭔가 낯선가?”
supervised anomaly detection은 정답이 있을 때 강력합니다.
semi-supervised는 정상만 가지고도 새로운 이상을 잡아보려는 방향입니다.
unsupervised는 라벨 없이 구조 자체로 이상을 찾으려는 시도입니다.
그리고 OOD detection은 학습된 분류기의 신뢰도를 높이기 위해, 학습 분포 바깥의 입력을 따로 식별하려는 문제입니다. 각 접근은 데이터 가용성과 문제 설정에 따라 장단점이 다르며, supervised는 학습이 쉽고 성능이 좋지만 데이터 취득이 어렵고, semi-supervised는 새로운 이상에 대응하기 쉽지만 supervised보다 불리할 수 있으며, unsupervised는 라벨 없이 가능하지만 최적화가 어렵다고 요약된다.
결국 중요한 것은 알고리즘 이름을 많이 외우는 일보다,
내가 풀고 싶은 문제가 “정상/이상 전체를 다루는 문제인지”,
아니면 **“학습 분포 밖을 걸러야 하는 문제인지”**를 먼저 구분하는 일 같습니다.
그 구분이 되면
왜 Deep SVDD가 필요한지,
왜 maximum softmax가 baseline으로 자주 등장하는지,
왜 ODIN과 Mahalanobis distance가 계속 언급되는지도 훨씬 자연스럽게 보일 겁니다.
'Study Archives > Deep Learning' 카테고리의 다른 글
| Vector DB (0) | 2026.03.21 |
|---|---|
| LangChain, RAG, Agent (0) | 2026.03.21 |
| Vision Tasks and Layers (0) | 2026.03.09 |
| Deep Learning Fundamentals (0) | 2026.03.09 |
| RGB-D 데이터에서 Depth Estimation과 Semantic Segmentation 이해하기 (0) | 2026.03.09 |