(论文)[2025-SIG] Multiple Importance Reweighting for Path Guiding
Multiple Importance Reweighting for Path Guiding
- 作者:ZHIMIN FAN,南京大学
- 代码
- 【跑了它的代码,cbox、kitchen 都直接段错误了?可能是配置问题,代码没给示例场景和默认配置】
- 摘要
- PPG 在线学习,使用 inverse variance 进行不同迭代轮的图片混合【只考虑了 image space】;本文提出了新的方式【考虑 path space】
- 只能用于 PPG 这样的树结构
- 效果一般啊【比 inverse-variance 好,但是和 accumulate+outlier removal 相比没有优势啊】
- 不太能支持 NEE【内存开销大】
Motivation
- 迭代学习的 PT,第 \(M\) 迭代轮的 MC
估计
- \(p_{M}(\cdot)\) 表示第 \(M\) 轮的采样分布(一般是 BSDF sampling 和上一轮学习结果的 mixture)
\[ \left\langle \int_{\mathcal{P}} f(\bar{x}) \mathrm{d}\bar{x} \right\rangle = \frac{1}{n_M} \sum_{j = 1}^{n_M} \frac{f(\bar{X}_{M, j})}{p_M(\bar{X}_{M, j})}\tag{2} \]
- 不同迭代轮方差不同,如何使用不同迭代轮生成的图片?
- 直接平均
- inverse variance weighted
- PPG
实现
- 当前轮次,每个像素计算方差 localVar
- localVar clamp 之后对所有像素取平均的得到当前轮次的 variance 估计【\(V_M\)】
- 使用 \(1/V_m\)
作为权重,混合之前迭代轮得到的图片【需要保存之前迭代轮得到的图片及其方差】
- 【?】global constant 含义上的最优(所有像素都一样)
- PPG
实现
- 问题
- 不同像素收敛率不一样
- 即使考虑 per-pixel 的也不行,因为没有考虑 path space 的收敛不同【只考虑了 image space】
方法论
- methodology:计算 spatio-directional varying combination weight
path-level reweighting
- 迭代轮 \(i\)
- \(w_i(\bar{x})\) 表示 path-level
weight
- 对 \(M\) 求和为 1
\[ \left\langle \int_{\mathcal{P}} f(\bar{x})\,\mathrm{d}\bar{x} \right\rangle = \sum_{i=1}^{M} \frac{1}{n_i} \sum_{j=1}^{n_i} \frac{w_i(\bar{x}_{i,j}) f(\bar{x}_{i,j})}{p_i(\bar{x}_{i,j})} \tag{3} \]
- 路径采样概率 \(p_i(\bar{x})\)
- 采样位置,采样立体角
\[ \begin{aligned} p_i(\bar{x}) &= p_i(x_1) p_i(x_2 | x_1) \prod_{j=2}^{N-1} p_i(x_{j+1} | x_j, x_{j-1})\\ &= p_i(x_1) G(x_1, x_2) p_i(\omega_1 | x_1) \prod_{j=2}^{N-1} G(x_j, x_{j+1}) p_i(\omega_j | x_j, x_{j-1})\\ \end{aligned}\tag{4,5} \]
- 直观:\(p_i(x)\) 大、样本多;那么 \(w_i(x)\) 大
- 好处
- 迭代早期有些区域 path guiding(pg) 近似不好导致高方差【大 \(f(x)\),小 \(p_i(x)\)】
- 可以通过给特别小的 \(p_i(x)\) 赋值小的 \(w_i(x)\) 实现
- 不同迭代轮之间存在相关性,导致近似有 bias
- 上一轮样本影响这轮的分布,可能收敛到不正确的区域
- 迭代早期有些区域 path guiding(pg) 近似不好导致高方差【大 \(f(x)\),小 \(p_i(x)\)】
- 实验设置【?】
Variance reduction potentials via sample division
- 目前降低分布噪声的方式:保持方向的细分【4k~32k】
- 大区域不准,小区域难拟合
- 通过分享迭代轮之间的信息,我们的方法在更精细的细分依然可用(鲁棒性)
- 常规 pg,迭代轮之间会增加样本数(x2)
- 提高了分布质量,但是复杂场景收敛变慢
- 我们的方式能够让 path 少的情况下效果也好
Mixture-based weighting schemes
- 根据上面的直观,使用 balance heuristic
- 这里的 \(n_i\) 表示这一轮迭代用的样本数【只和轮次相关(像素、路径无关)】
\[ w_i(\bar{x}) = \frac{n_i p_i(\bar{x})}{\sum_{k=1}^M n_k p_k(\bar{x})}\tag{6} \]
- AMIS【2009】表示这个方式对于如下场景效果好
- 近似随着 \(M\) 增加越来越好
- 引入方差估计
- 有些情况下,inverse-variance 效果好【例如最后迭代轮完美近似】
- 引入 per-pixel variance factor:二阶矩除以样本方差
- 参考【2019】Variance-Aware MIS
- 引入方差不能保证效果好【无法完美近似】,实验部分不使用这个
\[ w_i(\bar{x}) = \frac{n_i v_i p_i(\bar{x})}{\sum_{k=1}^M n_k v_k p_k(\bar{x})}, v_i = \frac{u_{2,i}}{\sigma_i^2}\tag{7} \]
加速与实现
- 式子 6 的 \(p_i\) 展开为式子 5,几何项被约分
- 最简单的实现:\((N-1)M\) 次查询计算 \(p_i\)
- 时间复杂度:\(\mathcal{O}((C_S+C_D)MN)\),其中 S、D
分别表示空间结构、方向结构的查询开销
- 实践中,\(C_S\) 更大,尤其是大场景
- 在空间结构的树节点保留历史的的方向结构指针,让复杂度降为 \(\mathcal{O}(C_SN+C_DMN)\)
- 降了一半开销
- 路径
- 保存 \(N\) 个节点的 position(3 N
floats)
- 方向可以计算出来
- \(N\) 个节点的 bsdf pdf(defensive
sampling)(N floats)
- 【PPG 采样概率是 \(\alpha\) 混合】
- 最后一个节点的入射方向(1 float,放到两个 16 位的定点数)
- 路径贡献(3 float)
- 保存 \(N\) 个节点的 position(3 N
floats)
- 开销:\(16(N+1)\) bytes
- 实际实现如下
1 | struct RawImageSample { |
- 内存随着样本数线性增加
固定大小内存
- 为 path sample 分配固定大小内存【500MB】
- 当超过大小时,移除最不重要的样本【优先队列,上面的 original_radiance 就是重要性】
- 移除的时候,我们使用部分 MIS
- \(i\) 表示当前轮次
- 实现上,利用mitsuba 的 ESpectrumAlphaWeight 相片;对所有的路径都累计 \(wL\),\(w\) 忽略 \(\sum_{k=1}^{M} n_k\)【ESpectrumAlphaWeight 最后计算的时候刚好作为权重项除掉了】
- 【怎么感觉都不是无偏的呢?】
- 在一个迭代轮中,只有被去除的样本使用下面计算
- 假设只有轮次 \(M-1\) 中的一个样本被去除了,那么这里感觉 \(w\) 的和都不是 1 呢?
\[ w_i(\bar{x}) = \frac{n_i p_i(\bar{x})}{\sum_{k=1}^{i} n_k p_k(\bar{x})} \frac{\sum_{k=1}^{i} n_k}{\sum_{k=1}^{M} n_k} \tag{8} \]
- 256 spp 对比如下:后面 3 个依次是
- 无限内存、移除样本不使用加权、部分 MIS 加权
- relMSE、relative mean absolute bias、渲染时间
- 论文中说效果好了
实验
- 不开 NEE、RR;最大深度 3-12
- 论文中和直接 累计+outlier removal 做对比
- 数据上看,outlier removal
的效果极好【论文中说存在一些视觉比较差的
artifacts,下图确实有】
- 【CGF-2018】Reweighting Firefly Samples for Improved Finite-Sample Monte Carlo Estimates
- 数据上看,outlier removal
的效果极好【论文中说存在一些视觉比较差的
artifacts,下图确实有】
- 问题
- 内存开销大问题
- 目前只能针对 PPG 这样的树结构,如果是 NN,无法存储
- NEE 不太能开,需要存储更多的量,内存问题
评价
- 自己有些实验也发现,直接累计+outlier removal 效果就很好
- 首先论文也没啥理论支撑,然后无偏性不确定【可能是没看懂】,内存问题还不支持 NEE,评价为一点用都没有
- 而且我感觉 \(p_i\) 本身不靠谱,范围非常大
- 贡献:提出一个问题的好方向【利用 path space 的信息,混合不同迭代轮此之间的生成图片】,但是没能解决,全文其实就是用了一个式子 8【还不是他自己提出的】