본문 바로가기

ML & DM/Bayesian ML

Bayesian machine learning

원문 : http://fastml.com/bayesian-machine-learning/


Beyesian machine learning


Bayes rule을 안다면, 어떻게 이것이 machine learning과 관련이 있을까? 이것은 어떻게 퍼즐 조각들이 딱 맞는지를 이해하는것은 꽤 어려울 것이다. 이 포스팅은 이에 대한 설명이다.


다음 글은 전문가적 입장에서 쓴 글이 아니기 때문에 부정확한 내용이 포함될 수도 있다. criticism은 언제나 환영이다.


1. Bayesian and Frequentists


기본적으로 Bayesian은 확률(probabilistic)을 말한다. 확률(probability)에 대한 2가지 접근이 있기 때문에 구체적 용어로 구별짓는다. Bayesian들은 probability를 믿음의 정도로써 생각을 한다. 그래서 probability는 주관적이고, 미래와 관련있다.


빈도론자들은 다른 견해를 가진다. 그들은 확률을 과거를 지칭하는데 사용한다. 이러한 방식에서는 probability는 객관적이고 누군가의 믿음에도 의존적이지 않다. 빈도론이라는 말이 바로 이 확률을 측정하는 방법에서 나온것이다. 예를들어 우리가 동전 한개를 100번 던졌다고 할때, head가 55번(빈도) 나왔다면, 그 빈도(head의 확률)는 0.55번이 된다. 


Frequentism 과 Bayesianism에 대해서는 따로 포스팅을 해보도록 하겠다.


Priors(사전), Updates and Posteriors(사후)


우리는 어떤것을 예측할때 믿음을 가지고 시작한다. 이러한 믿음을 우리는 사전확률(prior)이라고 한다. 그 다음 우리는 어떠한 데이터를 얻게되고 이것을  우리의 믿음을 업데이트 하는데 사용한다. 이 결과로 나온 믿음을 우리는 사후확률(posterior)이라고 부른다. 만약 훨씬 더 많은 데이터를 얻게 된다면, 이전의 사후확률은 새로운 사전확률이 되고 위의 과정이 반복된다.


이 프로세스에서 바로 Bayes rule을 사용한다.




는 B가 주어졌을때 A의 확률로 읽고, 조건부확률을 나타낸다. 즉 만약 B가 일어났을때 A가 일어날 확률을 말한다.


2. Inferring model parameters from data


Bayesian machine learning에서 우리는 데이터(D)로부터 모델 파라미터(theta)를 추론하기 위해, Bayes rule을 사용한다.



위식의 모든 요소들은 확률분포를 따른다.


p(data)는 우리가 일반적으로 계산할수 없는것이다. 그러나 이것은 단지 normalizing constant(일반화상수)이기 때문에, 중요하진 않다. 모델을 비교할때, 우리가 주로 theta가 포함된 표현식에 관심이 있고 p(data)는 각 모델에서 항상 같기 때문이다.


p(theta) 는 사전확률로 즉 모델의 파라미터들이 무엇이 될지에 대한 우리의 믿음이다. 이 문제에 대한 의견은 대부분 다소 불분명하다. 만약 우리가 충분한 데이터를 가졌다면, 사전확률은 그다지 크게 신경쓰지 않는다. 추론은 사전확률이 0가 아닌한 개연성 있는 theta로 수렴한다. 모수적 분포(빈도주의자들)에서는 이러한 사전확률이 정해진다. 이에 대한 자세한 설명은 이곳을 보라.


p(D | theta)는 모델의 파라미터가 주어졌을때의 데이터에 대한 우도를 말한다. likelihood에 대한 공식은 모델에 따라 다르다. 종종 모델의 평가에도 우도값을 사용한다. 실제 데이터에 높은 우도값을 주는 모델이 더 좋은 모델이다.


마지막으로 p(theta | D) 이다. 이는 사후확률이고, 가장 확률이 높은 예측치를 포함해, 이전의 믿음들과 데이터로 부터 얻은 모델 파라미터에 대한 확률이다. 


