..

Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery 리뷰

AnoGAN 리뷰

강병규

오늘은 Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery를 읽고 간단하게 리뷰해보고자 합니다 특별히 어려운 내용이 있는 논문은 아니니까 가볍게 읽어보시면 될 것 같습니다! 들어가기 전에 DCGAN에 대해서 알고 계시는 편을 추천합니다. 이 글을 참조하세요

Anomaly Detection

본격적인 설명에 앞서 Anomaly Detection에 대해 간단히 설명해보고 넘어가려고 합니다. 우리가 흔히 생각하는 Outliar를 떠올리시면 되는데요, 일반적인 데이터의 분포에서 벗어나는 값(혹은 이미지 등)을 찾아내는 것을 목표로 합니다. 여기서는 GAN을 사용한 방법을 알아보지만 이외에도 많은 방법들이 있습니다.

예를 들어 생각해봅시다. 고차원의 데이터를 작은 차원의 embedding 값으로 축소시킨다고 하면 아마 Anomaly와 정상적인 데이터는 분리되어 있지 않을까요? 다차원 공간에서 Anomaly는 일반적인 데이터와 분리되어 있기 때문에 우리가 Anomaly라고 부르는 것이니까요. PCA같은 것을 사용하면 아마 이러한 방식으로 아웃라이어를 제거할 수 있겠죠. 아니면 저차원의 embedding을 다시 고차원으로 되돌리면서 발생하는 reconstructing error를 비교할 수도 있을 것입니다. 이러한 예시에는 VAE나 AE를 사용한 방법을 꼽을 수 있습니다. VAE은 데이터를 압축하고(Encoding), 압축한 벡터로부터 다시 원래의 데이터를 만들어내는(Decoding) 과정을 거치면서 학습이 진행되는데요, 만약 비정상적인 데이터가 들어왔다고 했을 때, VAE는 이 데이터를 제대로 reconstructing, 즉 다시 만들어내지 못할 것입니다. 이 error를 통해서 데이터가 정상적인지를 판단하는 것이지요. 더 궁금하신 분은 이 논문을 한번 읽어보시는 것도 좋을 것 같습니다.

AnoGAN

DCGAN에 대해 읽어보셨다면 아시겠지만 DCGAN에서 주목할만한 점 중 하나는 “walking in the latent space”입니다. GAN이 잘 학습되었다고 했을 때, $z$는 데이터들을 잘 압축하고 있다고 생각할 수 있습니다. $z$의 값들을 연속적으로 변화시키면 이에 맞춰 생성되는 이미지도 연속적으로 변화하는 것이지요. 앞에서 얘기했던 VAE를 사용한 방식과 유사한 부분이 있다는 것을 아시겠나요? 잘 학습된 GAN이 있다고 쳤을 때 우리가 가진 데이터들은 $z$의 차원, manifold에 적절히 mapping되어있다고 생각할 수 있는 것입니다.

제일 먼저 정상 데이터들을 사용해서 일반적인 DCGAN을 학습시킵니다. 만약 GAN이 수렴했다면, 정상 데이터의 latent space, 혹은 manifold를 적절하게 만들어냈다고 생각할 수 있겠죠.

screenshot 2018-01-30 at 22 55 16

walking in the latent space, 노이즈 $z$의 값을 연속적으로 변화시키면 생성되는 이미지 또한 연속적으로 변화한다.

이제 남은 일은 query, 궁금한 데이터를 넣어 이를 판단하는 과정입니다. 근데 잠깐, VAE는 Anomaly를 직접 넣어서 나오는 결과를 비교해보면 된다지만, GAN은 이미지를 어떻게 할 수가 없습니다. $z \to x$로 가는 것은 $G(z)$를 통해 가능하지만 $x \to z$는 $G$와 $D$만으로는 불가능하다는 말입니다. 그래서 여기에서는 $x \to z$로 바로 가는 것이 아니라, 최대한 $x$와 비슷한 이미지를 $z$를 사용해 만들어내고자 합니다. 이를 위해서는 최적의 $z$를 알아야하겠죠. 이는 아래의 과정을 통해 구합니다.

