어떻게 하면 싱싱한 데이터를 모형에 바로 적용할 수 있을까? – Bayesian Online Leaning

예측 모형 운영의 문제점

Concept Drift

  • 예측 모델링이나 머신러닝 영역에서 쓰이는 용어로서 시간이 지나면서 예측 성능이 달라지는 목적변수의 통계적 특징을 의미함
  • 이런 특징은 시간이 지나면서 예측성능이 점차적으로 떨어지는 부작용을 일으킴

복잡한 사회 현상의 한 단면을 예측하자고 할 경우 사회현상에 대한 모든 변인을 고려해 모델링 하는 것은 불가능하기 때문에 이러한 실제 예측모형을 구축할때 점차적으로 성능이 달라지는 현상이 발생한다. 이런 현상은 대부분 피할 수 없는 것으로 판단되고 있으며 오히려 이러한 현상을 빠르지 인지하고 모형을 개선하는 방식으로 현상을 극복하곤 한다. 사실 이런 현상의 이면에는 overfitting이 존재하고 있다. 대부분 예측모델링에서 overfitting 때문에 시간이 가면 갈수록 예측모형의 성능이 하락하는데, 이를 피하기 위해 Concept Drift의 영향이 적은 변수들과 적은 수의 변수로 모델링을 하면서 좀더 Concept Drift의 영향을 줄이곤 한다.

이렇게 판단이 된다면 예측모형을 구축하는데 두가지 전략이 존재하는 것을 알 수 있다.

  1. Concept Drift의 영향이 적은 변수들과 적은 수의 변수들로 Robust한 모형을 구축해 운영한다.
  2. Concept Drift의 영향이 있던 없던 최대한 설명력이 좋은 변수들도 예측모형을 구축하고 성능이 떨어질 때마다 모형을 재 빌드한다.

1번의 경우 대부분의 예측모형을 구축하는 컨설팅 업체들이 접근하는 방식으로, 미션크리티컬한 모형에 주로 활용하는 방식이다. 2번의 경우 온라인 서비스에 관련된 예측 모형에 주로 사용된다. 예를 들면 검색 랭킹 모델이라든지 광고모델이 그렇다.

2번과 같은 방식으로 모형을 구축하고 싶다면, 이 또한 두가지 전략이 존재한다.

  1. 입력 변수가 되는 모집단의 성격이 바뀌는지 지속적으로 모니터링 하고 어느 한계점이 넘었을 경우 모형이 잘 동작하지 않을 것이기 때문에 모형을 재빌드 하는 방식
  2. 지속적으로 새로운 데이터를 모형에 적용해 모형이 항상 최신의 상태로 유지되기 하는 방식

2번 방법이 바로 online learning이며 이번 포스팅에서 주로 설명을 할 내용이다.

Fresh 데이터의 유용성

Facebook의 논문을 참고로 한다면 ‘설명력 있는 변수 발굴’ > ‘모형의 개선’ > ‘fresh 데이터’활용 순으로 모형 퍼포먼스에 기여한다고 이야기 하고 있다. 하지만 모형 성능 개선 이외의 모형의 관리 측면에서 접근한다면 fresh 데이터로 모형을 지속적으로 관리하고 유지하는건 큰 리소스 절감을 가져올 수 있다. 필자가 주목한 부분이 바로 이 부분이다. 이 논문이 인용한 MS의 논문과 여러 리소스를 참고해 온라인 러닝을 수행하는 알고리즘을 구현해 테스트 해봤다.

Bayesian online learning scheme for probit regression

파라메트릭 모형의 경우 모형이 투명해 왜 특정 결과나 나왔는지 살펴볼 수 있고, 원인을 파악할 수 있는 장점이 존재한다. 물론 이런 장점은 모형을 온라인으로 업데이트하는데 큰 장점으로 작용한다. 모형 내부가 어떻게 동작되는지 모르는데, 이를 정확하게 업데이트하는건 어찌보면 말도 안되는 것일 수 있다. 논문에서는 Probit Regression(이하 PR)을 기반으로 모형을 업데이트하는 방법을 제안하고 있는데, PR의 경우 흔히 잘 아는 Logistic Regression에서 링크함수를 cumulative density function으로 바꾼것으로 생각하면 된다. 두 모형의 퍼포먼스는 거의 동일하며 단지 논문에서는 업데이트 편의성 때문에 PR을 선택했다. 여기서 β 는 Φ의 steepness를 조절하는 파라메터이다.

