MCMC 수행 : jags / stan을 사용하거나 직접 구현


13

저는 베이지안 통계 연구를 처음 사용합니다. 베이지안 연구원들이 JAGS / Stan과 같은 도구를 사용하는 대신 MCMC를 스스로 구현하는 것이 더 좋다고 연구원들로부터 들었습니다. 학습 목적을 제외하고 MCMC 알고리즘을 R과 같이 "빠르지 않은"언어로 구현하면 어떤 이점이 있습니까?


그런 다음 자신의 제안 배포를 직접 선택할 수 있기 때문에 그 결과로 생성 된 Markov Chain이 가능한 빨리 사후에 수렴되도록 선택해야합니다.

감사! 유일한 이유입니까?
user112758

4
응용 프로그램에 Bayes를 사용하여 더 많은 Bayes를 배우려는 응용 연구원이라면 JAGS 또는 Stan으로 시작한 다음 필요에 따라 MCMC를 작성하는 것이 좋습니다. JAGS와 Stan의 장점과 한계는 약간 다릅니다.
공역 사전

감사! 예, 저는 응용 연구를하고 있습니다. JAGS와 Stan의 한계에 대해 좀 더 말씀해 주시겠습니까? 나는 Stan을 처음 시도했지만 방금 "온라인 모니터링"또는 "수렴 할 때까지 샘플"기능이나 추가 기능이 없다는 것을 알았습니다.
user112758

답변:


26

일반적으로 실제 적용되는 베이지안 분석을 위해 자신의 MCMC를 코딩 하지 않는 것이 좋습니다 . 이것은 좋은 작업과 시간의 거래와 둘 다 매우 가능성이 코드에서 버그를 소개합니다. Stan과 같은 블랙 박스 샘플러는 이미 매우 정교한 샘플러를 사용합니다. 날 믿어, 당신은 단 하나의 분석을 위해이 구경의 샘플러를 코딩하지 않을 것입니다!

이것으로 충분하지 않은 특별한 경우가 있습니다. 예를 들어 실시간으로 분석해야하는 경우 (예 : 들어오는 데이터를 기반으로 한 컴퓨터 결정) 이러한 프로그램은 좋지 않습니다. Stan은 C ++ 코드를 컴파일해야하므로 비교적 간단한 모델을 위해 이미 준비된 샘플러를 실행하는 것보다 시간이 더 오래 걸릴 수 있습니다. 이 경우 자신의 코드를 작성하는 것이 좋습니다. 또한 비 가우시안 상태 공간 모델과 같이 Stan과 같은 패키지가 매우 열악한 특수 사례가 있다고 생각 합니다. 이 경우 사용자 지정 MCMC를 구현하는 것이 좋습니다. 그러나 이것은 예외가 아니라 규칙입니다!

솔직히 말해서, 단일 분석을 위해 샘플러를 작성하는 대부분의 연구자들은 자신의 샘플러를 작성하기를 원하기 때문에 그렇게합니다. 최소한, 나는 그 범주에 속한다고 말할 수 있습니다 (즉, 내 자신의 샘플러를 작성하는 것이 최선의 방법이 아니라는 것에 실망합니다).

또한 단일 분석을 위해 자체 샘플러를 작성하는 것은 의미가 없지만 분석 클래스에 대한 고유 코드를 작성하는 것이 좋습니다.. JAG, Stan 등은 블랙 박스 샘플러이기 때문에 개선 정도는 모델에 따라 다르지만 항상 주어진 모델을 전문화하여 작업 속도를 높일 수 있습니다. 그러나 처음부터 매우 효율적인 샘플러를 작성하는 것은 경험, 모델 복잡성 등에 따라 10-1,000 시간의 작업 일 수 있습니다. 베이지안 방법을 연구하거나 통계 소프트웨어를 작성하는 경우에는 문제가 없습니다. 당신의 직업입니다. 그러나 상사가 "이봐,이 반복 측정 데이터 세트를 분석 할 수 있습니까?"라고 말합니다. 효율적인 샘플러를 작성하는 데 250 시간을 소비하면 상사가 화가납니다. 대조적으로,이 모델을 Stan에서 2 시간 안에 작성할 수 있었으며, 효율적인 샘플러가 달성 한 1 분 실행 시간 대신 2 분의 실행 시간을 가졌습니다.