모델 선택은 모델 hyperparameter들을 고르는 것과 별개로 봐야 함을 명심해라. 실제로는 이 둘은 보통 같이 행동한다. 예를들면 validation에 의해.


3. Spectrum of methods


Bayesian의 종류에는 크게 2가지로 나뉜다. 첫번째는 statistic modelling 두번째는 probabilistic machine learning이다. 후자는 흔히 말하는 nonparametric approach(비모수적 접근)들을 담고 있다. 


4. Statistic modelling


Bayesian modelling은 데이터가 부족하고 귀중하고 얻기 어려울때 적용된다.  예를들어 사회과학 과 방대한 크기의 통제실험이 실행되기 어려운 다른필드에서 주로 이러한 모델이 쓰인다. 한 통계학자가 자신이 가진 적은 데이터를 사용하여 한모델을 미세하게 조정하고 있다고 상상해봐라. 이러한 환경에서, 당신은 이용가능한 input에 대한 최적의 사용을 하려 노력하지 않아도 된다. 또한 작은 데이터로, 불확실성을 정량화하는것이 중요하다. 따라서 이것은 정확히 Bayesian 접근법이 잘 먹히는 곳이다. (있는 데이터를 가지고 계속 업데이트를 반복해 최상의 사후확률을 얻어내므로 ,보통의 빈도론자들은 예를들어 중심극한원리를 가정하는데 이것은 데이터가 많다는 것이 대전제이므로 이러한 전제를 만족 못하기 때문에 빈도론자들이 가정한 모델들 보다 input이 들어올때마다 사전확률을 업데이트하는 베이지안적 방법론이 더 좋은 효과를 낼것.)


마지막으로, 우리가 후에 볼것이지만, Bayesian 방법론들은 계산적 비용이 크다. 이것은 또한 작은 데이터와 밀접한 관련이 있다.


맛보기로,  Data Analysis Using Regression Analysis and Multilevel/Hierarchical Models에 있는 examples를 보자. 이 책은 전부 linear model들에 대한 주제로 구성되어 있다. 이 주제들은 처음에는 독립변수없이 예측을 하고, 이후 한개씩 독립변수를 추가해가며 모델링을 한다.


이 고된 작업은, 컴퓨터가 데이터를 사용해 이로부터 자동적으로 배우게 하는 기계학습에서의 현 트렌드와는 정반대이다.


5. Probablistic machine learning


Bayesian을 probabilistic으로 바꿔보자. 이러한 관점에서, Probablistic ML은 다른 방법론들과 크게 다를바가 없다. 분류분석을 하는한, 대부분의 분류기들은 확률론적 예측을 할수 있다. 심지어는, Bayesian과 다소 대립관계인 SVM조차도.


그런데, 이러한 확률들은 한 분류기로부터의 믿음의 표현일 뿐이다. 확률들이 실제 확률들(참값)과 맞는지 아닌지는 완전히 다른 문제이다. (참값을 다루는 문제가 아니라 나의 사전믿음에 대한 사후믿음의 업데이트가 중점이기 때문) 이것을 우리는 calibration이라 한다.


신뢰구관들(Error bars)은 또한 다른문제이다. 당신은 이것을 회귀에서 관찰할 수 있다. 대부분의 일반적인 방법들은 오직 점추정들만 한다. 그러나 Bayesian 버전의 선형회귀 혹은 Gaussian process같이 Bayesian 방법론들은 불확실성 추정을 한다.



불행히도, 이것이 끝이 아니다. GP(Gaussian Process)같이 더 세련된 방법은 일반적으로 등분산성의 가정 즉 노이즈정도의 균등 하에 작동한다.

실제에서는, 노이즈는 밑에 그림처럼 이분산일것이다.



6. LDA


