몬테카를로 적분을 할 때의 문제는 적분하고자 하는 함수가 다른 함수들이 서로 곱해진 형태로 만들어지는 것입니다. 당신이 몇몇 부분을 개별적으로 importance sample 하는 방법을 알고 있을 수도 있지만, 당신은 궁극적으로 어떤 것이 importance sample인지 선택해야 합니다, 왜냐하면 당신이 선택한 것에 따라 난수를 생성하기 때문입니다.
렌더링에서, 보통 서로 곱해지는 세가지는 라이팅, 머터리얼 그리고 비지빌리티(이것이 그림자를 만듬)입니다. 라이팅과 머터리얼은 보통 당신이 importance sample 하는 것입니다. 라이트의 타입에 기반(spherical area light 같은) 그리고 머터리얼 모델(PBR macrofacet BRDF 같은)을 기반으로 하지만 비지빌리티는 보통 importance sample 하기 불가능합니다. 왜냐하면 픽셀에서 라이트가 보이지는 아닌지 여부는 장면의 지오메트리에 따라 전적으로 결정되기 때문입니다.
만약 당신이 라이팅 기반 importance sample을 한다면, 머터리얼이 결과에 미치는 영향이 더 중요하게 되는 상황에서는 좋지 않은 결과를 얻을 수 있습니다. 비슷하게, 당신이 머터리얼을 기반으로 importance sample을 한다면, 라이팅이 결과에 미치는 영향이 더 중요하게 되는 상황에서는 좋지 않은 결과를 얻을 수 있습니다.
Multiple importance sampling은 선택할 필요가 없는 방법입니다, 그리고 그 둘의 장점을 얻을 수 있습니다. 더 일반적으로, 그것은 당신이 N 개의 서로 다른 importance sampling 기술을 조합할 수 있게 합니다.
TL;DR
설명으로 들어가기전에, 당신이 2개의 importance sampling 기술이 있는 경우, 여기에 실제로 어떻게 balance heuristic을 사용하여 1개의 MIS sample을 얻는 것이 있습니다:
F는 적분될 함수입니다. PDF1 / InverseCDF1 은 첫번째 importance sampling 기술입니다. PDF2 / InverseCDF2 는 두번째 importance sampling 기술입니다. 당신이 반복문에서 이것을 N 번 수행하고 N 개의 추정치를 평균내면, 최종 추정치를 얻을 수 있습니다.
패턴을 따라하면 더 많은 기술로 일반화 할 수 있습니다. 각 샘플링 기술은 고유한 x, y를 생성합니다. 각 샘플링 기술은 다른 pdf들 각각에 x 값을 전달하고 그 것들의 pdf를 계산합니다. y 값을 x 값에 대한 각 pdf들의 총합으로 나뉘어진 값이 추정치입니다.
알아둘 점은 만약 F 함수의 일부가 비싸다면 (비지빌리티를 위한 레이트레이싱 같은!) 당신은 각각의 샘플에 대해 그렇게 할 필요는 없습니다. 당신은 위와 같이 라이팅에 머터리얼이 곱해진 추정치를 얻을 수도 있습니다, 그리고 그들을 조합한 다음, 비지빌리티 텀을 곱하기 위해서 레이트레이싱을 수행할 수 있습니다.
MIS Explained
랜덤하게 x 값을 생성하고 해당 x에서 함수 값을 계산하고 이것을 해당 x값을 선택하는 PDF 값으로 나누는 몬테카를로 추정기로 부터 단일 샘플 값을 얻을 수 있습니다.
Estimate = f(x) / PDF(x)
난수의 pdf (histogram)의 모양이 당신이 적분하려는 함수의 모양과 비슷해 지면, 더 적은 샘플로 실제 정답에 더 가까운 추정치를 얻을 수 있다는 것을 기억하고 있을 것입니다. 이것은 importance sampling 이라 불립니다.
당신이 함수 f에 함수 g가 곱해진 것을 적분하려고 한다고 해봅시다. 그리고 당신은 f 함수의 모양과 g 모양의 난수를 생성할 수 있다고 합시다. 그러나 이 함수의 모양이 f 와 g가 서로 곱해진 모양은 아니라고 합시다.
당신도 알고 있듯이 당신은 f 나 g 를 기반으로 importance sample 을 선택할 수 있습니다, 그러나 상황에따라서 그 선택은 더 좋거나 더 나쁠 수 있습니다. 때로는 f를 원할 때도 있고, g를 원할때도 있습니다.
이들을 조합하기 위한 가장 간단한 방법은 그냥 각 샘플을 둘다 사용하고 그들을 평균내는 것입니다. 또한 당신은 짝수 샘플에는 f로 importance sample을 하고, 홀수에는 g로 importance sample 할게 할수도 있습니다. 이것은 각 기술에 0.5로 가중치를 부여하는 것과 같습니다.
우리는 더 잘할 수 있습니다!
우리는 f를 기반으로 importance sample 하기 위해 x 값을 만들 수 있습니다, 그리고 g를 기반으로 importance sample 하기 위해서 다른 x 값을 만들 수 있습니다, 그리고나서 우리는 각각 x의 PDF 값들을 계산할 수 있습니다.
만약 우리가 좋은 importance sampling PDF들을 갖고 있다면, 더 높은 PDF 값들은 더 높은 품질의 샘플을 의미합니다, 반면에 더 낮은 PDF 값은 더 낮은 품질의 샘플을 의미합니다. 아래에 보는 것 처럼 그것의 품질에 기반하여 샘플에 가중치를 줄 수 있는 방법을 이제 갖고 있습니다. 아래에서는 샘플 'A' 에 대해서 계산합니다. 샘플 'B' 도 같을 것입니다.
WeightA = PDFA(xa)/(PDFA(xa)+PDFB(xa))
이것은 “balance heuristic” 라고 불립니다. 대체할 수 있는 다른 휴리스틱도 있습니다. 그것은 Veach's 의 논문(링크 섹션에서)과 그 이후로 나온 다른 MIS 논문들에서 읽을 수 있습니다.
마지막 섹션에 있는 코드에서 본 것과 같은 형식입니다, 거기서 우리는 최종 추정치를 얻기 위해서 샘플 B를 갖고 더해줬습니다.
당신은 왜 샘플 A와 B를 서로 더하는지 궁금할 수 있습니다... 평균을 내야하지 않을까요?
마지막 공식의 분모를 보면 두개의 PDF가 서로 더해집니다. 각각의 PDF의 기대값은 1입니다, 그래서 분모의 합계의 기대값은 2가 됩니다. 즉, 추정치는 그것이 되어야 할 값의 절반이 된다는 것입니다. 지금까지 일어난 모든 일은 평균내기 위해서 2로 나누는 대신, 그것들을 더하기 전에 미리 암묵적으로 2로 나누었다는 뜻입니다. 우리는 두 샘플을 여전히 평균내고 있습니다. PDF는 샘플마다 다르기 때문에 이것은 정확히 평균화되지 않습니다, 그러나 대체로, 여전히 unbiased 조합이기 때문에 여전히 올바른 답을 얻을 수 있습니다.
만약 세개의 PDF가 연관된다면, 가중되어진 샘플은 1/3 크기여야 합니다, 그리고 그 세개를 더해야 합니다.
만약 네개의 PDF가 연견된다면, 가중되어진 샘플은 1/4 크기여야 합니다, 그리고 그 네개를 더해야 합니다.
그것은 어떠한 관련된 importance sampling 기술의 수에도 일반화됩니다.
One Sample MIS
만약 당신이 나처럼 확률적(stochastic) 렌더링에 팬이라면, 당신은 모든 샘플링을 수행해야 하는지 궁금할 것입니다. 또는 만약 당신이 한개를 확률적으로 선택하여 가중할 수있고 그것으로 올바른 결과를 더 적은 작업으로 얻을 수 있는지 궁금할 것입니다.
예, 당신은 실제로 이것을 할 수 있으며 Veach's 의 논문에 9.2.4 섹션에서 그는 이것을 “One-Sample Model”이라 부릅니다.
이 경우, 각 샘플에 대해서 가중치를 계산하고 각각의 가중치를 가중치들의 합으로 나누어 특정 샘플을 얻을 확률을 얻습니다.
난수를 하나 만들고 추정치에 기여할 단일 샘플을 선택합니다, 당신은 몬테 카를로 추정치에 해당 항목을 선택할 확률을 곱해야 합니다. 함수의 다른 부분을 importance sampling 하는 여러 PDF를 사용하는 몇가지가 남아있습니다, 그러나 각 샘플은 F 에서만 구해집니다. F 를 구하는데 많은 비용이 드는 경우 유용합니다.
만약 당신이 weight1, weight2 그리고 weight1chance로 확장한다면, 당신은 당신은 몇 가지 소거할 수 있는 것을 찾을 것이고 실제 계산할 추정치를 위해서는 아래와 같이 남을 것입니다. 나는 이것이 왜 잘 작동하는지 직관적으로 설명할 수 없다는 것을 인정해야만 합니다, 그리고 실험적으로 확인했습니다. 만약 설명이 있다면, 댓글을 남겨주세요!
Piecewise Importance Sampling
Multiple importance sampling은 특정 함수를 샘플링 하기 위해서 여러개의 importance sampling 기술의 조합하는 방법입니다.
흥미로운 점은 관련된 모든 PDF가 전체 함수를 모두 다루는 것은 아니라는 것입니다.
내가 의미하는 것은 당신이 오직 왼쪽 절반 영역에서만 샘플링되는 PDF와 다른 오른쪽 절반 영역에서만 샘플링되는 PDF를 가질 수 있다는 것입니다.
첫번째 기술을 위한 inverse CDF 는 적분할 함수의 왼쪽 절반의 x 값만 생성합니다, 그리고 PDF는 함수의 오른쪽에 있는 값에 대해서 0을 제공합니다.
두번째 기술은 그 반대입니다.
MIS는 이것에 대해 조금도 신경쓰지 않을 것입니다. 만약 당신이 함수의 부분들에 잘 맞는 PDF를 만들 수 있지만 전체 함수에 잘 맞는 PDF를 만들 수 없다면, 이것은 정상적으로 작동하며 당신이 함수를 각각 importance sample 하게 합니다.
Veach의 논문은 다른 것들에도 적용됩니다. 예를들어 다른 기술에 다른 표본수를 부여할 수도 있습니다. 그것은 확실히 읽어볼 가치가 있습니다!
먼저 우리는 이 y = sin(x) * sin(x) 함수를 0에서 pi 까지 적분할 것입니다, 10,000 번의 서로 다른 테스트를 하는 동안, 각 테스트는 5000 샘플을 수행합니다. 우리는 PDF y = sin(x) / 2를 사용하여 importance sampling 하는 몬테 카를로(ismc) 뿐만 아니라 일반 몬테카를로(mc)도 사용할 것입니다. 아래의 함수는 우리가 적분하고자 하는 것이고 PDF는 우리가 importance sample 에 사용할 것입니다.
우리는 각 단계의 오차(전체 테스트에 걸쳐 평균화된 오차)의 절대값을 보여주고 이것을 얻을 수 있습니다. (out1.abse.csv 에서)
importance sampling 이 덜 불규칙하고 더 낮은 오차를 보인다는 것 외에는 읽기에 쉽지 않습니다. 우리는 이것을 log/log 그림으로 변경할 수 있습니다. 이것은 감쇄율을 보는데 도움을 줍니다(특히 나중에 볼 low discrepancy sequences 와 같은 것과 연관되어있는 것에서).
개선되었지만 심지어 10,000 의 테스트 후에도 너무 노이즈가 심합니다. 몬테 카를로는 정의상 노이즈가 있습니다, 보시다 싶이, 때로는 정말 낮은 오차를 보기도 하지만, 다음 몇몇 샘플들에서 바로 다시 나타납니다. 만약 당신이 픽셀당 적분을 수행한다면 불규칙성은 좋지 않습니다, 분산은 특히 노이즈를 나쁘게 만들 것입니다. 실제로, 분산은 우리가 정말로 중요하게 생각하는 것입니다. 적분이 올바른 것(unbiased / zero bias)으로 수렴하고 있는 한, 분산은 올바른 답으로 얼마나 빠르게 수렴하는지를 우리에게 알려줍니다.
여기에 log/log 분산 그래프가 있습니다. 당신은 importance sampling이 importance sampling 되지 않은 몬테카를로 적분을 깨끗하게 이기는 것을 더 쉽게 볼 수 있습니다. (out1.var.csv 에서)
이제 우리는 importance sampling 이 도움이 된다는 것을 봤습니다. 그리고 우리는 잘 작동하는 테스트 규약이 있습니다, 더 흥미로운 주제로 가봅시다!
Experiment #2 – Multiple Importance Sampling
다음으로 우리는 y = sin(x) * 2x 를 0에서 pi 범위로 적분 할 것입니다. 우리능 일반 몬테카를로와 y = sin(x) / 2 와 y = 2x /(pi^2)를 사용하는 importance sampling 을 사용할 것입니다. 우리는 또한 두 PDF의 결합을 사용한 multiple importance sampling을 사용할 것입니다. 그리고 MIS인 “single sample method”도 사용합니다. 여기에 언급한 함수가 있습니다.
여기 log/log 분산 그래프가 있습니다.
몬테카를로(mc, 파랑)은 명백히 가장 나쁩니다. Multiple importance sampling (mismc, 초록)은 명백히 가장 좋습니다. 가장 나쁜 것 중 두번째는 line 함수로 importance sampling (ismc2, 노랑) 하는 것입니다. 가장 좋은 것 중 두번째는 sin 기반 PDF를 사용하여 importance sampling (ismc1, 빨강) 하는 것입니다. one sample method (mismcstoc, 보라)는 기본적으로 빨강 선과 동일해 보입니다. mismc 에 비해 절반의 샘플을 사용하므로, 그것이 더 나쁜 것은 놀랍지 않습니다.
multiple importance sampling 은 가치있는 것으로 보이고, 두개의 importance sampling 이 각각 수행되는 것보다 훨씬 좋습니다.
Experiment #3 – Piecewise Importance Sampling
다음으로 우리는 piecewise MIS를 해볼 것입니다. 우리는 y = sin(3x) * sin(3x) * sin(x) * sin(x) 함수를 importance sampling 을 위해 세개의 PDF를 사용하여 적분하려고 합니다. 여기서 각 PDF는 함수 도메인의 1/3을 담당하기 위해서 y=sin(x)/2 가 x 축에서 1/3 크기로 줄어들고 이동됩니다. 예를들어 첫번째 PDF는 0에서 pi/3 범위에서 y = sin(3 * x) * 3/2 입니다.
이것이 우리가 적분할 함수입니다, PDF들이 다루는 3개의 영역을 보여줍니다:
이것은 첫번째 PDF 입니다. 다른 2개도 같은 모야입니다만 X축으로 이동되어 있습니다.
이것은 일반 몬테카를로와 piecewise importance sampling 의 분산입니다, piecewise IS 를 수행하는 것이 상당한 개선임을 볼 수 있습니다.
Experiment #4 – Low Discrepancy Sequences
low discrepancy sequences 가 multiple importance sampling 을 하는데 유용하다는 점은 놀랍지 않습니다. 앞으로의 블로그 글에서 MIS / IS 에서 LDS 를 사용하는 것을 더 자세히 살펴보는 것은 재미있을 것입니다, 특히 높은 차원에서의 변화에서, 그러나 여기에 몇가지 흥미로운 결과가 있습니다.
여기에 첫번째 실험이 있습니다, 이것은 몬테카를로 (mc, 파랑)과 importance sampling (ismc, 노랑)을 비교합니다, low discrepancy sequences를 둘 모두에 사용합니다.
low discrepancy 몬테카를로 (mclds, 주황색)에서, x 값을 만들기 위해서 0에서 1사이의 white noise independent random numbers를 사용하는 대신에, 나는 0에서 1의 난수를 첫번째 샘플 x를 위해서 사용합니다, 그러나 그후 황금비율(golden ratio)을 그것에 더해주고 모듈연산을 사용하여 후속 샘플들이 0에서 1사이의 값을 유지하도록 합니다. 이것이 “Golden Ratio Additive Recurrence Low Discrepancy Sequence” 입니다. 이것은 몬테카를로 그리고 importance sampled 몬테카를로를 크게 변화시킵니다.
low discrepancy importance sampled 몬테카를로 (ismclds, 초록)에 대해, 나는 같은 것을 했습니다, 그러나 PDF에서 숫자를 생성하기 위해서 LDS를 입력으로 하여 이 sequence를 inverseCDF 에 넣습니다. 이것은 1D에서 잘 작동합니다만 LDS 와 IS를 섞은 것은 . importance sampling 왜곡(warping)으로 인해 LDS가 왜곡(distored) 되기 때문에 높은 차원에서 문제가 될 수 있습니다, 그런 뒤 low discrepancy 속성을 잃습니다.
여기에 두번째 실험이 있습니다, 이것은 MC 와 IS 와 MIS 를 비교한 것입니다, low discrepancy sequences를 포함합니다:
LDS를 사용하는 모든 것의 성능이 향상되었습니다, 그러나 흥미롭게도 최고와 최저의 순서가 변경되었습니다.
LDS 를 사용하지 않으면, multiple importance sampling 이 1등 이었습니다. LDS를 사용하면, MIS 는 여전히 1등입니다. MIS에 난수 stream이 두개 필요하기 때문에(각 importance sampling 기술에 하나씩), 나는 각각에 대해 서로 다른 low discrepancy sequence를 사용했습니다. 첫번째 기술에는, golden radio sequence를 사용했습니다. 두번째 기술에는, 동일한 설정을 했습니다만 golden ratio의 제곱근을 사용했습니다. golden ratio는 이런 종류의 것에 가장 좋은 선택입니다, 왜냐하면 이 것은 가장 무리수 다운 무리수(역주 : https://www.youtube.com/watch?v=CaasbfdJdJg&t=342s) 이기 때문입니다, 그러나 제곱근은 꽤 괜찮은 차선입니다.
LDS를 사용하지 않으면, 몬테카를로는 가장 나쁜 성능이 었습니다, 그러나 LDS를 사용하면 몬테카를로는 중간정도 됩니다, 그리고 가장 나쁜 것은 importance sampling 기술이 됩니다. 두번째 importance sampling 기술은 LDS 를 사용하던 사용하지 않던 중간에 있습니다.
여기에 LDS를 사용한 세번째 실험이 있습니다, 이것은 몬테카를로와 piecewise importance sampled 함수를 비교한 것입니다.
이 MIS는 LDS를 위해서 3개의 난수 스트림이 필요합니다, 나는 golden ratio sequence, 제곱근 sequence, 다섯 제곱근 seuquence를 사용하였습니다. 다시 한번, LDS는 두 케이스의 수렴에 상당히 도움이 됩니다!
“known good irrational numbers” 가 바닥나기 시작하는 중입니다 그래서 LDS 실험이 끝나서 기쁩니다. 무리수(irrational numbers)를 사용하지 않는 다른 종류의 low discrepancy sequences가 있습니다, 그리고 나서 결과와 모든 여러 다른 형태(permutations)에 따라 LDS의 품질을 고려해야 합니다. 만약 당신이 무리수에 관해 더 깊게 들어가고 싶다면, 내가 쓴 글을 읽어보세요:https://blog.demofox.org/2020/07/26/irrational-numbers/
이동하기 전에, 마지막 그래프를 다시 한번 봅시다. 5,000 개의 white noise 샘플의 분산의 양은 10 개의 low discrepancy 샘플을 사용하는 piecewise importance sampling 이 가진 양과 동일합니다. LDS 가 없으면, MIS 전략조차도 그 수준의 분산을 위해서 800개의 샘플이 필요합니다.
그래픽스에서, 이런 샘플들은 글로벌 일루미네이션, 소프트 쉐도우 또는 레이트레이싱 된 리플렉션과 같은 것들을 위해 월드로 발사한 레이의 수로 쉽게 표현됩니다.
기본 몬테카를로 알고리즘을 시도해보고, 수렴하고 포기하기 위해서 5000개의 샘플이 필요한 것을 알아내는 것은 정말 쉽습니다.
이것에 직면했을 때, 당신은 MIS를 제거하고 더 나은 것을 시도할 수 있으며, 하려고 했던 것의 비용을 약 1/6 정도인 수렴하는데 800개의 샘플로 줄일 수 있다는 것을 발견할 것입니다. 이것 또한 리얼 타임 렌더링에서는 아주 많은 샘플 수 입니다, 그래서 여전히 예산이 부족합니다. 이 시점에서 포기하는 것은 아주 쉬울 것입니다.
만약 당신이 한단계 더 나아가서 어떻게 white noise 난수 대신 좋은 LDS를 MIS에 넣을 수 있는지 알내면, 당신은 그것을 훨씬 더 줄일 수 있다는 것을 발견할 수 있을 것입니다, MIS 의 1/80 또는 기본 몬테 카를로 비용의 1/500의 비용이 감소됩니다.
픽셀 당 레이트레이싱에 대해서 이야기 하는 것이라면, 10개의 샘플은 여전히 꽤 많지만, 그것의 리얼타임 영역에서 가능한 비용입니다.
좋은 샘플링은 중요하고, 몇 가지 놀라운 일을 하는데 도움을 줄 수 있습니다.
Experiment #5 – Blue Noise
low discrepancy sequences는 샘플링 범위에 대한 좋은 범위를 제공하는 결정론적(deterministic) number sequence 입니다, blue noise는 동일한 작업을 수행하는 랜덤화(non deterministic) number sequences 입니다.
LDS vs blue noise 라는 뉘앙스가 있습니다, 그래서 어느 한쪽을 선택되어야 하는 경우 입니다. 요약하면 일반 blue noise 이 white noise 와 동일한 비율로 수렴하지만 낮은 오차로 시작한다는 것입니다(수렴을 더 잘 하는 projective blue noise 와 같은 변종도 있음). Blue noise는 또한 지각적으로 더 나은 노이즈를 가집니다, 이것은 또한 더 쉽게 필터링 됩니다(전체 스펙트럼 노이즈 대신 high frequency 노이즈만 해당). 그래서, 그래픽스에서의 룰은 기본적으로 만약 LDS 로 수렴할 수 있으면 그렇게 하고, 그렇지 않으면 blue noise 를 error 를 숨기는 용도로 사용합니다. Blue noise 는 또한 importance sampling 과 같은 변환 기능을 사용할 때 원하는 특성을 유지하는데도 더 좋습니다.
불행히도, blue noise 는 계산하는데 꽤 비쌉니다, 특히 내가 사용하는 알고리즘에서, 그래서 샘플하고 테스팅하는 숫자를 100개의 테스트와 500개의 샘플을 사용하도록 감소시키려 합니다. 어쨌든 Blue noise는 적은 샘플 수에 적합합니다., 그래서 샘플 수를 줄여주는 것이 비교에 더 적절합니다.
여기 첫번째 실험입니다, 이것은 MC 와 ISMC 를 비교합니다. LDS 결과와 함께 blue noise 결과가 있습니다.
결과는 blue noise가 white noise 보다 더 낫지만 LDS만큼 좋지는 않다는 것을 보여줍니다.
여기에 두 번째 실험이 있습니다, MC 와 MIS 를 blue noise와 함께 비교합니다. 당신은 분산에 관해서는 blue noise는 품질이 white noise 와 LDS 사이인 것을 볼 수 있습니다.
세 번째 실험입니다, 이것은 MIS를 사용하여 piecewise importance sampling 의 효과를 보여줍니다. 다시 한번, blue noise 의 분산은 white noise와 LDS 사이 입니다.
Links
다른 관점과 다른 설명을 통해서 MIS에 관해 배우기 좋은 훌륭한 몇몇 링크가 여기에 있습니다.