3
+1. 또한 Stan은 불연속 배포와 관련된 일부 문제를 직접 처리하지 않으므로 그 자체가 단순하지 않은 이러한 통합을 통합하기에 충분히 알고 있어야하므로 자체 롤링이 도움이 될 수 있습니다. JAGS가 그러한 경우를 직접 처리한다고 생각하므로 BUGS / JAGS와 Stan의 다른 철학을 마음에두고 분리 할 수 ​​있다면 그 사이를 전환하는 것이 가장 좋습니다.
Wayne

더욱이 Stan은 대각선 유클리드 메트릭스가 후방의 기하학적 구조에 적합하지 않은 문제가있을 수 있습니다. 이것은 특히 확률이 높은 후부의 좁고 이상한 모양의 영역 만있는 경우에 해당됩니다. 그 결과 후방을 샘플링하는 것은 절벽 가장자리를 따라 자전거를 타는 것과 같습니다. 잘못 돌리면 "떨어질"수 있습니다!
Sycorax는 Reinstate Monica가

2
+1. 학생들에게 일반적인 권장 사항은 JAGS로 코드를 작성하는 것입니다. 그래도 문제가 해결되지 않으면 Stan에서 코드를 작성하십시오. 그래도 문제가 해결되지 않으면 자체 샘플러 작성을 시작하십시오. BUGS를 사용하려는 공간 모델과 같은 특정 모델도 있습니다. NIMBLE을 사용하려는 비 가우시안 상태 공간 모델과 같은 특정 모델. 자체 샘플러를 작성하여 시작하는 기회 비용이 너무 높습니다.
jaradniemi

"실시간"사례를 이해하지 못합니다. "이미 준비된"자체 샘플러를 사용할 수 있다면 이미 컴파일 된 Stan 모델을 사용하는 것이 쉽지 않은 이유는 무엇입니까? 또한 MCMC가 실시간 애플리케이션에 충분히 빠른지 궁금합니다.
Juho Kokkala

1
그리고 나는 새로운 모델을 정확히 컴파일해야하는 것이 무엇인지 아는 Stan에게는 충분히 익숙하지 않지만, 제한이 무엇이든 새로운 데이터가 들어 오면 모델이 더 복잡해질 것이라는 동적 모델이 있다고 상상하기 어렵지 않습니다. 다시 컴파일해야합니다. 매개 변수 공간이 샘플 크기에 따라 커지는 비모수 적 방법이 해당 기준에 부합한다고 생각합니까? 그러나 그 문제를 해결하는 영리한 방법이있을 수 있습니다.
Cliff AB

6

이 질문은 주로 의견에 근거한 것이지만 여기에 답을 적는 것으로 충분하다고 생각합니다. 연구 문제를 위해 자신의 샘플러를 코딩하는 데는 여러 가지 이유가있을 수 있습니다. 여기에 그들 중 일부가 있습니다

  1. 제안 : 의견에서 제안 된 fcop에서 샘플이 MH 인 경우 자체 샘플러를 코딩하면 제안 된 분포를 사용하여 최상의 혼합 샘플러를 얻을 수 있습니다.

  2. 유연성 : 내장 된 프로그램은 원하는 유연성을 제공하지 않을 수 있습니다. 특정 임의의 값에서 시작하거나 특정 시드 구조를 사용할 수 있습니다.

  3. 이해 : 자신 만의 샘플러를 코딩하면 샘플러의 동작을 이해하고 Markov 체인 프로세스에 대한 통찰력을 얻을 수 있습니다. 이것은 문제를 연구하는 연구원에게 유용합니다.

  4. Onus : 내가 모든 베이지안 추론을하는 데이터가 내가 코딩하지 않은 프로그램에서 온다면, 추론에 대한 책임은 더 이상 나에게 있지 않습니다. 연구원으로서 본인은 제시 한 방법 / 결과에 대해 전적으로 책임을지고 싶습니다. 내장 메소드를 사용하면 그렇게 할 수 없습니다.

더 많은 이유가있을 수 있지만, 이것이 나만의 샘플러를 코딩하게하는 네 가지 이유입니다.


