[Review] Deep SVDD
Anomaly detection 모형 중 하나인 Deep SVDD에 대해 다뤄보고자 합니다. 정상인 데이터를 0, 비정상인 데이터를 1로 label하여 binary classification의 형태로 detect하는 supervised 모형들과는 달리, SVDD 계열 모형들은 정상 패턴에 대해서만 학습한 뒤, 비정상을 분류한다는 점에서 Semi-supervised 모형으로 불리곤 합니다. 모형의 아이디어와 실제 파이썬에서의 실행 결과를 함께 리뷰해보도록 하겠습니다.
Ruff, Lukas, et al. “Deep one-class classification.” International conference on machine learning. PMLR, 2018.
Related work
One Class SVM (OC-SVM), Suppport Vector Data Description(SVDD)
앞서 이야기한 것처럼 Deep SVDD는 정상인 case들의 데이터만을 학습하여 비정상을 판별하는 모형입니다. 이러한 concept의 원조인 One class svm(OC-SVM), Support Vector Data Description(SVDD) 모형에 대해 먼저 살펴보도록 하겠습니다. 두 모형 모두 정상 패턴을 잘 학습해서 decision boundary를 정확히 형성하는 것이 목표인데요. 이 때 decision boundary의 모향이 OC-SVM은 hyperplane인 반면 SVDD는 hypersphere, 즉, 구 모양이라는 차이점이 있습니다. 논문에서도 이 두 모형은 상당히 유사하다고 언급하고 있습니다.
- One class svm (OC-SVM)
- Support Vector Data Description(SVDD)
- OC-SVM / SVDD 비교
Deep SVDD
앞서 OC-SVM과 SVDD는 SVM 등을 활용하여 각자의 decision boundary를 만들어냈습니다. Deep SVDD 또한 근본적으로 어떠한 decision boundary를 만들어내는 것은 동일하지만 그 만들어내는 방식에서 차이가 있습니다. 이름에서 힌트를 얻을 수 있는 것처럼 Deep SVDD는 Deep Learning 모형을 활용하여 정상 패턴을 학습하는데요. 바로 Auto Encoder를 활용합니다.
Auto encoder는 주로 이미지나 text에서 많이 사용되는 알고리즘인데, 주어진 input 변수의 핵심 특성을 학습하는 encoder 부분과 이를 통해 다시 데이터를 reconstruction하는 decoder부분으로 구성되어 있습니다. 위의 그림에서와 같이 고양이 그림을 보고 어떤 핵심 특성들(ex. 고양이 수염이나 귀, 몸통 모양 등)을 학습하고 이를 토대로 reconstruction하여 결과를 도출한다고 생각하시면 됩니다.
Deep SVDD에서 주목하는 부분이 바로 Auto encoder의 encoder부분에서 학습하는 Latent 정보입니다. 주어진 정상 패턴들의 핵심되는 정보만을 학습하여 구성할 수 있다면(예를 들어 더 작은 차원의 어떤 정보값으로 표현할 수 있다면) 이 것이 바로 decision boundary가 될 수 있다는 것이죠. 따라서 주어진 정상 패턴을 최대한 잘 reconstruction할 수 있는 Auto encoder를 학습 한 뒤, Auto encoder의 encoder에 쓰이는 weight로 decision boundary를 구성하여 추후 불량 패턴이 이 latent 정보와 얼마나 차이가 있는지를 비교하여 anomaly를 탐색하게 됩니다.
수식으로 살펴보면 좀 더 이해가 쉬울 것 같습니다.
\[\text{Deep SVDD objectives: } min_\omega \frac{1}{n}\sum^n_{i=1}||\phi(x_i, \omega)||^2+\frac{\lambda}{2}\sum^L_{l=1}||W^l||^2_{F}\]위 수식에서 c는 decision boundary의 central point, $\phi(x, \omega)$가 학습된 encoder입니다. (central point는 기 학습된 정상 패턴들의 latent 정보들의 평균으로 계산) 따라서 기존 정상 패턴의 특성 정보와 새로 들어온 x의 encoder 결과 값이 얼마나 차이가 나는 지로 anomaly score를 계산합니다. (비정상 패턴이라면 차이가 크게 나타나게 됩니다.)
\[\text{Deep SVDD anomaly score: } s(x) = ||\phi(x; \omega)-c||^2\]Code result
이 곳에 가면 pytorch 기반으로 작성된 Deep SVDD의 python 소스코드를 확인할 수 있습니다. 논문에서 소개되었던 MNIST 데이터를 기반으로 실험할 수 있도록 세팅되어 있습니다. 숫자 1의 이미지들만을 가지고 Auto encder를 학습한 뒤 이를 기반으로 다른 숫자 그림들을 anomaly로 판단할 수 있는지를 실험합니다.
파이썬 코드를 돌려보면 위와 같은 플랏을 얻을 수 있습니다. 하늘색은 정상(즉, 이 실험에서는 숫자 1의 MNIST input) 패턴의 anomaly score 분포를, 주황색은 비정상(숫자 1이 아닌 MNIST input) 패턴의 anomaly score의 분포를 나타냅니다. 확실히 하늘색의 경우 0 근처에 굉장히 많이 몰려 있어 anomaly score가 낮음을 확인할 수 있습니다. (정상이라는 이야기죠!) 반면 주황색들은 0 근처에 분포되어 있지 않고 anomaly score가 커지는 쪽으로 분포가 형성됨을 확인할 수 있습니다. Deep SVDD가 잘 학습된 결과라고 할 수 있겠네요!
Reference
- Paper: Ruff, Lukas, et al. “Deep one-class classification.” International conference on machine learning. PMLR, 2018.
- Blog: https://ys-cs17.tistory.com/92
- Blog: https://blog.naver.com/PostView.naver?blogId=winddori2002&logNo=222142873877&parentCategoryNo=&categoryNo=32&viewDate=&isShowPopularPosts=false&from=postView
- Blog: https://wsshin.tistory.com/3
- Gitgub: https://github.com/mperezcarrasco/PyTorch-Deep-SVDD
- Gitgub: https://github.com/lukasruff/Deep-SVDD-PyTorch