머신 러닝

머신 러닝[머신러닝 코세라 강의] (9주차) "Anomaly Detection/Recommender System" (이상징후 탐지 / 추천시스템)

마빈 Marvin 2022. 8. 18. 09:11

 

Anomaly Detection

 

Density Estimation

Problem Motivation

Anomaly detection (이상징후 탐지) 예시로, 비행기 엔진의 특징 두가지로 열 (heat) 과 진동 (vibration) 수치가 있다고 하자. 모형 $p(x)$ 를 구한 후에, $x_{test}$ 가 있을 때, 확률이 특정값 이하면 이상 징후로 예측하고, 특정값 이상이면 이상 징후가 아닌 것으로 예측한다. 

Gaussian Distribution

가우시안 분포는 일명 정규분포라고 하기도 한다. 가우시안 분포를 잘 안다면 스킵해도 괜찮다. $x \sim N(\mu, \sigma^2)$. 평균과 표준편차를 데이터로부터 추정할 수 있다. 

Algorithm

지난 시간에 배운 가우시안 분포를 이상징후 탐지에 적용한다. $x_1, x_2, ...$ 가 정규분포를 따르고 서로 독립이라고 할 때, $p(x) = p(x_1; \mu_1, \sigma_1^2 ) p(x_2; \mu_2, \sigma_2^2 ) p(x_3 ; \mu_3, \sigma_3^2) ... p(x_n ; \mu_n , \sigma_n^2) $

$= \Pi_{j=1}^n p(x_j ; \mu_j , \sigma_j^2)$ 

$p(x)$ 를 구하는 방법은 $p(x_j; \mu_j ; \sigma_j^2) = \frac{1}{\sqrt{2\pi}\sigma_j} \exp(-\frac{(x_j - \mu_j)^2}{2 \sigma_j^2})$ 으로 두고, $p(x) < \varepsilon$ 일 때 이상징후가 감지되었다고 결정한다. $(x_1, x_2)$ 평면에 $p(x)$ 를 구해서 3D 형태로 나타낼 수 있다. $\varepsilon = 0.02$ 라 할 때, 특정 $(x_1, x_2)$ 값에 대한 이상징후 여부를 판단할 수 있다. 비슷한 방법으로 $(x_1, x_2)$ 평면에 등고선을 그래서 이상징후가 되는 구간을 그릴 수 있다. 

 

Building an Anomaly Detection System

Developing and Evaluating an Anomaly Detection System

이상징후 감지 모델을 평가하는 방법에 대해서 다룹니다. 이상/정상에 대한 데이터가 가지고 있다고 합시다. Training 데이터에는 $x$ 에 대한 값들만 있습니다. Cross-validation 데이터에는 $x_{cv}, y_{cv}$ 값이 있습니다. 그리고 테스트 데이터에는 $x_{test}, y_{test}$ 값들이 있습니다. ($x$ 값들을 training 데이터, cross-validation 데이터, 테스트 데이터로 나누는 것 같고, training 데이터에는 $y$ 가 포함되지 않는 것 같습니다.) 예를 들어, 비행기의 엔진 이상여부를 판별한다고 합시다. 10,000 개의 정상 엔진과 20 개의 비정상 엔진이 있다고 합시다. 정상 엔진을 6,000, 2,000, 2,000 개의 training 데이터, CV 데이터, test 데이터로 나누고, 비정상 엔진은 10개 씩 CV 데이터와 test 데이터에 나눕니다. 트레이닝 데이터에서 $p(x)$ 모델을 추정합니다. 이후 CV 데이터에서 $p(x) < \varepsilon$ 이면 비정상으로 예측합니다. 가능한 평가 측정치는 true positive, false positive, false negative, true negative 이나, precision/recall, $F_1$-score 입니다. 또한, cross validation 데이터를 이용해서 파라미터 $\varepsilon$ 을 추정할 수 있습니다. 

Anomaly Detection vs. Supervised Learning

