Path: blob/master/site/ko/probability/examples/Modeling_with_JointDistribution.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Licensed under the Apache License, Version 2.0 (the "License");
공동 분포를 사용한 베이지안 모델링
JointDistributionSequential
은 사용자가 베이지안 모델의 프로토타입을 빠르게 만들 수 있도록 새롭게 도입된 분포형 클래스입니다. 여러 분포를 함께 연결하고 람다 함수를 사용하여 종속성을 도입할 수 있습니다. GLM, 혼합 효과 모델, 혼합 모델 등과 같이 일반적으로 사용되는 많은 모델을 포함하여 중소 규모의 베이지안 모델을 구축하도록 설계되었습니다. 사전 예측 샘플링 등 베이지안 워크플로에 필요한 모든 기능이 지원됩니다. 다른 더 큰 베이지안 그래픽 모델 또는 신경망에 플러그인할 수 있습니다. 이 Colab에서는 일상적인 베이지안 워크플로를 위해 JointDistributionSequential
을 사용하는 방법의 몇 가지 예를 보여줍니다.
종속성과 전제 조건
빠르게 처리하세요!
시작하기 전에 이 데모에 GPU를 사용하고 있는지 확인하겠습니다.
확인하려면 'Runtime'-> 'Change runtime type'-> 'Hardware accelerator'-> 'GPU'를 선택합니다.
다음 코드 조각은 GPU에 대한 액세스 권한이 있는지 확인합니다.
참고: 어떤 이유로 GPU에 액세스할 수 없는 경우에도 이 colab은 계속 동작합니다(훈련은 더 오래 걸림).
JointDistribution
참고: 이 분포 클래스는 간단한 모델만 있는 경우에 유용합니다. "간단한"이란 사슬 모양의 그래프를 의미합니다. 이 접근 방식은 기술적으로 단일 노드에 대해 차수가 최대 255개인 모든 PGM에 대해 작동합니다(Python 함수는 최대 이 정도의 인수를 가질 수 있기 때문).
기본적 개념은 사용자가 PGM의 모든 정점에 대해 하나씩 tfp.Distribution
인스턴스를 생성하는 callable
목록을 지정하도록 하는 것입니다. callable
은 목록에 있는 인덱스만큼 많은 인수를 가질 것입니다. (사용자의 편의를 위해 인수는 생성의 역순으로 전달됩니다.) 내부적으로 모든 이전 RV의 값을 각 callable에 전달하여 단순히 "그래프를 탐색"할 것입니다. 그렇게 하면 [확률의 연쇄 법칙]이 구현됩니다(https://en.wikipedia.org/wiki/Chain_rule_(probability)#More_than_two_random_variables): ParseError: KaTeX parse error: Expected '}', got '&' at position 33: …_i^dp( x_i|x* {&̲lt;i}).
아이디어는 Python 코드처럼 매우 간단합니다. 요지는 다음과 같습니다.
JointDistributionSequential
의 docstring에서 더 많은 정보를 찾을 수 있지만 요지는 목록의 일부 분포가 다른 업스트림 분포/변수의 출력에 의존하는 경우 클래스를 초기화하기 위해 분포 목록을 전달한다는 것입니다. 람다 함수로 래핑하면 됩니다. 이제 어떻게 작동하는지 봅시다!
(강력한) 선형 회귀
PyMC3 문서 GLM: 이상값 감지를 사용한 강력한 회귀의 내용
기존 OLS 모델
이제 간단한 절편 + 기울기 회귀 문제인 선형 모델을 준비해 보겠습니다.
그런 다음 모델의 그래프를 확인하여 종속성을 확인할 수 있습니다. x
는 마지막 노드의 이름으로 예약되어 있으며 이를 JointDistributionSequential 모델에서 람다 인수로 확신할 수 없습니다.
모델에서 샘플링하는 것은 매우 간단합니다.
...tf.Tensor의 목록을 제공합니다. 이것을 즉시 log_prob 함수에 연결하여 모델의 log_prob를 계산할 수 있습니다.
흠, 뭔가 잘못되었습니다. 스칼라 log_prob를 얻어야 합니다! 실제로 그래픽 모델에서 각 노드의 log_prob
를 제공하는 .log_prob_parts
를 호출하여 문제가 있는지 추가로 확인할 수 있습니다.
...마지막 노드가 iid 차원/축을 따라 reduce_sum이 아닌 것으로 나타났습니다! 따라서 합계를 수행할 때 처음 두 변수는 잘못 브로드캐스트됩니다.
여기서 트릭은 tfd.Independent
를 사용하여 배치 형상을 재해석하는 것입니다(축의 나머지가 올바르게 축소되도록).
이제 모델의 마지막 노드/분포를 확인하겠습니다. 이제 이벤트 형상이 올바르게 해석된 것을 볼 수 있습니다. reinterpreted_batch_ndims
를 올바르게 얻으려면 약간의 시행 착오가 필요할 수 있지만 항상 쉽게 분포 또는 샘플링된 텐서를 출력하여 형상을 다시 확인할 수 있습니다!
기타 JointDistribution*
API
MLE
이제 추론을 할 수 있습니다! 옵티마이저를 사용하여 최대 우도 추정을 찾을 수 있습니다.
배치 버전 모델 및 MCMC
베이지안 추론에서는 일반적으로 MCMC 샘플로 작업해야 할 것입니다. 샘플이 뒤쪽에 있을 때 기대치를 계산하기 위해 임의의 함수에 연결할 수 있기 때문입니다. 그러나 MCMC API에서는 배치 친화적 모델을 작성해야 하며 sample([...])
을 호출하여 모델이 실제로 '배치 처리 가능'하지 않은지 확인할 수 있습니다.
이 경우 모델 내부에 선형 함수만 있으므로 비교적 간단합니다. 형상을 확장하는 것이 방법입니다.
몇 가지 검사를 수행하기 위해 log_prob_parts를 다시 샘플링하고 평가할 수 있습니다.
몇 가지 참고 사항:
모델의 배치 버전으로 작업하려고 하는데, 이것이 다중 체인 MCMC에서 가장 빠르기 때문입니다. 모델을 배치 처리된 버전으로 다시 작성할 수 없는 경우(예: ODE 모델)
tf.map_fn
를 사용하여 log_prob 함수를 매핑하면 동일한 효과를 거둘 수 있습니다.이제
scaler_tensor[:, None]
을 수행할 수 없으므로mdl_ols_batch.sample()
이 이전에 스케일러가 있는 것처럼 작동하지 않을 수 있습니다. 여기서는tfd.Sample(..., sample_shape=1)
을 래핑하여 스케일러 텐서를 1순위로 확장하는 것이 해결책입니다.하이퍼 파라미터와 같은 설정을 훨씬 쉽게 변경할 수 있도록 모델을 함수로 작성하는 것이 좋습니다.
No-U-Turn Sampler를 사용하는 MCMC
스튜던트-T 방법
지금부터는 항상 모델의 배치 버전으로 작업합니다.
순방향 샘플(사전 예측 샘플링)
MLE
MCMC
계층적 부분 풀링
PyMC3 Efron과 Morris(1975)의 선수 18명에 대한 야구 데이터에서 가져왔습니다.
순방향 샘플(사전 예측 샘플링)
다시 말하지만, Independent를 사용하지 않으면 잘못된 batch_shape를 가진 log_prob로 끝나게 된다는 점에 주목하세요.
MLE
tfp.optimizer
의 매우 놀라운 기능은 시작점의 k 배치에 대해 병렬로 최적화하고 stopping_condition
kwarg를 지정할 수 있다는 것입니다. 이것을 tfp.optimizer.converged_all
로 설정하여 동일한 최소값을 찾는지 확인하고 tfp.optimizer.converged_any
를 사용하여 로컬 솔루션을 빠르게 찾습니다.
LBFGS는 수렴되지 않았습니다.
MCMC
복잡한 변환이 있는 모델의 경우, 기능적 스타일로 구현하면 작성과 테스트가 훨씬 쉬워집니다. 또한 입력된 데이터의 (미니 배치) 조건을 지정하는 log_prob 함수를 프로그래밍 방식으로 훨씬 쉽게 생성할 수 있습니다.
변이 추론
JointDistribution*
의 매우 강력한 기능 중 하나는 VI에 대한 근사치를 쉽게 생성할 수 있다는 것입니다. 예를 들어, meanfield ADVI를 수행하려면 그래프를 검사하고 관찰되지 않은 모든 분포를 정규 분포로 바꾸기만 하면 됩니다.
Meanfield ADVI
또한 tensorflow_probability/python/experimental/vi의 실험적 기능을 사용하여 아래에서 사용된 것과 본질적으로 동일하지만 무한 공간이 아닌 원래 공간에서 근사 출력을 가진 논리(예: JointDistribution을 사용하여 근사값 빌드)인 변이 근사값을 빌드할 수 있습니다.
FullRank ADVI
전체 순위 ADVI의 경우, 다변량 가우스를 사용하여 사후값을 근사화하려고 합니다.
베타-베르누이 혼합 모델
여러 검토자가 일부 항목에 레이블을 지정하고 알려지지 않은 (진정한) 잠재적 레이블을 사용하는 혼합 모델입니다.