자신의 실수를 개선하면서 조금씩 똑똑해지는 anomaly detection 모델을 만들 수 있을까?

글쓴이 Inforience 날짜

클릭 >> Hello, world !! (from ShadowEgo)

기본적인 anomaly detection 과정은

지난 포스트 [1][2]에서는 정상적인(normal) 기계 진동 데이터와 비정상적인(anomaly) 기계 진동 데이터가 확보된 상황에서, 학습모델로 하여금 normal 데이터의 특성을 학습하게 한 뒤에, 새로 입력되는 데이터에서 anomaly 데이터를 탐지하도록 하는 개념을 소개하였다. 해당 포스트들에서 소개한 실험결과를 통해 우리가 구현한 anomaly 탐지 모델이 좋은 결과를 보여줄 수 있음을 확인하였으나, 이러한 개념을 실제 현장에서 활용하기 위해서는 normal 데이터를 충분히 모아서 학습시켜야 한다는 한계가 있다. 예를 들어, 기계 제품을 생산하는 공장에서 생산품의 동작 진동 데이터를 통해 불량 여부를 판단하려 하거나, 생산 설비의 동작 상태를 소음 데이터를 통해 모니터링하고자 할 때, normal 상태의 학습용 데이터를 최대한 많이 확보해야 할 필요가 있는 것이다. 또한 normal 상태의 특성이 다양하거나 normal 상태의 내부 특성에 변화가 생길 경우 적응할 수 없다는 한계가 있다. (학습 모델은 초기에 학습한 특성에만 전적으로 의존하게 된다.)

조금씩 똑똑해지는 모델을 구현하려면.

그렇다면, 학습 대상이 되는 초기 normal 데이터가 많지 않을 경우에는 학습 모델로 하여금 anomaly를 잘 탐지하도록 할 수 없는 걸까? 더 나아가, 초기 데이터의 양이 작으면, 아무래도 normal 데이터에 대한 모든 특성을 한번에 학습할 수 없을 테니, 초기에는 정확도가 불만스럽더라도, 계속 새롭게 확보하게 되는 normal 데이터의 특성을 지속적으로 학습 모델에 제공하여 모델이 점점 더 똑똑해지게 할 수는 없을까?

그림 1. 학습 모델의 업데이트 프로세스 개념도.
초기 학습 데이터를 기반으로 만들어진 모델은 지속적으로 사용자와 상호작용하면서 점점 똑똑해질 수 있다.

이러한 모델을 구현하기 위해서는 초기 학습 모델이 출력한 판단 오류(ex: normal 데이터를 anomaly로 판단하는 오류)에 대한 정보를 학습 모델에 알려주어야 하며, 학습 모델은 자신이 범한 오류가 다시 나타나지 않도록 업그레이드되어야 한다. (그림 1 참조) 이를 위해, 사용자가 초기 모델의 판단 오류를 학습 모델에 알려주는 상황을 가정해 볼 수 있다. 예를 들어, 초기 모델이 anomaly로 판단한 데이터를 사용자가 직접 확인한 뒤, 판단이 틀린 결과에 대해서는 해당 데이터가 normal 데이터임을 학습 모델에 알려주는 것이다. 학습 모델은 사용자가 알려준 오류 정보를 기반으로 자신의 실수를 보정하기 위한 업데이트 프로세스를 수행해야 하며, 이러한 과정을 빠른 시간 안에 끝내서 사용자가 관여해야 하는 수고를 최대한 덜어줄 필요가 있다.

가벼운 업데이트, 약간 깊은 업데이트, 그리고 깊은 업데이트

인포리언스는 학습 모델의 업데이트 프로세스를 여러가지 종류로 구분하여 적용하고 있다. 업데이트의 종류는 학습 모델이 업데이트 과정에서 얼마나 커다란 변화를 겪는가에 따라 구분한다. 가벼운 업데이트는 업데이트에 관여하는 파라메터의 수가 작아 업데이트 과정에 소요되는 시간이 짧다는 장점이 있는 대신 업데이트의 효과가 제한적일 수 있다는 한계가 있으며, 깊은 업데이트는 업데이트에 상대적으로 많은 시간이 소요되지만 효과가 제대로 반영될 가능성이 커진다는 장점이 있다. 이것은 시험기간 동안에만 벼락치기로 공부한 효과와 장기간에 걸쳐 우직하게 공부한 효과가 다르다는 점에 비유될 수 있지 않을까 한다.

실험 개념