이상징후 감시 (anomaly detection) 방식은 실현되는 값 ($y=1$)이 극히 드물 때 사용합니다. 반면에, supervised learning 은 실현 값과 비실현 값이 모두 많을 때 사용합니다. 그리고 이상징후 감시의 경우에는 이상징후의 "종류(types)"가 다양할 때 사용합니다. 반면에 supervised learning 은 실현값의 갯수가 많아서 실현값의 특징을 알고리즘이 학습하기 쉬울 때 입니다. 

Choosing What Features to Use

어떤 특징을 사용할 지에 대해서 다룹니다. 데이터의 히스토그램을 보았을 때 가우시안 분포가 아니라면, log 를 사용합니다. 또는 $\log(x+c)$ 또는 $x^\alpha$ 형태를 사용하기도 하는데, 이 때 $c, \alpha$ 는 파라미터입니다. 파라미터를 변경하면서 분포가 가우시안에 가까운지 비교해볼 수 있습니다. 한편, 하나의 특징 ($x_1$) 으로 이상징후를 감지하지 못한다면, 새로운 특징 ($x_2$)이 그 이상징후를 잘 설명하는지 확인해볼 수 있습니다. 데이터 간에 나누거나 곱하거나 제곱하는 방법을 통해서 새로운 특징을 만들 수 있습니다. 

 

Multivariate Gaussian Distribution (Optional)

Multivariate Gaussian Distribution

다변량 정규 분포는 각 특징들을 따로따로가 아니라 한 번에 고려하는 방식이다. 예를 들어, $x_1, x_2$ 변수가 있을 때 $p(x_1), p(x_2)$ 를 따로 구하는 것이 아니라, $p(x;\mu, \Sigma) = \frac{1}{ (2\pi)^{\frac{n}{2}} | \Sigma|^{\frac{1}{2}} } \exp ( -\frac{1}{2} (x - \mu)^T \sum^{-1} (x-\mu)  ) $ 다변량 정규 분포의 장점은 두 변수 간의 correlation 을 정해줄 수 있다는 점이다. 

Anomaly Detection using the Multivariate Gaussian Distribution

이번 시간에는 다변량 정규 분포를 이용해서 이상징후감지에 응용한다. $\mu = \frac{1}{m} \sum_{i=1}^m x^{(i)}$ 를 추정한 후 $\Sigma$ 을 구하는 공식에 삽입한다. 그리고 두 값을 활용하여 $p(x)$ 를 구하고 $p(x) < \varepsilon$ 이면 비이상징후로 판단한다. 이전 모델과 다변량 정규 분포에서 covariance matrix 의 off-diagonal 이 아닌 원소가 0인 경우이다. 변수들 간에 상관관계가 존재하는 경우에는 상관관계가 존재하는 변수들을 그래프화해보면 상관관계를 볼 수 있다. 이전 모델에서는 변수들 간에 상관관계가 있는 경우에는 해당 변수들의 조합으로 새로운 변수를 만들어야 한다. 하지만 다변량변수의 경우에는 변수들 간에 상관관계가 고려된다. 다만 계산에 시간이 많이 걸린다. 

 

Recommendation System

Predicting Movie Ratings

Problem Formulation

아마존, 넷플릭스 등 빅테크 회사에서 중요하게 생각하고 개선하고 싶은 머신러닝 방법론은 추천 시스템입니다. 추천 시스템은 알고리즘이 자체적으로 특징들 (feature) 를 배웁니다. 예를 들어, 영화 추천 시스템을 생각해 봅시다. 유저가 영화를 별점을 주었는지 (0,1 값), 그리고 했다면 별점 (0, 1, ... 5) 을 기록합니다. 추천 시스템에서는 별점이 없는 경우를 다른 값들을 통해서 추정합니다. 

Content Based Recommendations