위 식에서 가장 중요한 부분은 개별 신규 데이터가 들어올때 모수를 어느정도 업데이트할지에 대한 것이다. 이는 Λ로 표시했으며, 모형이 정확한 예측을 하면 Λ는 양수를 가지게 되며 그렇지 않다고 하면 Λ는 음수를 가지게 되며,불확실성을 의미하는 Σ를 분모로 둬 불확실성에 따른 업데이트 조절을 하게끔 유도했다. 그러니까 불확실성이 클 수록 변동량은 적어지게 유도하게 되고 반대의 경우 큰 변동량을 유도한다. 쉽게 이야기 하면 모수에 대한 큰 확신을 가지고 있을때 새로운 데이터에서 정답과는 정 반대의 예측결과가 나왔다면 큰 폭으로 모수를 조정하게 된다는 것이다. 이렇게 새로운 관측치를 기반으로 기존에 믿고 있던 모수를 업데이트하는 방식은 전형적인 Bayesian 방식이다.

이런 변동량이 주어졌다면 아래의 수식으로 각 모수의 평균과 분산을 업데이트한다.

,

그럼 위 식에서 \(v()\), \(w()\) 함수의 특징을 알아보자!

함수의 주 아이디어는 예측모형에서 나온 결과가 놀라운 결과가 아닐경우 모수 업데이트는 적게 되고 반대의 경우 많이 되는게 함수의 핵심 아이디어다. Λ가 음수이면 $v(Λ)$는 커지며, m도 큰 폭으로 변화됨, 반면 Λ가 양수일 경우 거의 업데이트가 되지 않는다.
표준편차 역시 Λ가 음수이면 $w(Λ)$는 커지며, σ도 큰 폭으로 변화됨, 반면 Λ가 양수일 경우 거의 업데이트가 되지 않는다.
이들 업데이트과정은 모든 변수에 적용이 되며 개별 변수는 기여 정도와 해당 변수 파라메터 분포에 따라 업데이트가 되거나 혹은 되지 않는다.
이 과정이 합리적인 이유는, 예를 들어 관측과는 다르게 잘못된 예측을 모형이 했다고 한다면, 어떤 변수에 대한 업데이트를 주로 하는게 합리적일까 라는 질문에 적절한 답을 해주기 때문이다. 물론 위 함수는 단순히 CTR예측 모형에 사용된 함수이기 때문에 목적에 따라 다른 값으로 교체가 가능하다.

위와 같은 업데이트 방식을 보자면 분산의 업데이트는 계속 값을 곱해주는 방식으로 수행되기 때문에 0에 수렴이 되게 된다.상식적으로 보자면 어떠한 메인 패턴 데이터가 엄청나게 많이 들어오게 되면 특정 모수에 수렴하게 되는게 당연하지만 이런 상황에서라도 suprising한 관측치가 올라올때 어느정도 이를 감안할 수 있는 정도의 유연성은 모형이 가지고 있는게 좋을 것이다. 칼만 필터의 경우 이러한 문제 때문에 특정 값을 강제적으로 분산에 더해주는 방식을 취하게 되는데 이렇게 될 경우 분산이 무한대로 갈 가능성이 있어 어떠한 관측치가 오더라도 쉽게 모수가 변화되는 현상을 유발 할 수 있게 된다. 논문에서는 이러한 문제를 해결하기 위해 각 모수별 초기 prior에 어느정도 관성을 가지게끔 아래와 같은 수식을 제안하고 있다.

위 수식의 주 아이디어는 과거 데이터에 대한 모형 효과를 점차적으로 잊게 만들기 위해 prior에 회귀하게 하는 방식을 활용한 것이다. ε이 커지면 빨리 잊어버리게 되고, 0이 되면 입력된 모든 데이터의 정보를 활용하게 된다.

BOPR(Bayesian online learning scheme for probit regression with R)

필자가 해당 과제 연구를 위해 BOPR 패키지를 구현했다. 현재 개발버전이여서 CRAN에 올리진 않았으나, github을 통해 아래와 같은 명령어로 설치가 가능하다.

install.packages('devtools')
library(devtools)
install_github('haven-jeon/BOPR')

그럼 ε에 대한 테스트를 해보자!

library(BOPR)
library(ggplot2)
library(pROC)

idx  <- sample(1:nrow(credit_approval))
first_train_set  <- credit_approval[idx[1:200],]
second_train_set  <- credit_approval[idx[201:400],]
test_set <- credit_approval[idx[401:690],]

bopr_mdl <- BOPR(A16 ~ A1 + A4 + A5 + A7 + A9 + A10 + A12 + A13 , first_train_set, epsilon = 0.03)
# test_set$pred_1  <- predict(bopr_mdl, test_set)[,1]
# ggplot(test_set, aes(pred_1)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.03")
# roc(test_set$A16, test_set$pred_1)