6
"신뢰할 수있는"이유는 논란의 여지가 있습니다. Stan은 오픈 소스이고 많은 기고자를 보유하고 있기 때문에 여러 사람이 소스 코드를 보았으므로 심각한 버그가 없을 것입니다. 다른 한편으로, 당신이 스스로 그렇게한다면 당신은 항상 당신이 만든 버그를 간과 할 수 있습니다. 그리고 모든 사람들이 버그를 만들면 그것은 여러분이 작성하는 코드 줄 수의 문제 일뿐입니다 ...
Tim

@Tim 동의합니다. 나는 내가 말하려는 것을 반영하기 위해 그 시점을 바꿨다. 감사.
Greenparker

5
이해 주장에 +1. 그러나 Onus의 주장은 다소 과장된 것으로 보인다. 자신을 코딩하는 거의 모든 것은 다른 사람의 통계 언어, 선형 대수 라이브러리, 난수 생성기 등에 의존하므로 '책임'은 정도의 문제입니다.
공역 사전

@conjugateprior 절대적으로 동의했습니다. 그렇기 때문에 저의 대답은 첫 번째 사람이었습니다. 이것은 순전히 나의 의견이었습니다.
Greenparker

4

Cliff AB의 답변에 +1을주었습니다. 하나의 작은 tidbit를 추가하려면 코드 레벨 자체가 아닌 하위 레벨에서 작업하려면 LaplacesDemon 패키지 를 찾아야 합니다. 최초의 저자는 훌륭했지만 그리드를 벗어난 것으로 보이며 다른 사람이 패키지를 인수했습니다. (Github에 있다고 생각합니다.)

그것은 구현 인상적인 MCMC에 사용되는 알고리즘의 수와 포함 된 삽화는 당신이 패키지를 사용하지 않는 경우에도 읽을 가치가있다. 당신이 읽은 거의 모든 종류의 샘플러가 있습니다. BUGS / JAGS 또는 Stan과 다른 방식으로 코딩하며 모두 R로되어 있지만 종종 너무 효율적이기 때문에 경쟁력이 있습니다.


1
뻔뻔한 플러그 : [nimble] (r-nimble.org)을 사용하여 다시 작성할 필요없이 MCMC를 사용자 정의 할 수 있습니다 (예 :이 노드의 슬라이스 샘플러, 해당 노드 그룹의 블록 업데이터 등 사용). 이 샘플러는 매번 또한 직접 구현할 샘플러를 직접 작성할 수도 있습니다! 공개 : 나는이 프로젝트에서 일했다.
Cliff AB

@CliffAB : LaplacesDemon익숙한 경우 와 비슷 합니다. 들려서 다행 nimble입니다. 최소한 다운로드하겠습니다. (여러 가지 LaplacesDemon 비 네트는 민첩하게 사용하더라도 다운로드 할 가치가있을 수 있습니다.) ... 오, 그냥 페이지로갔습니다. SMC를 쉽게 사용할 수 있다면 큰 팬이 될 것입니다. 내가 본 유일한 R 패키지는 SMC가 끔찍하게 복잡합니다.
Wayne

@CliffAB :와, nimble웹 사이트를 읽은 후에는 꽤 인상적입니다. 내가 들어 본 적이없는 이유는 무엇입니까? BUGS / JAGS 모델링 언어에 익숙한 사람들에게 훌륭한 옵션 인 것 같습니다. 물론, 그들은 웹 사이트에서 가장 잘 비교할 수 있지만, 지금까지는 그것을 좋아합니다. (와 것을 제외하고 말입니다 rstanarmbrms후드 스탠를 사용하는, 편의성의 사용하기에-R 챔피언 스탠 될 것입니다.)
웨인

그것은 여전히 ​​매우 새롭습니다 : v0.1이 출시되었습니다 .2 년 전만 생각하십니까? 그리고 SMC는이 프로젝트에 큰 동기를 부여했습니다. PI는 입자 필터에 대한 상당한 게시 작업을 수행했으며 매번 처음부터 다시 작성하는 데 짜증이났습니다. 그러나 저는 SMC 샘플러의 현재 상태를 유지하기 위해 현재 작업에 약간의 노력을 기울였습니다. 내가 거의 2 년 전에 떠났을 때 우리는 아주 원시적 인 것을 모았습니다.
Cliff AB

1
arXiv 논문에 관심이 있으
Cliff AB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.