추천 시스템의 첫번째 방법에 대해서 배웁니다. 영화 예에서 각 유저에 대한 영화 별점이 있고, 각 영화에 대한 특징이 있습니다. 영화의 특징이나 로맨스/액션 등과 같은 장르가 될 수도 있습니다. 각 유저에게 특징만큼의 파라미터 벡터를 추정합니다 (파라미터 벡터는 일종의 각 특징들에 대한 가중치 역할을 하는 것 같네요). 특정 유저의 파라미터는 추정치와 실제값의 차이의 제곱의 합의 평균이 최소화되는 방식으로 추정합니다. 이 때, regularization 파라미터를 넣습니다. 이 때, 영화 별점을 준 개수는 상수이기 때문에 제외해도 됩니다. 모든 유저들에 대해서 구해야하기 때문에 제곱합과 resgularization 항의 합이 최소화되도록 합니다. Gradient descent 형태로 업데이트를 할 수 있습니다. 이러한 방식은 각 콘테츠에 대한 정보가 있다고 가정합니다. 하지만, 현실에서는 이러한 영화의 특징들을 전부 알지 못합니다. 다음 섹션에서는 특징에 대한 정보가 없을 때 유저의 행동으로부터 특징에 관한 정보를 추정하는 방법을 다룹니다. 

Collaborative Filtering

Collaborative Filtering

각 영화들의 특징을 알기 위해서는 비용이 듭니다. 각 영화의 특징을 모르더라도 특징들을 추정하는 방법이 Collaborative Filtering 입니다. 우선 각 유저들의 영화 장르에 대한 선호를 안다고 해봅시다. 이후에 영화에 대한 별점을 알게 된다면, 영화의 특징을 추정할 수 있습니다. 알고리즘을 만들 때는 추정한 별점과 실제 별점의 차이의 합을 최소화하되, regularize 항인 $x_k^{(i)}$를 추가합니다. $x -> \theta -> ...$를 반복을 통해서 찾습니다.

Collaborative Filtering Algorithm

이전에 $x$ 와 $y$ 를 반복과정을 통해서 풀 수 있다고 하였습니다. 이번 시간에는 이를 바로 푸는 방법에 대해서 다룹니다. 추정한 별점의 제곱의 합을 regularize 항들을 추가한 상태에서 최소화하는 $x$ 와 $\theta$ 를 구합니다. 구체적으로 구하는 알고리즘은 다음과 같습니다. $x$ 와 $\theta$ 의 최초값을 랜덤화된 작은 값으로 둡니다. 다음으로 gradient descent 를 최소화하는 $x_k^{(i)}$ 와 $\theta_k^{(i)$ 를 업데이트 합니다. 특징 $x$ 와 유저의 파라미터 $\theta$ 가 있는 경우에는 별점을 예측할 수 있습니다. 

Low Rank Matrix Factorization

Vectorization: Low Rank Matrix Factorization

유저가 하나의 프로덕트를 보았을 때, 다른 어떤 프로덕트를 추천해줄 지에 대해서도 생각해볼 수 있다. 추정된 별점을 행렬 형태로 표현할 수 있는데, 특징($X$) 벡터와 특징 벡터 ($\Theta$) 의 곱으로 표현이 가능하다. 이를 "Low rank matrix factorization" 이라고 부른다. 각 영화에 대해서 그 영화의 특징을 알아내었다고 할 때, 두 영화가 관련인지 알기 위해서는 두 영화의 특징의 차이가 작은지 찾아보면 된다. 어떤 영화와 가장 유사한 5개의 영화를 알아본다고 할 때, 두 영화의 특징의 차이가 가장 작은 경우를 찾으면 된다. 

Implementational Detail: Mean Normalization

추천 시스템을 적용하는 마지막 디테일에 대해서 다룬다. 만약 어떤 유저가 영화의 별점을 모두 하지 않았다고 하자. 그런 경우에는 아무 특징이 없기 때문에 $\theta = 0$ 라는 크게 도움이 되지 않는 결과가 도출된다. "Mean normalization" 하기 위해서 이미 존재하는 별점들의 평균을 먼저 구한다. 그리고, 평균을 원래 점수에서 뺀다. 그러면 각 영화들의 별점 평균 점수가 0이 된다. 이 행렬을 새로운 행렬로 $\theta$와 $x$ 를 학습한다. 그렇게 하면, 알고리즘에 의해 각각의 영화에 대해서 평균 점수들이 도출된다.