본 포스트에서는, 가장 가벼운 업데이트와 약간 깊은 업데이트를 수행해 본 결과를 소개한다. (각 업데이트 과정에 적용한 구체적인 알고리즘은 추후에 소개하도록 한다.) 사용자가 일정 기간 동안 학습 모델의 판단 오류를 보정해 주면 점차적으로 정확도의 목표치를 달성하고, 최대한 빨리 목표치를 달성하며, 일단 목표치를 달성한 후에는 정확도가 목표치 이하로 다시 내려오지 않도록 하는 것이 목적이다. 실험 과정의 개념은 다음과 같다.

  • 지난 포스트[2]와 동일한 데이터를 활용한다.
  • 학습과 테스트 과정이 빠르게 수행될 수 있도록 가벼운 모델과 feature를 활용한다. (1-Dimensional Variational Autoencoder (VAE) & RMS) (지난 포스트[2]를 참조)
  • Normal 데이터를 여러 그룹으로 나누어 단계별로 입력한다.
  • Anomaly로 잘못 판단된 테스트 데이터를 normal로 재태깅하여 학습 모델에 재입력한다. (사용자가 수행할 오류 보정 과정을 모델링)
  • 학습모델은 재입력된 데이터를 기반으로 스스로 내부 파라메터를 업데이트한다.
  • 테스트 정확도의 목표치는 ROC AUC 값이 0.95 를 나타낼 때로 설정한다.
  • 테스트 정확도의 목표치에 도달하면 사용자는 더 이상 오류를 보정하지 않는다.

이번 포스트를 위한 실험과정에서는 전체 normal 데이터(235개) 중에서 아주 작은 일부에 해당하는 20개를 랜덤으로 선택하여 초기 학습 데이터로 활용하였으며, 각 단계에서 입력할 테스트 데이터에는 normal 데이터와 anomaly 데이터를 각각 20개씩 역시 랜덤으로 선택하여 포함시켰다. 각 단계에서 테스트가 완료된 후에는 anomaly로 잘못 판단된 normal 데이터를 normal 로 태깅(보정)하여 학습 모델이 자신을 스스로 업데이트하는 과정에 활용하도록 하였다.

실험 결과

그림 2. 가벼운 업데이트를 적용했을 때의 성공 케이스와 실패 케이스

그림 2는 각 단계에서 사용자가 보정해 준 오류를 바탕으로 학습 모델이 가벼운 업데이트 과정을 수행했을 때의 결과를 나타낸다. 그림 2-(a)와 2-(b)는 업데이트가 잘 이루어져서 단계가 진행됨에 따라 테스트 정확도가 상승한 케이스를 나타낸다. 3번째 단계에서부터 정확도 목표치를 달성하였고, 이후의 단계에서도 계속 목표치를 웃도는 결과를 보여주었다. 그러나, 이러한 경우에 못지 않게 그림 2-(c) 또는 그림2-(d)와 같은 결과들도 많이 관찰되었는데, 단계가 진행되어도 정확도가 상승하지 않거나, 목표치까지 정확도가 상승하지 못한 경우들이다. 이 결과를 통해, 가벼운 업데이트가 효과적인 경우도 존재하기는 하지만, 늘 그렇다고 볼 수는 없다는 잠정적인 결론을 내릴 수 있다. (물론, 다른 종류의 데이터와 학습 모델을 활용하게 되면 완전히 다른 결과를 얻게 될 수 있음에 유의해야 한다.)

그림 3. 약간 깊은 업데이트를 적용했을 때의 성공 케이스

그림 3은 약간 깊은 업데이트 과정을 수행했을 때의 결과를 나타낸다. 정확도 목표치를 이른 단계에서 달성하였고, 실험을 반복하여도 비슷한 패턴의 결과를 지속적으로 보여주었다. 이 결과를 통해, 약간 깊은 업데이트 과정을 적용할 경우에는 학습모델이 빠르게 발전하여 목표치의 성능을 갖추게 할 수 있음을 확인하였다. (물론, 모든 데이터와 학습 모델에 대해서도 이러한 결과를 동일하게 얻을 수 있다고 일반화하면 안된다.)

Future works

본 포스트에서는 인포리언스가 연구개발한 가벼운 업데이트 및 약간 깊은 업데이트 알고리즘을 활용하면 점차적으로 똑똑해지는 anomaly detection 모델을 구현할 수 있다는 가능성을 간단한 실험 결과를 활용하여 제시하였다. 실험 결과를 통해 가능성을 확인하였지만, 이 포스트에서 제시한 결과가 절대적인 것은 아니며, 다양한 데이터와 학습 모델에 적용하여 검증해 볼 필요가 있다. 인포리언스는 사용자 또는 환경과 상호작용하면서 점점 스마트해지는 학습 모델을 구현하는 것과 관련된 다양한 연구를 계속 진행하고 있으며, 관련된 주요 연구문제를 해결해 가고 있다.

References