Latent Dirichlet Allocation (잠재 디리클레할당)은 데이터를 보고 이것을 정렬해주도록 하는 또다른 하나의 방법이다. 이것은 행렬 factorization 모델들, 특히 non-negative MF와 유사하다. 당신은 행은 Documents 열은 단어들로 그리고 각 원소들은 주어진 document에 있는 단어들의 수로 이루어진 Document-Term matrix가 있다. LDA는 이 n*d 크기의 행렬을 2개의 행렬(documents/topics(n*k) 그리고 topics/words(k*d))로 인수분해(factorize)시킨다. 


차이점은 원래의 행렬을 얻기위해 저 2행렬을 곱할수 없다는것이다. 그러나 적절한 행/열들의 합이 1이 되기 때문에, 한 document를 표본추출할수 있다. 처음 단어로, 첫번째 행렬에서 한 topic을 뽑고 그 다음에 (두번째 행렬) 그 토픽으로부터 한 단어를 뽑는다. 이 과정을 당신이 원하는 단어들의 수만큼 반복한다. 이것은 bag-of words representation임을 주의해라. 이것은 적절한 순차적 데이터는 아니다.


이것은 생성적(generative) 모델의 한 예이다. 이 모델은 모델 자체로부터 표본을 생성하거나 표본추출할수 있다는 말이다. 보통 분류기들은 이산적이다. 즉 분류기들은 x에 기반한 클래스들 사이에서, y를 바로 구별하는 p(y|x)를 모델링한다. 생성적모델은  x와 y의 결합분포(p(y,x))와 관련된다. 이것은 분포를 추정하는데 더 어렵다. 그러나 이것 p(y,x)을 통해 샘플링을 할수 있고 또한 p(y|x) 조건부확률을 얻을 수 있다.


7. Bayesian nonparametrics


정확한 정의는 없는 반면, 이 이름은 한 모델에서의 더 많은 데이터가 있을수록 파라미터들의 수가 더 많아 질수 있다는것을 의미한다. 이것은 알고리즘이 support vector들을 훈련 데이터로 부터 고르는 Support Vector Machine과 유사하다. nonparametrics의 예들은 Gaussian Process와 topic들의 수를 자동적으로 자체적으로 고르는 Hierarchical Dirichlet process version of LDA,가 있다.


8. Gaussian Processes


가우시안 프로세스는 다소 SVM과 비슷하다. 둘다 kernel을 사용하며 (근사치들을 사용하여 수년동안 방대하게 발전해온) 유사한 확장성(scalability)을 가진다. GP에 대한 일반식은 회귀분석을 하고 후에 분류를 덧붙인 것이다. SVM은 이와는 반대로 분류를 하고 후에 회귀선을 만든다. 또 다른 차이는 GP는 error bar들을 제공하는 완전한 확률론적 모델이나 SVM은 그렇지 않다.


GP에 대한 대부분의 연구는 유럽에서는 행복해 보인다. 영국은 더 사용하기 쉬운 GP를 만드는 것에 대해 흥미로운 연구를 했다. 그 프로젝트들중 하나가 Zoubin Gharamani이 이끄는 팀에 의해 발표된  automated statistician 이다.


상대적으로 인기 있는 GP의 적용은 Hyperparameter 최적화알고리즘이다. 차원이나 예제의 수에서 데이터가 작고, 보통 조정할 파라미터의 수가 적다. 각 예제는 타겟 알고리즘의 실행을 보여준다. 이는 몇시간에서 몇일이 걸린다. 그러므로 가능한 약간의 예제들을 가지고 좋은 결과를 내기를 원한다.


9. Model vs Inference


 추론(inference)은 모델의 파라미터를 어떻게 학습시켰나를 말해준다. 특히 bayesian 세계에서 model은 어떻게 훈련을 했느냐와는 분리된다. 