먼저 학습과정에서 사용한 분포 $p_z$에서 임의의 노이즈 $z_1$을 뽑아내고 $G(z_1)$을 만들어냅니다. 이렇게 만들어낸 이미지에서 loss를 정의하고, $z_1$의 coefficients 를 업데이트합니다(주의! 뽑아낸 노이즈 $z_1$ 자체를 바꾸지는 않습니다!) 이렇게 만들어 낸 값이 $z_2$가 되고, … 이러한 과정을 일정 시간 반복한 다음에 $x$와 $G(z_{\Gamma})$가 얼마나 유사해졌는지를 판단하고 Anomaly 여부를 결정하는 것입니다. 이때 이 과정은 $G$와 $D$의 parameter들은 고정한 상태에서 진행됩니다. 결과적으로 우리가 궁금한 데이터 query가 정상 데이터라면 latent space로의 mapping이 가능하겠지만 Anomaly라면 아마 불가능하겠죠. 여기서 loss의 차이가 발생할 것입니다.

자 그래서 어떻게 Loss를 정의해야할까요?

Residual Loss

Residual Loss는 만들어낸 이미지와 우리가 판단하고자 하는 데이터, query 간의 유사도를 의미합니다. 이는 아래의 식으로 표현할 수 있습니다.

\[\mathcal{L}_R(z_\gamma) = \sum{\left| x - G(z_\gamma) \right|}\]

라고 표현할 수 있게 됩니다. 우리가 정말 완벽한 G를 갖고 있어서 latent space로 완전한 대응이 가능하다면 정상 이미지 $x$가 들어왔을 때 $x$와 $G(z_\gamma)$는 동일할 것이고, 따라서 Residual loss는 0이 될 것입니다.

Discrimination Loss

$G$만 쓰기에는 뭔가 아깝죠. $D$를 사용해서도 loss를 하나 정의합니다. $D$의 역할은 데이터를 보고 가짠지 진짠지 판단하는 것이죠. 이를 조금 다른 말로 표현해보면 $D$는 학습 데이터의 분포를 파악하는 역할을 한다고 생각할 수 있습니다. 결국 여기서 정의하는 Discrimination loss는 우리가 만들어내는 이미지 $G(z_\gamma)$가 manifold 혹은 데이터의 분포에 잘 위치하도록 페널티를 부과하는 역할입니다. 정의해보면

\[\mathcal{L}_D(z_\gamma) = \sum{\left| f(x) - f(G(z_\gamma)) \right|}\]

가 되는데요, $f$는 discriminator의 중간 레이어에서의 결과값입니다. 특이한 점은 $D$의 최종 출력인 0과 1 사이의 scalar 값을 사용하지 않았다는 점인데요, 중간 레이어에서의 결과값이 더 풍부한 표현력을 가지고 있기 때문이라고 논문은 설명합니다.

최종 loss는 이 둘을 합쳐

\[\mathcal{L}(z_\gamma) = (1-\lambda) \cdot \mathcal{L}_R(z_\gamma) + \lambda \cdot \mathcal{L}_D(z_\gamma)\]

로 표현합니다. 이때 주의해야하는 점은 $z$의 coefficients 를 업데이트한다는 것입니다. $G$와 $D$의 파라미터들은 고정된 상태입니다.

위의 loss를 바탕으로 일정 시간 동안 $z$의 계수들을 업데이트합니다. 그리고나서 마지막으로 loss를 구한다음, 이 loss가 특정값 미만이면 정상, 특정값 이상이면 비정상으로 판단하게 됩니다. 낮은 loss는 입력과 유사한 데이터를 학습 과정에서 봤고, manifold에 적절한 매핑이 가능하다는 의미지만, 높은 loss는 적절한 매핑을 찾는데 실패했다는 의미로 해석할 수 있습니다.

논문에서는 $z$의 계수를 업데이트하는 과정을 500번 수행하였고 $\lambda$는 0.1로 설정하였습니다.

Conclusion

전 과정을 요약해보면, 우선 가장 먼저 정상 데이터들로 DCGAN을 학습시킵니다. 그 다음에는 Anomaly를 판단해야하는데요, $p_z$에서 $z$를 뽑고, $z$의 계수를 업데이트하는 과정을 일정($\Gamma$) 거친 다음, 이 $z$로부터 query data $x$가 다시 만들어지는지를 판단합니다. 즉 정상 데이터의 latent space로 적절하게 매핑이 되는지 여부를 통해 데이터의 정상여부를 판단하는 것이지요. 실제로도 꽤 괜찮은 성능을 보여줬다고 논문은 주장합니다.

Reference

Anomaly Detection with GANs

Unsupervised Anomaly Detection with GANs to Guide Marker Discovery