bopr_mdl_up  <- online_leraning(bopr_mdl, second_train_set)
## [1] "will added 3 features!"
test_set$pred_2  <- predict(bopr_mdl_up, test_set)[,1]
ggplot(test_set, aes(pred_2)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.03, with  online learning")

plot of chunk unnamed-chunk-1

roc(test_set$A16, test_set$pred_2)
## 
## Call:
## roc.default(response = test_set$A16, predictor = test_set$pred_2)
## 
## Data: test_set$pred_2 in 155 controls (test_set$A16 -1) < 135 cases (test_set$A16 1).
## Area under the curve: 0.8957
bopr_mdl <- BOPR(A16 ~ A1 + A4 + A5 + A7 + A9 + A10 + A12 + A13 , first_train_set, epsilon = 0.07)
# test_set$pred_1  <- predict(bopr_mdl, test_set)[,1]
# ggplot(test_set, aes(pred_1)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.07")
# roc(test_set$A16, test_set$pred_1)

bopr_mdl_up  <- online_leraning(bopr_mdl, second_train_set)
## [1] "will added 3 features!"
test_set$pred_2  <- predict(bopr_mdl_up, test_set)[,1]
ggplot(test_set, aes(pred_2)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.07, with  online learning")

plot of chunk unnamed-chunk-1

roc(test_set$A16, test_set$pred_2)
## 
## Call:
## roc.default(response = test_set$A16, predictor = test_set$pred_2)
## 
## Data: test_set$pred_2 in 155 controls (test_set$A16 -1) < 135 cases (test_set$A16 1).
## Area under the curve: 0.8696

테스트를 해보면, ε 이 커질수록 모형 Divergence가 좋아지는 것을 볼 수 있다. 이는 각 예측 확률값들의 분포가 극명하게 갈리게 되어 예측력이 좋아질 수 있다는 것을 의미할 수 있지만 AUC를 보면 실제 classification 관점에서는 테스트인 0.03의 경우와 비교해볼때 큰 성능향상을 있을거라 생각하기 어렵다. 반면 ε이 0.03을 가지는 경우 어떠한 예측값이든 모형이 변화가 되면 성능이 유연하게 바뀔 수 있을 가능성이 많다는 것을 알 수 있다. 물론 사용 목적에 따른 최적값은 발굴될 필요가 있다.

패키지 개발 방향

현재 패키지는 초기학습을 위한 함수와 온라인러닝을 위한 함수 그리고 예측함수로 크게 구성되어 있다. 앞으로 구현될 기능은 초기 모형에 없는 변수에 대해서 온라인 러닝시 적절한 판단을 수행해 모형에 적용하거나 빼는 Pruning기능과 각 변수의 prior를 개별적으로 설정할 수 있게 하고 Bayesian Probit Regression 파라메터로 셋팅하는 기능까지 구현할 예정이다.

생각들

실시간으로 생성되는 데이터의 종류와 양이 매우 많아지고 있고 이에따라 실시간 데이터 수집, 처리에 대한 플랫폼들은 상당히 많이 고민되어 왔다. 반면 이런 fresh한 데이터를 어떻게 바로 분석, 모델링에 활용할 수 있는지에 대한 논의는 생각보다 많이 되어 있지 않다. 학계에서는 그러한 데이터를 구하기 어려워서겠고, 업계에서는 검색이나 온라인 광고 등 사용자 행동에 따라 액티브하게 모형이 변화되어야 많은 수익을 올릴 수 있는 몇몇 분야에서나 연구가 그나마 되어 있는지도 모르겠다. 하지만 이 영역도 개인화나 IoT가 활성화 되면서 반드시 필요한 부분으로 부상할 것이라 예상해본다. 개인적인 관점에서는 현재 학계에서 유행하는 Deep Learning보다는 Online Learning에 대한 연구가 오히려 가까운 시점의 현업에서 더 활용도가 높지 않을까 하는 생각을 조심스래 해본다.

Reference

  • Com, R. M. (2010). Web-Scale Bayesian Click-Through Rate Prediction for Sponsored Search Advertising in Microsoft ’ s Bing Search Engine. Search, (April 2009), 13–20. Retrieved from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.165.5644&amp;rep=rep1&amp;type=pdf
  • He, X., Bowers, S., Candela, J. Q., Pan, J., Jin, O., Xu, T., … Herbrich, R. (2014). Practical Lessons from Predicting Clicks on Ads at Facebook. Proceedings of 20th ACM SIGKDD Conference on Knowledge Discovery and Data Mining – ADKDD’14, 1–9. http://doi.org/10.1145/2648584.2648589
  • Nicol, O., Mary, J., & Preux, P. (2012). ICML Exploration & Exploitation challenge: Keep it simple!, 26, 62–85. Retrieved from http://eprints.pascal-network.org/archive/00009618/

 

CC BY-NC 4.0 어떻게 하면 싱싱한 데이터를 모형에 바로 적용할 수 있을까? – Bayesian Online Leaning by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.