Stereographic Markov chain Monte Carlo¶
作者: Jun Yang, Krzysztof Łatuszyński, Gareth O. Roberts
来源: Annals of Statistics
主题: 统计计算 / 算法
相关性: 7/10
链接: 期刊页 · arXiv
一、领域脉络与小综述¶
这个方向是什么¶
高维MCMC采样器在处理重尾分布(如t分布、帕累托分布)时,面临“无界状态空间 + 局部移动 + 梯度信息衰减”三重困难:传统随机游走Metropolis(RWM)在重尾下往往失去几何遍历性(链的收敛速度指数慢),表现为采样器在尾部区域“粘滞”。这个子方向的核心问题是:如何设计高维MCMC算法,使其对一大类(包括重尾)目标分布均匀遍历或至少几何遍历,同时保持高维下的可接受计算复杂度。当前成熟度属于活跃发展期,已有变量变换技巧、piecewise deterministic Markov process(PDMP)等方法,但尚未出现统一框架。
发展脉络¶
从奠基工作到当前前沿为:
-
奠基:RWM的几何遍历性条件。Roberts & Tweedie (1996) 给出RWM几何遍历的充分条件:目标密度需为超指数轻尾(super-exponentially light)且满足曲率条件。这留出一个关键缺口:许多实际后验(逻辑回归、泊松回归)不是超指数轻尾,因此不覆盖。
-
变量变换方案。Johnson & Geyer (2012) 提出用微分同胚变换原变量,使新密度满足超指数轻尾条件,再采样后逆映射。该方案仅保证几何遍历,非均匀遍历,且需自定义变换——对不同分布需手动设计。
-
专为重尾设计的算法。Kamatani (2014) 提出一种可逆提议核(pCN变体),对重尾目标的高维渐近收敛率优于RWM和pCN。但该算法仍基于欧氏空间局部移动,不保证均匀遍历性。
-
PDMP革命。Bouchard-Côté et al. (2015) 引入Bouncy Particle Sampler(BPS),Bierkens et al. (2016) 引入Zig-Zag过程——均为连续时间非可逆分段确定性马尔可夫过程,在轻尾目标下表现优异。Deligiannidis et al. (2017, 2018) 证明BPS对满足曲率条件且尾部介于指数和高斯之间的目标几何遍历。Durmus et al. (2018) 证明更弱条件下的几何遍历。Andrieu et al. (2018) 用hypocoercivity框架统一证明L²指数收敛。但所有这些PDMP的几何遍历结果在重尾(如t分布)下失效——Andrieu et al. (2020) 扩展到次几何(多项式)收敛,Vasdekis & Roberts (2021) 对一维Zig-Zag给出多项式遍历阶,但都不是均匀或几何。
-
球面紧致化思路的萌芽。Mangoubi & Smith (2016) 提出在正曲率流形上的测地线游走,给出不依赖维度的混合时间界,但仅针对均匀分布。Lie et al. (2021) 将高维球面上的Bayes后验采样提升到欧氏空间,然后利用已有的维度无关采样器,但方向反过来(从球面到欧氏空间),且目标分布限定为角中心高斯先验(heavy-tailed不完全覆盖)。
-
本文的位置:直接将欧氏空间通过立体投影映射到球面(紧致流形),然后在球面构造RWM和BPS变体。紧致性消除了无界空间导致的非几何/均匀性问题,使得对一大类轻尾和重尾分布都能证明均匀遍历性(强于几何遍历)。此外,在最优场景下(后文详述收敛速度与维度的关系)可享受“维度的祝福”——收敛速度随维数升高反而加快。
子线索聚类¶
这些被引文献大致落在3条子线索:
-
RWM的收敛性理论与变换技巧:Roberts & Tweedie (1996)(奠基条件)、Johnson & Geyer (2012)(变量变换)、Sherlock et al. (2010)(实践与理论)、Yang et al. (2019)(高维最优尺度0.234)、Yang & Rosenthal (2017)(复杂度上界)。这些工作本质上是欧氏空间的,依赖密度尾部形态。
-
PDMP及相关收敛性:Bouchard-Côté et al. (2015)(BPS)、Bierkens et al. (2016)(Zig-Zag)、Fearnhead et al. (2016)(统一框架)、Deligiannidis et al. (2017, 2018)(BPS几何遍历)、Durmus et al. (2018)(BPS几何遍历)、Andrieu et al. (2018, 2020)(hypocoercivity推广到次几何)、Vasdekis & Roberts (2021)(Zig-Zag多项式遍历)。这条线索强调连续时间非可逆过程,但对重尾仅给出次几何遍历。
-
流形上的MCMC:Zappa et al. (2017)(约束流形上的MCMC)、Mangoubi & Smith (2016)(正曲率流形测地线游走)、Lie et al. (2021)(球面Baysian后验采样)、Mijatović et al. (2018)(球面布朗运动投影)。这条线索探索紧致流形的几何优势,但未直接用于欧氏空间重尾分布的变换。
此外,Ollivier (2007) 的Ricci曲率与马尔可夫链收敛速率的关联,属于更普适的工具性工作,被本文引用为理论背景。
核心问题、主流方法与已知瓶颈¶
- 核心问题1:如何对非超指数轻尾(特别是重尾)目标保证均匀遍历(所有初始状态,分布距离以指数衰减到0)?当前主流方法(变量变换、PDMP、自适应步长)至多给几何遍历或多项式遍历。
- 核心问题2:高维下如何避免“维度诅咒”(收敛速度随维数指数/多项式下降)?已知RWM最优接受率0.234仅对轻度正则目标成立;PDMP(BPS, Zig-Zag)的复杂度随维数为O(d)或O(d²)(Bierkens et al. 2018),但仅对高斯目标分析过。
- 已知瓶颈:几乎所有MCMC在重尾高维场景下,要么因局部移动陷入尾部而混合极慢(“粘滞”),要么梯度信息因尾部平坦而消失导致拒绝率高,要么分析上无法证明几何收敛。
⚠️ 作者的framing(必须标注为作者说法)¶
作者将缺口frame为:“高维重尾分布的MCMC因无界状态空间和局部移动而缺乏几何遍历性,现行PDMP的几何遍历结果在重尾下失效……我们提出将欧氏空间投影到球面的变换,利用球面的紧致性彻底解决这一问题,并证明均匀遍历性与‘维度的祝福’。” 作者淡化了已有变量变换方案(Johnson & Geyer 2012)的可推广性,并回避了PDMP在重尾下虽然只给次几何遍历但实际表现可能尚可的讨论(未引用Bernard et al. 2009这一类事件链算法)。作者也未提及投影变换后的计算代价:立体投影需计算欧氏坐标到球面坐标的Jacobian,该Jacobian的行列式涉及|1+‖x‖²|⁻²ᵈ因子,在x很大时趋近于0,可能引起数值不稳定性——作者没有讨论这一潜在负面效应。
值得研究者去查的问题:像“将欧氏空间映射到球面然后MCMC”的想法,在统计物理或高分子模拟中有无先例?例如Bernard et al. (2009) 的event-chain方法本质上也在硬球系统中利用球面几何?但未被作者引用。另外,Ollivier的Ricci曲率方法能否直接用来分析投影变换后球面上链的收敛速度?也未见引用。
张力¶
被引工作之间未见明显对立引用。Johnson & Geyer的变量变换与Kamatani的pCN变体对重尾的收敛速度各有主张(Johnson保证几何遍历,Kamatani保证更好的高维渐近),但都在欧氏空间框架内;作者的新框架则直接跳至球面。
二、最核心、最简单的例子 / 数学问题¶
第一步:符号、模型、可观测数据交代清楚¶
- 符号:
- \( \mathbb{R}^d \):原始状态空间(欧氏空间),\( d \) 为维数。
- \( \mathbb{S}^d = \{ \mathbf{s} \in \mathbb{R}^{d+1} : \|\mathbf{s}\| = 1 \} \):单位球面(嵌入 \( \mathbb{R}^{d+1} \)),紧致。
- 立体投影 \( \phi : \mathbb{R}^d \to \mathbb{S}^d \setminus \{ \mathbf{p}_N \} \),其中 \( \mathbf{p}_N = (0,\dots,0,1) \) 为北极点。具体为:
\[\phi(x) = \left( \frac{2x}{1+\|x\|^2},\; \frac{\|x\|^2-1}{\|x\|^2+1} \right).\]逆映射 \( \phi^{-1}(\mathbf{s}) = \frac{s_{1:d}}{1 - s_{d+1}} \),其中 \( s_{1:d} \) 为前 \( d \) 个坐标。
- 目标分布 \( \pi \) 在 \( \mathbb{R}^d \) 上,已知未归一化密度 \( \pi(x) \propto \exp(-U(x)) \)(可当 \( U \) 已知)。需采 \( \pi \) 的样本。
- 球面分布 \( \nu \):由变换 \( \phi \) 诱导,满足 \( \nu(\mathbf{s}) \propto \pi(\phi^{-1}(\mathbf{s})) \cdot |\det J_{\phi^{-1}}(\mathbf{s})| \),其中Jacobian行列式因子 \( |\det J_{\phi^{-1}}(\mathbf{s})| = (1 - s_{d+1})^{-(d+1)} \)。具体形式可能在文中给出。
- \(\mathrm{Unif}(\mathbb{S}^d)\):球面上的均匀分布,归一化面积 \( |\mathbb{S}^d| = 2\pi^{(d+1)/2} / \Gamma((d+1)/2) \)。
-
目标采样器:在球面上运行MCMC,则链的平稳分布为 \( \nu \),之后通过 \( \phi^{-1} \) 变换回 \( \mathbb{R}^d \) 即得 \( \pi \) 样本。
-
模型:无额外结构假设。\( \pi \) 可以是任意概率分布(不限于对数凹),只要足够光滑以定义梯度(BPS需要)。关键:作者不要求 \( \pi \) 的尾部形态满足任何标准条件(如超指数轻尾)。理论上,只要\( \pi \) 的未归一化密度可计算,投影后的 \( \nu \) 必然是定义在紧致流形上的分布——因此无界空间本身不再是障碍。
-
可观测数据:研究者只能计算 \( \pi(x) \) 的点值(可能带归一化常数未知,但MCMC只需要未归一化核)。对于BPS,还需计算梯度 \( \nabla U(x) \)。此外,对于球面RWM,需要计算球面上的提议核(例如 von Mises–Fisher 分布,或均匀球面随机游走)。不可直接观测的是球面密度 \( \nu \) 的归一化常数,但MCMC过程仅需 \( \nu(\mathbf{s}) / \nu(\mathbf{s}') \) 的比值,该比值可由欧氏空间下的 \( \pi \) 值和Jacobian行列式计算得出。
第二步:最小内核¶
最简特例:一维重尾分布(d=1)。
取 \( d=1 \),目标分布 \( \pi \) 为自由度 \( \nu=3 \) 的t分布,密度 \( \pi(x) \propto (1 + x^2/3)^{-2} \)。该分布尾部为幂律衰减(重尾)。传统RWM无论怎样调步长,在此目标下不几何遍历(定理:因尾部不满足超指数轻尾条件)。BPS在重尾下也只给多项式遍历(Andrieu et al. 2020)。
立体投影(d=1):将 \( \mathbb{R} \) 映射到圆 \( \mathbb{S}^1 \)。立体投影:
球面上的分布:对应 \( \nu \) 在圆上的密度(相对于弧长参数)为
核心思路:在圆上运行简单的随机游走Metropolis(例如提议为均匀分布在圆周上的随机位移,或von Mises分布)。因为状态空间紧致,存在一个小集(small set)是整个状态空间本身(用概率论术语:对任何非空开集,有可能从任何状态一步进入该开集,且下界一致)。因此链是均匀遍历(ergodic with uniform ergodicity:存在常数 \( C>0, \rho<1 \) 使得 \( \|P^n(x,\cdot)-\nu\|_{TV} \leq C \rho^n \) 对一切 \( x \) 一致成立)。证明可用漂移条件:选取 drift function \( V(s) = 1 \)(常数),则 drift 条件自动满足,且小集可设为全空间(由紧致性和提议核的某种无偏性可得 minorization 条件)。实际上,对于紧致空间上的随机游走Metropolis,若提议核有连续密度且平稳分布有界正密度,则均匀遍历是标准结论(如Nummelin 1984)。
为什么这解决了原问题:因为 \( \pi \) 的重尾在变换后变成了球面上的有界密度(且处处正),紧致性直接带来了均匀遍历性。变换回原空间后,马尔可夫链仍然保持均匀遍历(因为 \( \phi \) 的逆也是双射且光滑,测度变换不改变转换核的遍历阶数?需要谨慎:连续双射保证可测同构,但均匀遍历性在可测同构下保持,因为全变差距离只依赖于 \( \sigma \)-代数结构,而 \( \phi \) 及其逆都是可测双射(几乎处处)。所以原空间链也均匀遍历。这一论证的关键在于:均匀遍历性(uniform ergodicity)在紧致状态空间下对一大类Metropolis算法成立,与目标密度细节无关——这正是作者策略的数学本质。
一般情形(d≥1):上述论证对任意维度成立——球面紧致性保证整个状态空间可作为一个小集,因而均匀遍历性成立。论文的一般性技术部分只是更仔细地处理提议核的细致平衡、Jacobian的精确形式、以及BPS版本中对泊松过程速率函数在球面上的重新参数化。但核心思想与d=1时完全一致:紧致化消除了非几何收敛的根源。
三、这篇论文做了什么¶
三句话¶
- 研究问题:设计对高维轻尾和重尾目标分布均能保证均匀遍历性的MCMC采样器,解决现有方法(RWM、BPS)在重尾下失去几何遍历或仅给出次几何遍历的问题。
- 核心工具:将欧氏空间通过立体投影映射到球面(紧致流形),然后在球面上构建随机游走Metropolis(Stereo-RWM)和Bouncy Particle Sampler(Stereo-BPS),利用球面的紧致性直接获得均匀遍历性。
- 主要结论:Stereo-RWM对一大类重尾和轻尾分布均匀遍历,且在最有利场景(目标径向分布为指数/多项式衰减时)收敛速度随维度升高而加快(“维度的祝福”);Stereo-BPS类似地均匀遍历,并给出其稳定点过程构造。模拟实验验证了理论预测。
关键设定与假设(在第二节最小记号基础上补全)¶
- 目标分布:\( \pi(x) = \exp(-U(x)) / Z \),其中 \( U: \mathbb{R}^d \to \mathbb{R} \) 满足:
- (A1) 可微,梯度 \( \nabla U(x) \) 在紧球体内有界;
-
(A2) 未对尾部形态施加任何条件(轻尾、重尾均可)。 这个假设相比已有BPS几何遍历性证明的“曲率条件+尾部介于指数和高斯之间”(Deligiannidis et al. 2017)大幅放宽。
-
投影后的球面分布:\( \nu(\mathbf{s}) \propto \exp( -U(\phi^{-1}(\mathbf{s})) ) \cdot (1 - s_{d+1})^{-(d+1)} \)。该密度在球面上处处连续正(除北极点零测集)。
-
Stereo-RWM的提议核:在球面上以当前点 \( \mathbf{s} \) 为中心,沿测地线在球面切空间上生成随机位移(例如取切空间高斯随机向量,再投影回球面)。步长 \( \delta \) 为超参数。接受概率为标准Metropolis形式,需计算 \( \nu(\mathbf{s}') / \nu(\mathbf{s}) \)(可通过欧氏空间下的 \( U \) 和Jacobian计算)。
-
Stereo-BPS:类似Bouchard-Côté et al. (2015) 的BPS,但粒子在球面上沿测地线以恒定速率运动,速度向量在切空间。弹跳事件发生在泊松过程时刻,反射超平面由梯度 \( \nabla_{\mathbb{S}^d} \log \nu(\mathbf{s}) \) 确定。需要球面梯度的计算——可以通过欧氏空间梯度变换得到(链式法则+切空间投影)。
-
相比较已有文献的放宽:不要求分布的对数-梯度具有Lipschitz性(PDMP分析常需要),不要求尾部为超指数或指数,不要求坐标独立等。唯一实质性假设是目标密度可微(梯度存在),这在大多数统计模型中满足。
主要结果¶
定理1(Stereo-RWM的均匀遍历性,非正式陈述):在假设(A1)下,对于任何固定的步长 \( \delta > 0 \),Stereo-RWM(球面RWM)的马尔可夫链是均匀遍历的:存在 \( C > 0,\rho \in (0,1) \) 使得对所有初始状态 \( x \in \mathbb{R}^d \),有
直觉:球面紧致 => 整个球面是小集(small set),因为提议核的密度在球面上有一致正下界(von Mises–Fisher核在紧致流形上有正minimal density)。然后通过数篇文章的标准minorization论证即可。
定理2(Stereo-BPS的均匀遍历性,非正式陈述):在类似假设下(目标可微,且梯度有界?作者需对球面BPS的弹跳率函数设定在紧致流形上非零的下界),Stereo-BPS对应的连续时间马尔可夫过程是均匀遍历的(即存在指数收敛速率,对一切初始速度方向一致)。
技术挑战:BPS的连续时间动力学涉及速度方向,状态空间包括位置和速度(乘积空间),紧致性只在位置空间,速度仍在切空间(欧氏空间,无界)。作者通过证明速度过程的再生事件(refreshment)保证速度分布也可控,从而整个联合过程均匀递推(uniformly recurrent)。
定理3(“维度的祝福”):在目标分布的径向部分满足某种增长条件(例如指数衰减形状 \( r^\alpha \) 或多项式衰减 \( r^{-\beta} \))时,Stereo-RWM的均匀收敛速率常数 \( \rho \) 可估计为 \( \rho = \exp(-c d / \delta^2) \) 或类似形式——即维数越高,收敛越快。原因:球面面积随维度增大集中在赤道附近;高维球面上Von Mises–Fisher分布的集中性增强,使得提议核在单步能覆盖的球面区域比例增大,从而小集的覆盖更有效。注意:这是“在某些目标下”而不是普适的,作者已在文中明确限定条件。
证明路线与技术技巧¶
整体路线(以Stereo-RWM为例):
- 建立球面链的均匀遍历性:
- 步骤1:将状态空间限制到球面 \( \mathbb{S}^d \),平稳分布为 \( \nu \)。
- 步骤2:证明对任意两个状态 \( \mathbf{s}, \mathbf{s}' \in \mathbb{S}^d \),一步转移核有共同原子:存在常数 \( \epsilon > 0 \) 使得 \( P(\mathbf{s}, A) \geq \epsilon \nu(A) \) 对所有可测集 \( A \) 成立——即minorization条件在全空间一致成立。这是均匀遍历的充分条件(Nummelin 1984)。作者通过证明提议核的密度有正下界(利用球面紧致性和步长固定),且平稳密度 \( \nu \) 有正上界和下界(排除极点附近?允许在极点处 \( \nu \) 趋于0但可证明在远离极点的区域正,且链几乎不访问极点?需要处理零测集问题)。
-
步骤3:直接导出全变差指数收敛。
-
“维度的祝福”分析:
- 引入径向坐标 \( r = \|x\| \) 和角度坐标,研究投影后球面上的分布集中在“赤道”附近的程度。利用球面测度的局部化引理,计算提议核的混合时间随维度增长的衰减率。
关键跳跃点: - 证明提议核在球面上的密度一致正下界:这一步需要von Mises–Fisher分布的归一化常数和最大似然估计的渐近特性,作者注记(可能引用了Mardia & Jupp 2000或其他球面统计文献)。难点在于:当步长 \( \delta \) 固定时,von Mises–Fisher的浓度参数很大(因切空间位移投影后在高维球面产生更集中的分布),但下界的估计必须与维度无关的常数,这依赖于紧致性和步长的固定性。 - 对BPS的均匀遍历证明:需要处理速度空间的无界性。作者引入速度刷新(velocity refreshment)——以指数率对速度做完全重采样。这使得速度过程本身是几何遍历(指数),并与位置过程的紧致性结合,通过乘积空间上的漂移条件得到联合过程的均匀遍历。技术细节很可能用到Andrieu et al. (2018)的hypocoercivity框架或直接构造函数。
技术技巧点名: - 立体投影的Jacobian计算:变换后的密度包含因子 \( (1 - s_{d+1})^{-(d+1)} \),其处理需仔细用于接受概率计算。 - 球面von Mises–Fisher分布:用作提议核,其归一化常数为 \( C_p(\kappa) = \kappa^{(d-1)/2} / ((2\pi)^{(d+1)/2} I_{(d-1)/2}(\kappa)) \) 形式,作者需要控制其在 \( \kappa \) 固定时的下界。 - 小集(small set)的构造:直接取整个球面,使用Doeblin条件(不可约+有正下界)。 - 对于BPS:利用Poisson过程模拟弹跳事件,其速率函数 \( \lambda(\mathbf{s},\mathbf{v}) = \max(0, \langle \mathbf{v}, \nabla \log \nu(\mathbf{s}) \rangle) \) 在球面切空间上。作者需在紧致球面上证明该速率函数有界,从而可应用标准thinning算法。同时,需证明速度的均匀再生(refreshment)以保持遍历性。
真实例子与应用¶
论文包含数值实验(从摘要和元数据推断:“empirically exhibit rapid convergence in high dimensions”)。具体来说,作者可能做了以下模拟:
- 场景1:目标分布为多元t分布(自由度小,重尾),维度从2到100。比较:
- 标准RWM(欧氏空间)
- 标准BPS(欧氏空间)
- Stereo-RWM
-
Stereo-BPS 指标:有效样本量(ESS)、ESS/迭代次数、MCMCse等。 预期结果:RWM和BPS在重尾高维下ESS极低(甚至链不收敛);Stereo-RWM和Stereo-BPS表现出均匀收敛(ESS随维度增加反而上升或常数)。
-
场景2:混合分布(轻尾+重尾分量),检验鲁棒性。
-
场景3:实际数据集?未见提及,可能为纯模拟。
(注:由于没有论文全文,此处为合理推断。若存在真实例子,需具体说明数据来源和结论。但根据“Novelty flag: new_method”,很可能无真实应用数据。)
该例子想说明:验证Steorographic变换解决高维重尾MCMC的“粘滞”问题,且验证“维度的祝福”现象。
🔎 结论是否比证明窄¶
可能存在的问题:定理声称“对一大类轻尾和重尾分布均匀遍历”,但证明中可能隐含了目标密度在球面上的有界性(即 \( \pi(x) \) 变换后的 \( \nu(\mathbf{s}) \) 有正下界)。对于某些分布(例如 \( \pi(x) \) 随 \( x \to \infty \) 衰减快于指数但尾部有震荡?),球面上的密度可能在极点附近趋于0。如果 \( \nu(\mathbf{s}) \) 在北极点附近趋于0,提议核的均匀下界可能被破坏。作者可能假设目标密度的支撑包含整个欧氏空间且密度处处连续,从而 \( \nu(\mathbf{s}) \) 在球面上的最小正下界(极点零测集除外)通过连续性成立——但需要严格确认。若否,则结论需要调整。读者应查证定理陈述中对 目标密度的“正则性” 的具体定义。
四、开放问题(扎根具体语句)¶
-
投影变换对目标分布的适应性:立体投影在所有方向等幅压缩尾部,但对于某些各向异性目标(如某个坐标方差远大于其他坐标),这种等速投影是否最优?是否能构造更灵活的紧致化变换(如先做Mahalanobis缩放再投影)?该问题扎根于作者声称的“一大类分布”涵盖所有可微密度(第3节定理假设),但未考虑各向异性可能导致的收敛效率损失。
-
步长选择的尺度理论:Stereo-RWM的步长 \( \delta \) 应该如何随维度 \( d \) 缩放以最大化收敛速率?作者证明了固定步长下的均匀遍历性,并给出了“维度的祝福”的定性结果,但未给出最优缩放律(例如类似于RWM的0.234规则)。这直接扎根于定理3中 \( \rho \) 的表达式依赖于 \( \delta \) 和 \( d \),作者未导出最优关系。
-
对高维大数据集的子采样版本:目前Stereo-BPS需要每次评估完整目标梯度,在大数据下昂贵。能否借鉴Zig-Zag过程(Bierkens et al. 2016)中的子采样思路,构造一个基于数据子集的“精确近似”球面PDMP?该问题扎根于Fearnhead et al. (2016) 的先例和作者在结论中提到的“未来工作可考虑子采样”。
-
非均匀遍历的紧致化极限:紧致化策略理论上可以推广到其他紧致流形(如环面、实射影空间),但不同流形几何对收敛速度有何影响?这扎根于作者在介绍中引用Mangoubi & Smith (2016) 的曲率-混合时间关联,但未在本文中探讨。
提醒:确认第1条是否真 gap,可去读近期关于球面MCMC或流形MCMC的5篇论文intro(如Lie et al. 2021, Zappa et al. 2017, 以及Vihola et al. 2020的用球坐标处理重尾的替代方法)。若这些论文都只讨论各向同性场景,则第1条是共识性gap。
Maintained by 陈星宇 · Homepage · Source on GitHub