딥러닝을 생각해보자. Adam, RMSProp 또는 다른 최적화기법들을 사용하여 한 신경망을 훈련시킬수 있다. 그러나 이 최적화 기법들은 서로 비슷한 경향이 있다. 모두 약간 변환된 Stochastic Gradient Descent들이 된다. 반대로, 추정에 대한 Bayesian 추론방법들을은 서로 많이 다르다.


두가지 가장 중요한 방법들은 Monte Carlo Sampling과 Variational inference이다. sampling은 좋은 표준적방법이지만 느리다. The excerpt from The Master Algorithm 는 MCMC에 가깝다.


Variational inference는 정확도를 속도와 바꾼 방법이다. MCsampling 보다는 빠르나 정확도가 떨어진다.  단점은 이것은 모델에 따라 이 성능이 바뀐다는 것인데, 이것의 해결책이 다음 software section에 있다.


10. Software


베이지안 소프트웨어중 요즘 가장 눈에 띄는 것은 아마 Stan일 것이다. Stan은 확률론적 프로그래밍언어이다. 어떤 베이지안 모델이든 지정하고 훈련시킬수 있다. 이것은 Python, R 그리고 다른 언어들에서 실행된다. Stan은 NUTS 라는 modern sampler를 가진다.


Stan에서의 대부분의 계산은 Hamiltonian Monte Carlo, HMC를 사용한다. HMC는 몇가지 tuning이 필요한데, Matt Hoffman이 새로운 알고리즘, NUT (the 'NO-U-Turn Sampler')를 만들었다. 이 알고리즘은 HMC를 Adaptively 최적화시킨다. 많은 환경에서, NUTs는 사실상 최적의 static HMC보다 더 계산효율적이다.


한가지 흥미로운 사실은 이것이 automatic variational inference 라는 것이다. Variational inference는 approximate Bayesian inference에 대한 scalable techinque이다. 파생된 variational inference 알고리즘은 tedious model-specific calculation이다. 따라서 이것은 자동화시키기 어렵다. 우리는 automatic variational inference 알고리즘 혹은 automatic differentiation variational inference(ADVI)를 제안한다. 사용자는 오직 한 Bayesian model과 데이터셋만 있으면 된다. 다른것은 필요없다.


이 테크닉은 small-style modelling을 적어도 medium-size 데이터에 적용시키는 기반을 마련했다.


Python에서는 가장 인기있는 패키지인 pyMC가 있다. 그닥 많이 뛰어나진 않지만(개발자들이 Stan을 따라하는것 처럼 보인다.), 여전히 좋다. pyMC는 NUTS 와 ADVI가 있다. 여기에 minibatch ADVI example이 있는 notebook이 있다. 소프트웨어는 백엔드로 Theano를 사용한다. 이것은 순종python보다 빠르다.


Infer.NET은 확률론적 프로그래밍을 위한 마이크로소프트의 라이브러리이다. 이것은 주로 C#이나 F#같은 언어에서 사용가능하다. 그러나 명백히 .NET의 Ironpython으로부터 부를수도 있다. Infer.net은 기본적으로 expectation propagation을 사용한다.


위의 것들을 제외하고도,  다른 확률론적 프로그래밍 언어로부터 LDA실행에 특화된 것까지 다양한 종류의 베이지안 컴퓨팅을 실행하는 수많은 패키지들이 있다. 흥미로운 한가지 예제는 CrossCat이다.


CrossCat은 고차원 데이터 테이블을 분석하기 위한 domain-general한 베이지안 방법이다. CrossCat은 계층적, 비모수 베이지안 모델에서 approximate inference을 통해 데이터의 테이블에 있는 변수들에 대해 완전결합분포를 추정하고 모든 결합분포들에 대해 효율적인 표본들을 제공한다. CrossCat은 비모수적 혼합모델링장점과 베이지안 네트워크 구조학습을 결합한다. 이것은 잠재적 변수를 가정하는것으로 충분한 데이터가 주어졌다는 가정하에 어떠한 결합분포토 모델링 할수 있으나 또한 관찰가능한 변수들간의 독립성들을 찾을 수도 있다.