1、多维高斯分布公式:
对于多维(多变量)高斯分布,概率密度函数的形式稍微复杂一些,可以表示为:
f ( x ∣ μ , Σ ) = 1 ( 2 π ) k / 2 ∣ Σ ∣ 1 / 2 exp ( − 1 2 ( x − μ ) ⊤ Σ − 1 ( x − μ ) ) f(\mathbf{x}|\boldsymbol{\mu},\boldsymbol{\Sigma}) = \frac{1}{(2\pi)^{k/2}|\boldsymbol{\Sigma}|^{1/2}} \exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^\top\boldsymbol{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})\right) f(x∣μ,Σ)=(2π)k/2∣Σ∣1/21exp(−21(x−μ)⊤Σ−1(x−μ))
这里:
- x \mathbf{x} x 是一个 k 维随机向量。
- μ \boldsymbol{\mu} μ是 k 维的均值向量。
- Σ \boldsymbol{\Sigma} Σ是 k×k 的协方差矩阵,描述了各个维度之间的方差和协方差。
- ∣ Σ ∣ |\boldsymbol{\Sigma}| ∣Σ∣ 表示协方差矩阵的行列式。
- Σ − 1 \boldsymbol{\Sigma}^{-1} Σ−1 是协方差矩阵的逆矩阵。
- ( x − μ ) ⊤ (\mathbf{x}-\boldsymbol{\mu})^\top (x−μ)⊤表示 x − μ \mathbf{x}-\boldsymbol{\mu} x−μ的转置。
2、协方差矩阵的表达形式:
协方差矩阵可以描述高斯分布的影响范围,可以想象其影响范围可能是圆或者椭圆形,而椭圆可以用缩放尺度和旋转角度来表示:
(1)特征值:它们代表了椭圆的半轴长度的平方(即沿着主成分方向上的方差)。较大的特征值对应于椭圆的长轴,较小的特征值对应于短轴。因此,特征值可以被视为缩放因子,因为它们决定了椭圆的大小。
(2)特征向量:它们定义了椭圆的主轴方向,即数据的主要变异方向。特征向量给出了旋转角度,说明了椭圆相对于坐标轴的旋转程度。
(3)所以 Σ = R S S T R T \Sigma = RSS^TR^T Σ=RSSTRT,满足协方差的半正定性质
注:
椭圆可以通过缩放尺度和旋转角度来表示,主要是因为这些参数能够简洁地描述椭圆的几何特性。具体来说:
-
缩放尺度(Scale Factors):椭圆的形状由其两个半轴长度决定,分别是长轴(major axis)和短轴(minor axis)。这两个长度可以被视为在各自方向上的缩放因子。如果我们将一个单位圆(所有点到中心的距离都是1的圆)沿两个正交方向分别缩放不同的比例,我们就可以得到一个椭圆。长轴和短轴的长度对应于在相应方向上的缩放比例。
-
旋转角度(Rotation Angle):标准位置的椭圆其主轴(长轴和短轴)是与坐标系的x轴和y轴平行的。然而,实际中的椭圆可能被旋转了一定的角度。这个旋转角度定义了椭圆相对于原坐标系的倾斜程度。通过应用一个旋转矩阵,我们可以将标准位置的椭圆转换为任意方向上的椭圆。旋转矩阵是一个特殊的正交矩阵,它保持了形状和大小不变,只改变了位置和方向。
综上所述,一个二维空间中的椭圆可以用三个主要参数来完全描述:长轴长度、短轴长度以及旋转角度。长轴和短轴长度给出了椭圆的尺寸信息,而旋转角度则说明了椭圆的方向。这种表示方法不仅直观而且数学上非常有用,因为它允许我们使用简单的变换(如缩放和平移)来构造复杂的形状,并且易于进行计算和分析。
在数学表达式中,一个经过缩放和旋转的椭圆可以表示为:
( x cos ( θ ) + y sin ( θ ) ) 2 a 2 + ( − x sin ( θ ) + y cos ( θ ) ) 2 b 2 = 1 \frac{(x\cos(\theta) + y\sin(\theta))^2}{a^2} + \frac{(-x\sin(\theta) + y\cos(\theta))^2}{b^2} = 1 a2(xcos(θ)+ysin(θ))2+b2(−xsin(θ)+ycos(θ))2=1
其中 (a) 和 (b) 分别是椭圆的半长轴和半短轴长度, θ \theta θ是椭圆的旋转角度。
(1) 关于二维高斯分布和椭圆的关系,我们可以这么考虑:
二维高斯分布的概率密度函数为
p ( x ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 exp { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } p(\boldsymbol{x}) = \frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}} \exp\left\{-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^T\Sigma^{-1}(\boldsymbol{x}-\boldsymbol{\mu})\right\} p(x)=(2π)2n∣Σ∣211exp{−21(x−μ)TΣ−1(x−μ)}
其中 x = ( x , y ) T \boldsymbol{x}=(x,y)^T x=(x,y)T, Σ \Sigma Σ 为协方差矩阵, μ \boldsymbol{\mu} μ 为均值。考虑令 p ( x ) p(\boldsymbol{x}) p(x) 等于一个常数,并令 u = x − μ \boldsymbol{u}=\boldsymbol{x}-\boldsymbol{\mu} u=x−μ,即
u T Σ − 1 u = R 2 \boldsymbol{u}^T\Sigma^{-1}\boldsymbol{u}=R^2 uTΣ−1u=R2
其中 R 2 R^2 R2 为常数。由于 Σ \Sigma Σ是对称矩阵,一定存在正交矩阵 P P P 使得
Σ = P T Λ P \Sigma=P^T\Lambda P Σ=PTΛP
其中 Λ = diag ( λ 1 , λ 2 ) \Lambda=\text{diag}(\lambda_1,\lambda_2) Λ=diag(λ1,λ2) 是由 Σ \Sigma Σ的特征值组成的对角矩阵。带入概率密度函数,得
u T P T Λ − 1 P u = R 2 \boldsymbol{u}^TP^T\Lambda^{-1}P\boldsymbol{u}=R^2 uTPTΛ−1Pu=R2
令 v = P u \boldsymbol{v}=P\boldsymbol{u} v=Pu(也就是相对 u \boldsymbol{u} u 坐标系旋转了一个角度),则
v T Λ − 1 v = R 2 \boldsymbol{v}^T\Lambda^{-1}\boldsymbol{v}=R^2 vTΛ−1v=R2
即
v 1 2 λ 1 R 2 + v 2 2 λ 2 R 2 = 1 \frac{v_1^2}{\lambda_1 R^2} + \frac{v_2^2}{\lambda_2 R^2} = 1 λ1R2v12+λ2R2v22=1
正好是一个长短轴分别为 λ 1 R \sqrt{\lambda_1}R λ1 R、 λ 2 R \sqrt{\lambda_2}R λ2 R 的椭圆。令 R = 3 R=3 R=3就得到了代码中算 my_radius
的公式。
3、高斯分布的性质:
不证明给出结论(可参考https://zhuanlan.zhihu.com/p/666465701):
(1)高斯分布经仿射变换后仍是高斯分布
(2)多元高斯分布的边缘分布仍是高斯分布
(3)高斯分布经过线性变换仍是高斯分布
4、透视投影矩阵
基于相机内参推导透视投影矩阵(splatam):
M c a m = [ 2 ⋅ f x w 0.0 ( w − 2 ⋅ c x ) w 0.0 0.0 2 ⋅ f y h ( h − 2 ⋅ c y ) h 0.0 0 0 f a r + n e a r n e a r − f a r 2 f a r ⋅ n e a r n e a r − f a r 0.0 0.0 − 1.0 0.0 ] M_{cam}= \begin{bmatrix} \frac{2 \cdot fx}{w} & 0.0 & \frac{(w - 2 \cdot cx)}{w} & 0.0 \\ 0.0 & \frac{2 \cdot fy}{h} & \frac{(h - 2 \cdot cy)}{h} & 0.0 \\ 0 & 0 & \frac{far + near}{near - far} & \frac{2far \cdot near}{near - far} \\ 0.0 & 0.0 & -1.0 & 0.0 \end{bmatrix} Mcam= w2⋅fx0.000.00.0h2⋅fy00.0w(w−2⋅cx)h(h−2⋅cy)near−farfar+near−1.00.00.0near−far2far⋅near0.0
fx
: 相机内参中的焦距在x方向上的分量。fy
: 相机内参中的焦距在y方向上的分量。cx
: 图像中心在x方向上的坐标。cy
: 图像中心在y方向上的坐标。w
: 图像宽度。h
: 图像高度。near
: 视锥体(frustum)的近裁剪平面距离。far
: 视锥体(frustum)的远裁剪平面距离。
注:此处深度为负
参考透射投影矩阵的数学推导的推导得到透视投影矩阵另一种形式:
M p = [ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 f + n n − f 2 f n n − f 0 0 − 1 0 ] M_p = \begin{bmatrix} \frac{2n}{r - l} & 0 & \frac{r + l}{r - l} & 0 \\ 0 & \frac{2n}{t - b} & \frac{t + b}{t - b} & 0 \\ 0 & 0 & \frac{f + n}{n - f} & \frac{2fn}{n - f} \\ 0 & 0 & -1 & 0 \end{bmatrix} Mp= r−l2n0000t−b2n00r−lr+lt−bt+bn−ff+n−100n−f2fn0
n
: 近裁剪平面距离。f
: 远裁剪平面距离。r
: 近裁剪平面的右边界。l
: 近裁剪平面的左边界。t
: 近裁剪平面的上边界。b
: 近裁剪平面的下边界。
可以先看这两个参考再往下看:
参考:
https://zhuanlan.zhihu.com/p/421962223
https://blog.csdn.net/qq_43758883/article/details/116503614
通过视场角来从 M p M_p Mp得到 M c a m M_{cam} Mcam:

上图,忽略y轴,上半部分是相机坐标系,下班部分是像素坐标系,可见相机坐标下的视场角和像素坐标下的视场角是一致的,
1、
在相机坐标系下:
t a n ( f o v x / 2 ) = r − l 2 n tan(fovx/2) = \frac{r-l}{2n} tan(fovx/2)=2nr−l
在像素坐标系下:
t a n ( f o v x / 2 ) = f x w / 2 tan(fovx/2 )= \frac{fx}{w/2} tan(fovx/2)=w/2fx
将上式公式同时提取缩放因子:
t a n ( f o v x / 2 ) = α f α w ′ / 2 = f w ′ / 2 = r − l 2 n tan(fovx/2) = \frac{ \alpha f}{\alpha w'/2} = \frac{ f}{ w'/2} = \frac{r-l}{2n} tan(fovx/2)=αw′/2αf=w′/2f=2nr−l
2、
α ( r − l ) = w α ( r + l ) = ( w − 2 c x ) \begin{align} \alpha (r-l) &= w \\ \alpha (r+l) &= (w - 2cx) \end{align} α(r−l)α(r+l)=w=(w−2cx)
所以,
r + l r − l = ( w − 2 c x ) w \frac {r+l}{r-l} = \frac {(w - 2cx)}{w} r−lr+l=w(w−2cx)
同理,透视投影矩阵y轴也是如此推导。
splatam非标准透视投影
splatam使用的非标准透视投影,与一般不同,splatam是把深度缩放到 [0,1]:
此处深度全取正数,因此第三、四列需要加个负号。
M s p l a t a m = [ 2 ⋅ f x w 0.0 − ( w − 2 ⋅ c x ) w 0.0 0.0 2 ⋅ f y h − ( h − 2 ⋅ c y ) h 0.0 0.0 0.0 f a r f a r − n e a r − ( f a r ⋅ n e a r ) f a r − n e a r 0.0 0.0 1.0 0.0 ] M_{splatam}= \begin{bmatrix} \frac{2 \cdot fx}{w} & 0.0 & \frac{-(w - 2 \cdot cx)}{w} & 0.0 \\ 0.0 & \frac{2 \cdot fy}{h} & \frac{-(h - 2 \cdot cy)}{h} & 0.0 \\ 0.0 & 0.0 & \frac{far}{far - near} & \frac{-(far \cdot near)}{far - near} \\ 0.0 & 0.0 & 1.0 & 0.0 \end{bmatrix} Msplatam= w2⋅fx0.00.00.00.0h2⋅fy0.00.0w−(w−2⋅cx)h−(h−2⋅cy)far−nearfar1.00.00.0far−near−(far⋅near)0.0
可以看到矩阵的第三行与之前的不同,它的作用是把深度最后归一化到 [0,1]。
设相机坐标下的点位置为 [ x c a m , y c a m , z c a m , 1 ] [x_{cam} , y_{cam} ,z_{cam},1] [xcam,ycam,zcam,1],对应裁剪空间坐标为 [ x c , y c , z c , w c ] [x_{c} , y_{c} ,z_{c},w_c] [xc,yc,zc,wc],对应NDC坐标 [ x n , y n , z n , 1 ] [x_{n} , y_{n} ,z_{n},1] [xn,yn,zn,1]。
故:
x c y c z c w c \] = M s p l a t a m \[ x c a m y c a m z c a m 1 \] \\begin{bmatrix}x_{c} \\\\ y_{c} \\\\ z_{c} \\\\w_c \\end{bmatrix} =M_{splatam} \\begin{bmatrix}x_{cam} \\\\ y_{cam} \\\\ z_{cam} \\\\1 \\end{bmatrix} xcyczcwc =Msplatam xcamycamzcam1 考虑深度,即z轴的变换有: z c = f a r f a r − n e a r z c a m − ( f a r ⋅ n e a r ) f a r − n e a r w c = z c a m \\begin{align} z_c \&= \\frac{far}{far - near} z_{cam} - \\frac{(far \\cdot near)}{far - near} \\\\ w_c \&= z_{cam} \\end{align} zcwc=far−nearfarzcam−far−near(far⋅near)=zcam 归一化处理,得到NDC坐标 z n = z c w c = f a r f a r − n e a r z c a m − ( f a r ⋅ n e a r ) f a r − n e a r z c a m = f a r − ( f a r ⋅ n e a r ) z c a m f a r − n e a r \\begin{align} z_n \&= \\frac {z_c}{w_c} = \\frac{\\frac{far}{far - near} z_{cam} - \\frac{(far \\cdot near)}{far - near}}{z_{cam}} \\\\ \&= \\frac{far - \\frac{(far \\cdot near)}{z_{cam}}}{far - near} \\end{align} zn=wczc=zcamfar−nearfarzcam−far−near(far⋅near)=far−nearfar−zcam(far⋅near) 故,当 z c a m = n e a r z_{cam} = near zcam=near时, z n = 0 z_n = 0 zn=0, 当 z c a m = f a r z_{cam} = far zcam=far时, z n = 1 z_n = 1 zn=1,所以深度最后是限制在 \[0,1\]。为什么要怎样设计呢,因为使用3DGS渲染时,只考虑深度大于0的。 5、透视投影矩阵线性化: 透视变换是非线性的,高斯分布经过透视变换后会不再符合高斯分布,所以需要线性化。 线性化规则:使用当前点位置来作为泰勒公式的基点来表达领域附近的关系,使用投影矩阵线性化比较麻烦,因此这里直接使用针孔模型的公式线性化。它与使用投影矩阵将3D相机坐标先转换到标准化设备坐标(Normalized Device Coordinates, NDC),然后再转换到像素坐标,这两种方法在数学上是等价的。只不过使用投影矩阵有利于并行处理。 J = \[ f x t z 0 − f x ⋅ t x t z 2 0 f y t z − f y ⋅ t y t z 2 0 0 0 \] J = \\begin{bmatrix} \\frac{fx}{t_z} \& 0 \& -\\frac{fx \\cdot t_x}{t_z\^2} \\\\ 0 \& \\frac{fy}{t_z} \& -\\frac{fy \\cdot t_y}{t_z\^2} \\\\ 0 \& 0 \& 0 \\end{bmatrix} J= tzfx000tzfy0−tz2fx⋅tx−tz2fy⋅ty0 ### 基于针孔模型,图像坐标对相机坐标的雅可比矩阵 在针孔相机模型中,三维空间中的点 P = ( X , Y , Z ) P = (X, Y, Z) P=(X,Y,Z) 投影到二维图像平面上的坐标 p = ( x , y ) p = (x, y) p=(x,y) 可以通过以下公式计算: x = f x X Z + c x x = f_x \\frac{X}{Z} + c_x x=fxZX+cx y = f y Y Z + c y y = f_y \\frac{Y}{Z} + c_y y=fyZY+cy 这里, f x f_x fx 和 f y f_y fy 分别是图像平面在x轴和y轴方向上的焦距,而 c x c_x cx 和 c y c_y cy 是主点偏移量(通常位于图像中心)。如果我们忽略主点偏移量(即假设 c x = c y = 0 c_x = c_y = 0 cx=cy=0),则上述方程简化为: x = f x X Z x = f_x \\frac{X}{Z} x=fxZX y = f y Y Z y = f_y \\frac{Y}{Z} y=fyZY 如果构建一个描述这些投影方程相对于点 (P) 的变化率(即其梯度)的雅可比矩阵: J = \[ ∂ x ∂ X ∂ x ∂ Y ∂ x ∂ Z ∂ y ∂ X ∂ y ∂ Y ∂ y ∂ Z 0 0 0 \] J = \\begin{bmatrix} \\frac{\\partial x}{\\partial X} \& \\frac{\\partial x}{\\partial Y} \& \\frac{\\partial x}{\\partial Z} \\\\ \\frac{\\partial y}{\\partial X} \& \\frac{\\partial y}{\\partial Y} \& \\frac{\\partial y}{\\partial Z} \\\\ 0 \& 0 \& 0 \\end{bmatrix} J= ∂X∂x∂X∂y0∂Y∂x∂Y∂y0∂Z∂x∂Z∂y0 根据上面简化的投影方程,我们可以计算出各个偏导数: * 对于 (x) 方向: ∂ x ∂ X = f x Z , ∂ x ∂ Y = 0 , ∂ x ∂ Z = − f x X Z 2 \\frac{\\partial x}{\\partial X} = \\frac{f_x}{Z}, \\quad \\frac{\\partial x}{\\partial Y} = 0, \\quad \\frac{\\partial x}{\\partial Z} = -\\frac{f_x X}{Z\^2} ∂X∂x=Zfx,∂Y∂x=0,∂Z∂x=−Z2fxX * 对于 (y) 方向: ∂ y ∂ X = 0 , ∂ y ∂ Y = f y Z , ∂ y ∂ Z = − f y Y Z 2 \\frac{\\partial y}{\\partial X} = 0, \\quad \\frac{\\partial y}{\\partial Y} = \\frac{f_y}{Z}, \\quad \\frac{\\partial y}{\\partial Z} = -\\frac{f_y Y}{Z\^2} ∂X∂y=0,∂Y∂y=Zfy,∂Z∂y=−Z2fyY ### 前向传播: f ( x ∣ μ , Σ ) = 1 ( 2 π ) k / 2 ∣ Σ ∣ 1 / 2 exp ( − 1 2 ( x − μ ) ⊤ Σ − 1 ( x − μ ) ) f(\\mathbf{x}\|\\boldsymbol{\\mu},\\boldsymbol{\\Sigma}) = \\frac{1}{(2\\pi)\^{k/2}\|\\boldsymbol{\\Sigma}\|\^{1/2}} \\exp\\left(-\\frac{1}{2}(\\mathbf{x}-\\boldsymbol{\\mu})\^\\top\\boldsymbol{\\Sigma}\^{-1}(\\mathbf{x}-\\boldsymbol{\\mu})\\right) f(x∣μ,Σ)=(2π)k/2∣Σ∣1/21exp(−21(x−μ)⊤Σ−1(x−μ)) p o w e r = ( − 1 2 ( x − μ ) ⊤ Σ − 1 ( x − μ ) ) power = \\left(-\\frac{1}{2}(\\mathbf{x}-\\boldsymbol{\\mu})\^\\top\\boldsymbol{\\Sigma}\^{-1}(\\mathbf{x}-\\boldsymbol{\\mu})\\right) power=(−21(x−μ)⊤Σ−1(x−μ)) α = min ( 0.99 , o p a c i t y ∗ exp ( p o w e r ) ) ; \\alpha = \\min(0.99, opacity \* \\exp(power)); α=min(0.99,opacity∗exp(power)); T t e s t = T ∗ ( 1 − α ) T_{test} = T \* (1 - \\alpha) Ttest=T∗(1−α) 这里T是当前层可用的透明度, T t e s t T_{test} Ttest是经过当前层后留给的下一层的透明度。 光线穿过多个半透明层(例如玻璃、雾气等)。每一层都会吸收一部分光线,并且让剩余的光线通过。如果一个层的不透明度为 α \\alpha α,那么它会阻挡 α \\alpha α 比例的光线,并允许 $(1 - \\alpha) $比例的光线通过。 当光线进入第一层时,它保留了 ( 1 − α 1 ) (1 - \\alpha_1) (1−α1) 的比例。 然后当这部分光线进入第二层时,它再次被削减,只保留 ( 1 − α 2 ) (1 - \\alpha_2) (1−α2) 的比例。 因此,经过两层后的光线量是原始光线量乘以 ( 1 − α 1 ) ∗ ( 1 − α 2 ) (1 - \\alpha_1) \* (1 - \\alpha_2) (1−α1)∗(1−α2)。 c o l o r = c o l o r + c o l o r ∗ α ∗ T color = color + color \*\\alpha \* T color=color+color∗α∗T ### 反向传播: #### 已知: 使用pytorch自动求导得到了损失值对颜色的梯度: d L d C \\frac {dL}{dC} dCdL ##### 求取当前层透明度 T = T / ( 1 − α ) T = T / (1 - \\alpha) T=T/(1−α) #### Alpha Blending Alpha Blending 是一种用于图像合成和透明度处理的常用技术,广泛应用于计算机图形学、图像处理和视频处理等领域。其基本公式用于将两个图像(或图层)按照一定的透明度进行混合。 假设有两个图像 C 1 C_1 C1 和 C 2 C_2 C2,分别表示前景和背景图像的颜色值(通常为 RGB 颜色值)。$ \\alpha$ 表示前景图像 C 1 C_1 C1 的透明度(alpha 值),取值范围为 \[ 0 , 1 \] \[0, 1\] \[0,1\]: * α = 0 \\alpha = 0 α=0 表示完全透明(前景不可见)。 * α = 1 \\alpha = 1 α=1 表示完全不透明(前景完全覆盖背景)。 Alpha Blending 的混合公式如下: C out = α ⋅ C 1 + ( 1 − α ) ⋅ C 2 C_{\\text{out}} = \\alpha \\cdot C_1 + (1 - \\alpha) \\cdot C_2 Cout=α⋅C1+(1−α)⋅C2 其中: * C out C_{\\text{out}} Cout 是混合后的颜色值。 * C 1 C_1 C1 是前景图像的颜色值。 * C 2 C_2 C2 是背景图像的颜色值。 * α \\alpha α 是前景图像的透明度。 1. **前景贡献** : α ⋅ C 1 \\alpha \\cdot C_1 α⋅C1表示前景图像对最终颜色的贡献。透明度 α \\alpha α 越大,前景图像的颜色对最终结果的影响越大。 2. **背景贡献** : ( 1 − α ) ⋅ C 2 (1 - \\alpha) \\cdot C_2 (1−α)⋅C2 表示背景图像对最终颜色的贡献。透明度 α \\alpha α 越小,背景图像的颜色对最终结果的影响越大。 3. **混合结果** :将前景和背景的贡献相加,得到最终的混合颜色 C out C_{\\text{out}} Cout。 ##### 公式推导: 1、 d L d α 、 ∂ L ∂ g \\frac {dL}{d\\alpha}、\\frac{\\partial L}{\\partial \\boldsymbol{g}} dαdL、∂g∂L: 使用Alpha Blending公式,设 b i \\boldsymbol{b}_i bi是第(i)个及其后的Gaussians渲染出来的颜色(三个通道), g i \\boldsymbol{g}_i gi是第(i)个Gaussian的颜色,则有递推公式: b i = α i g i + ( 1 − α i ) b i + 1 \\boldsymbol{b}_i = \\alpha_i \\boldsymbol{g}_i + (1 - \\alpha_i) \\boldsymbol{b}_{i+1} bi=αigi+(1−αi)bi+1 令 T i = ( 1 − α 1 ) ( 1 − α 2 ) ⋯ ( 1 − α i − 1 ) T_i = (1 - \\alpha_1)(1 - \\alpha_2)\\cdots(1 - \\alpha_{i-1}) Ti=(1−α1)(1−α2)⋯(1−αi−1)为第(i)个Gaussian对像素点的透光率, C \\boldsymbol{C} C是像素点的颜色,则有 ∂ L ∂ b i = ∂ L ∂ C ⋅ ∂ b 1 ∂ b 2 ⋅ ∂ b 2 ∂ b 3 ⋯ ∂ b i − 1 ∂ b i \\frac{\\partial L}{\\partial \\boldsymbol{b}_i} = \\frac{\\partial L}{\\partial \\boldsymbol{C}} \\cdot \\frac{\\partial \\boldsymbol{b}_1}{\\partial \\boldsymbol{b}_2} \\cdot \\frac{\\partial \\boldsymbol{b}_2}{\\partial \\boldsymbol{b}_3} \\cdots \\frac{\\partial \\boldsymbol{b}_{i-1}}{\\partial \\boldsymbol{b}_i} ∂bi∂L=∂C∂L⋅∂b2∂b1⋅∂b3∂b2⋯∂bi∂bi−1 = ∂ L ∂ C ⋅ ( 1 − α 1 ) I ⋅ ( 1 − α 2 ) I ⋯ ( 1 − α i − 1 ) I = \\frac{\\partial L}{\\partial \\boldsymbol{C}} \\cdot (1 - \\alpha_1)I \\cdot (1 - \\alpha_2)I \\cdots (1 - \\alpha_{i-1})I =∂C∂L⋅(1−α1)I⋅(1−α2)I⋯(1−αi−1)I = T i ∂ L ∂ C = T_i \\frac{\\partial L}{\\partial \\boldsymbol{C}} =Ti∂C∂L 故 ∂ L ∂ α i = T i ∂ L ∂ C ( g i − b i + 1 ) \\frac{\\partial L}{\\partial \\alpha_i} = T_i \\frac{\\partial L}{\\partial \\boldsymbol{C}} (\\boldsymbol{g}_i - \\boldsymbol{b}_{i+1}) ∂αi∂L=Ti∂C∂L(gi−bi+1) ∂ L ∂ g i = T i α i ∂ L ∂ C \\frac{\\partial L}{\\partial \\boldsymbol{g}_i} = T_i \\alpha_i \\frac{\\partial L}{\\partial \\boldsymbol{C}} ∂gi∂L=Tiαi∂C∂L 2、 ∂ L ∂ σ 、 ∂ L ∂ G \\frac{\\partial L}{\\partial \\sigma} 、\\frac{\\partial L}{\\partial G} ∂σ∂L、∂G∂L 令 α = min ( 0.99 , σ G ) \\alpha = \\min(0.99, \\sigma G) α=min(0.99,σG),其中 σ \\sigma σ 是"opacity",(G) 是正态分布给出的"exponential falloff",则计算损失函数 (L) 对于不透明度 σ \\sigma σ 和指数衰减因子 (G) 的偏导数: ∂ L ∂ σ = G ∂ L ∂ α \\frac{\\partial L}{\\partial \\sigma} = G \\frac{\\partial L}{\\partial \\alpha} ∂σ∂L=G∂α∂L ∂ L ∂ G = σ ∂ L ∂ α \\frac{\\partial L}{\\partial G} = \\sigma \\frac{\\partial L}{\\partial \\alpha} ∂G∂L=σ∂α∂L 3、计算损失函数对2D位置和2D协方差矩阵的逆的梯度 G = exp { − 1 2 d T A d } G = \\exp\\left\\{-\\frac{1}{2} \\boldsymbol{d}\^T A \\boldsymbol{d}\\right\\} G=exp{−21dTAd} d = μ − p \\boldsymbol{d} = \\boldsymbol{\\mu} - \\boldsymbol{p} d=μ−p 其中 p \\boldsymbol{p} p 为像素坐标, μ \\boldsymbol{\\mu} μ 为Gaussian中心的2D坐标, d \\boldsymbol{d} d 为它们之间的位移向量, A A A为椭圆二次型的矩阵,因此 ∂ L ∂ d = − 1 2 G ∂ L ∂ G \[ ( A T + A ) d \] \\frac{\\partial L}{\\partial \\boldsymbol{d}} = -\\frac{1}{2} G \\frac{\\partial L}{\\partial G} \[ (A\^T + A)\\boldsymbol{d}\] ∂d∂L=−21G∂G∂L\[(AT+A)d
∂ L ∂ μ = ∂ L ∂ d \frac{\partial L}{\partial \boldsymbol{\mu}} = \frac{\partial L}{\partial \boldsymbol{d}} ∂μ∂L=∂d∂L
∂ L ∂ A 00 = − 1 2 G ∂ L ∂ G d x 2 \frac{\partial L}{\partial A_{00}} = -\frac{1}{2} G \frac{\partial L}{\partial G} d_x^2 ∂A00∂L=−21G∂G∂Ldx2
∂ L ∂ A 11 = − 1 2 G ∂ L ∂ G d y 2 \frac{\partial L}{\partial A_{11}} = -\frac{1}{2} G \frac{\partial L}{\partial G} d_y^2 ∂A11∂L=−21G∂G∂Ldy2
∂ L ∂ A 01 = − 1 2 G ∂ L ∂ G d x d y \frac{\partial L}{\partial A_{01}} = -\frac{1}{2} G \frac{\partial L}{\partial G} d_x d_y ∂A01∂L=−21G∂G∂Ldxdy
注意计算 ∂ L ∂ μ \frac{\partial L}{\partial \boldsymbol{\mu}} ∂μ∂L 时要乘以像素坐标对像平面坐标的导。
4、损失函数对逆协方差矩阵的梯度传播到原始协方差矩阵
从损失函数关于逆协方差矩阵(共轭矩阵)的梯度出发,通过链式法则推导出损失函数关于原始协方差矩阵元素的梯度。
背景
假设我们有一个2x2的协方差矩阵 Σ \Sigma Σ 和其逆矩阵 Σ − 1 \Sigma^{-1} Σ−1:
Σ = ( a b b c ) , Σ − 1 = 1 a c − b 2 ( c − b − b a ) \Sigma = \begin{pmatrix} a & b \\ b & c \end{pmatrix}, \quad \Sigma^{-1} = \frac{1}{ac - b^2} \begin{pmatrix} c & -b \\ -b & a \end{pmatrix} Σ=(abbc),Σ−1=ac−b21(c−b−ba)
其中, a c − b 2 ac - b^2 ac−b2 是行列式,记作 denom \text{denom} denom。
目标
我们的目标是根据损失函数关于 Σ − 1 \Sigma^{-1} Σ−1 的梯度来推导出损失函数关于 Σ \Sigma Σ 元素的梯度。
推导过程(以 a 元素为例)
1. 计算 ∂ Σ − 1 ∂ a \frac{\partial \Sigma^{-1}}{\partial a} ∂a∂Σ−1
首先,我们需要计算 Σ − 1 \Sigma^{-1} Σ−1 对 a a a 的偏导数。由于 Σ − 1 \Sigma^{-1} Σ−1 可以写成:
Σ − 1 = 1 denom ( c − b − b a ) \Sigma^{-1} = \frac{1}{\text{denom}} \begin{pmatrix} c & -b \\ -b & a \end{pmatrix} Σ−1=denom1(c−b−ba)
我们可以写出 Σ − 1 \Sigma^{-1} Σ−1 各元素对 a a a 的偏导数:
- ∂ ( Σ − 1 ) 11 ∂ a = ∂ ∂ a ( c denom ) = − c ⋅ ( − 2 b ∂ b ∂ a + c ) denom 2 = − c 2 denom 2 \frac{\partial (\Sigma^{-1})_{11}}{\partial a} = \frac{\partial}{\partial a} \left( \frac{c}{\text{denom}} \right) = \frac{-c \cdot (-2b \frac{\partial b}{\partial a} + c)}{\text{denom}^2} = \frac{-c^2}{\text{denom}^2} ∂a∂(Σ−1)11=∂a∂(denomc)=denom2−c⋅(−2b∂a∂b+c)=denom2−c2
- ∂ ( Σ − 1 ) 12 ∂ a = ∂ ∂ a ( − b denom ) = b ⋅ ( 2 b ∂ b ∂ a − c ) denom 2 = 2 b c denom 2 \frac{\partial (\Sigma^{-1})_{12}}{\partial a} = \frac{\partial}{\partial a} \left( \frac{-b}{\text{denom}} \right) = \frac{b \cdot (2b \frac{\partial b}{\partial a} - c)}{\text{denom}^2} = \frac{2bc}{\text{denom}^2} ∂a∂(Σ−1)12=∂a∂(denom−b)=denom2b⋅(2b∂a∂b−c)=denom22bc
- ∂ ( Σ − 1 ) 22 ∂ a = ∂ ∂ a ( a denom ) = denom − a ⋅ ( − 2 b ∂ b ∂ a + c ) denom 2 = denom − a c denom 2 \frac{\partial (\Sigma^{-1})_{22}}{\partial a} = \frac{\partial}{\partial a} \left( \frac{a}{\text{denom}} \right) = \frac{\text{denom} - a \cdot (-2b \frac{\partial b}{\partial a} + c)}{\text{denom}^2} = \frac{\text{denom} - ac}{\text{denom}^2} ∂a∂(Σ−1)22=∂a∂(denoma)=denom2denom−a⋅(−2b∂a∂b+c)=denom2denom−ac
2. 应用链式法则
接下来,应用链式法则计算 ∂ L ∂ a \frac{\partial L}{\partial a} ∂a∂L:
∂ L ∂ a = ∑ i , j ∂ L ∂ ( Σ − 1 ) i j ⋅ ∂ ( Σ − 1 ) i j ∂ a \frac{\partial L}{\partial a} = \sum_{i,j} \frac{\partial L}{\partial (\Sigma^{-1}){ij}} \cdot \frac{\partial (\Sigma^{-1}){ij}}{\partial a} ∂a∂L=i,j∑∂(Σ−1)ij∂L⋅∂a∂(Σ−1)ij
将上述偏导数代入公式中:
∂ L ∂ a = ∂ L ∂ ( Σ − 1 ) 11 ⋅ − c 2 denom 2 + ∂ L ∂ ( Σ − 1 ) 12 ⋅ 2 b c denom 2 + ∂ L ∂ ( Σ − 1 ) 22 ⋅ denom − a c denom 2 \frac{\partial L}{\partial a} = \frac{\partial L}{\partial (\Sigma^{-1}){11}} \cdot \frac{-c^2}{\text{denom}^2} + \frac{\partial L}{\partial (\Sigma^{-1}){12}} \cdot \frac{2bc}{\text{denom}^2} + \frac{\partial L}{\partial (\Sigma^{-1})_{22}} \cdot \frac{\text{denom} - ac}{\text{denom}^2} ∂a∂L=∂(Σ−1)11∂L⋅denom2−c2+∂(Σ−1)12∂L⋅denom22bc+∂(Σ−1)22∂L⋅denom2denom−ac
简化得到:
∂ L ∂ a = 1 denom 2 ( − c 2 ⋅ ∂ L ∂ ( Σ − 1 ) 11 + 2 b c ⋅ ∂ L ∂ ( Σ − 1 ) 12 + ( denom − a c ) ⋅ ∂ L ∂ ( Σ − 1 ) 22 ) \frac{\partial L}{\partial a} = \frac{1}{\text{denom}^2} \left(-c^2 \cdot \frac{\partial L}{\partial (\Sigma^{-1}){11}} + 2bc \cdot \frac{\partial L}{\partial (\Sigma^{-1}){12}} + (\text{denom} - ac) \cdot \frac{\partial L}{\partial (\Sigma^{-1})_{22}}\right) ∂a∂L=denom21(−c2⋅∂(Σ−1)11∂L+2bc⋅∂(Σ−1)12∂L+(denom−ac)⋅∂(Σ−1)22∂L)
这正是代码(3DGS)中的表达式:
cpp
dL_da = denom2inv * (-c * c * dL_dconic.x + 2 * b * c * dL_dconic.y + (denom - a * c) * dL_dconic.z);
其中,denom2inv
就是 1 denom 2 \frac{1}{\text{denom}^2} denom21。
5、损失函数对3D协方差矩阵的梯度
在3D到2D投影的过程中,3D协方差矩阵 V r k V_{rk} Vrk 通过一个变换矩阵 T T T 投影到2D空间中形成2D协方差矩阵 c o v 2 D cov_{2D} cov2D:
c o v 2 D = T T ⋅ c o v 3 D ⋅ T cov_{2D} = T^T \cdot cov_{3D} \cdot T cov2D=TT⋅cov3D⋅T
其中, T T T 是从3D空间到2D屏幕空间的变换矩阵,设T为定值, c o v 3 D cov_{3D} cov3D为变量,
∂ L ∂ c o v 3 D = ∂ L ∂ c o v 2 D ∂ c o v 2 D ∂ c o v 3 D = ∂ L ∂ c o v 2 D T T T \frac{\partial L}{\partial cov_{3D} } = \frac{\partial L}{\partial cov_{2D} } \frac{\partial cov_{2D}}{\partial cov_{3D} } = \frac{\partial L}{\partial cov_{2D} } T^TT ∂cov3D∂L=∂cov2D∂L∂cov3D∂cov2D=∂cov2D∂LTTT
6、损失函数对3D空间到2D屏幕空间的变换矩阵的梯度
设T为变值, c o v 3 D cov_{3D} cov3D为定值 ,则:
∂ L ∂ T = ∂ L ∂ c o v 2 D ∂ c o v 2 D ∂ T = ∂ L ∂ c o v 2 D c o v 3 D ( T T + T ) \frac{\partial L}{\partial T } = \frac{\partial L}{\partial cov_{2D} } \frac{\partial cov_{2D}}{\partial T } = \frac{\partial L}{\partial cov_{2D} } cov_{3D}(T^T+T) ∂T∂L=∂cov2D∂L∂T∂cov2D=∂cov2D∂Lcov3D(TT+T)
7、损失函数对J的梯度
T = W J T=WJ T=WJ
∂ L ∂ J = ∂ L ∂ T ∂ T ∂ J = ∂ L ∂ T W \frac{\partial L}{\partial J } = \frac{\partial L}{\partial T } \frac{\partial T}{\partial J} = \frac{\partial L}{\partial T } W ∂J∂L=∂T∂L∂J∂T=∂T∂LW
8、损失函数对3D位置的梯度(协方差矩阵)
由
J = [ ∂ x ∂ X ∂ x ∂ Y ∂ x ∂ Z ∂ y ∂ X ∂ y ∂ Y ∂ y ∂ Z 0 0 0 ] J = \begin{bmatrix} \frac{\partial x}{\partial X} & \frac{\partial x}{\partial Y} & \frac{\partial x}{\partial Z} \\ \frac{\partial y}{\partial X} & \frac{\partial y}{\partial Y} & \frac{\partial y}{\partial Z} \\ 0 & 0 & 0 \end{bmatrix} J= ∂X∂x∂X∂y0∂Y∂x∂Y∂y0∂Z∂x∂Z∂y0
根据上面简化的投影方程,我们可以计算出各个偏导数:
- 对于 (x) 方向: ∂ x ∂ X = f x Z , ∂ x ∂ Y = 0 , ∂ x ∂ Z = − f x X Z 2 \frac{\partial x}{\partial X} = \frac{f_x}{Z}, \quad \frac{\partial x}{\partial Y} = 0, \quad \frac{\partial x}{\partial Z} = -\frac{f_x X}{Z^2} ∂X∂x=Zfx,∂Y∂x=0,∂Z∂x=−Z2fxX
- 对于 (y) 方向: ∂ y ∂ X = 0 , ∂ y ∂ Y = f y Z , ∂ y ∂ Z = − f y Y Z 2 \frac{\partial y}{\partial X} = 0, \quad \frac{\partial y}{\partial Y} = \frac{f_y}{Z}, \quad \frac{\partial y}{\partial Z} = -\frac{f_y Y}{Z^2} ∂X∂y=0,∂Y∂y=Zfy,∂Z∂y=−Z2fyY
因此,
∂ L ∂ X = ∂ L ∂ J ∂ J ∂ X \frac{\partial L}{\partial X } = \frac{\partial L}{\partial J } \frac{\partial J}{\partial X} ∂X∂L=∂J∂L∂X∂J
9、损失函数对3D位置的梯度(位置带来的误差)
(1)透视投影变换
给定一个3D点 m = ( m x , m y , m z ) m = (m_x, m_y, m_z) m=(mx,my,mz),其齐次坐标为 [ m x , m y , m z , 1 ] [m_x, m_y, m_z, 1] [mx,my,mz,1]。应用4x4的透视投影矩阵 proj
后,得到新的齐次坐标:
m_hom = proj × [ m x , m y , m z , 1 ] T \text{m\_hom} = \text{proj} \times [m_x, m_y, m_z, 1]^T m_hom=proj×[mx,my,mz,1]T
其中,proj
是一个4x4的投影矩阵。为了获得2D屏幕坐标,我们需要进行透视除法(即除以第四个分量 (w)):
x ′ = m_hom x m_hom w , y ′ = m_hom y m_hom w x' = \frac{\text{m\_hom}_x}{\text{m\_hom}_w}, \quad y' = \frac{\text{m\_hom}_y}{\text{m\_hom}_w} x′=m_homwm_homx,y′=m_homwm_homy
假设 proj
矩阵的形式如下:
proj = | p00 p01 p02 p03 |
| p10 p11 p12 p13 |
| p20 p21 p22 p23 |
| p30 p31 p32 p33 |
则有:
m_hom x = p 00 ⋅ m x + p 01 ⋅ m y + p 02 ⋅ m z + p 03 \text{m\_hom}_x = p00 \cdot m_x + p01 \cdot m_y + p02 \cdot m_z + p03 m_homx=p00⋅mx+p01⋅my+p02⋅mz+p03
m_hom y = p 10 ⋅ m x + p 11 ⋅ m y + p 12 ⋅ m z + p 13 \text{m\_hom}_y = p10 \cdot m_x + p11 \cdot m_y + p12 \cdot m_z + p13 m_homy=p10⋅mx+p11⋅my+p12⋅mz+p13
m_hom z = p 20 ⋅ m x + p 21 ⋅ m y + p 22 ⋅ m z + p 23 \text{m\_hom}_z = p20 \cdot m_x + p21 \cdot m_y + p22 \cdot m_z + p23 m_homz=p20⋅mx+p21⋅my+p22⋅mz+p23
m_hom w = p 30 ⋅ m x + p 31 ⋅ m y + p 32 ⋅ m z + p 33 \text{m\_hom}_w = p30 \cdot m_x + p31 \cdot m_y + p32 \cdot m_z + p33 m_homw=p30⋅mx+p31⋅my+p32⋅mz+p33
然后,我们进行透视除法:
x ′ = m_hom x m_hom w , y ′ = m_hom y m_hom w x' = \frac{\text{m\_hom}_x}{\text{m\_hom}_w}, \quad y' = \frac{\text{m\_hom}_y}{\text{m\_hom}_w} x′=m_homwm_homx,y′=m_homwm_homy
2. 计算偏导数
为了计算损失函数 L L L 关于3D均值 m m m的梯度,我们需要首先计算 x ′ x' x′ 和 y ′ y' y′ 对 m x , m y , m z m_x, m_y, m_z mx,my,mz 的偏导数。
对 (x') 的偏导数
∂ x ′ ∂ m i = ∂ ∂ m i ( m_hom x m_hom w ) \frac{\partial x'}{\partial m_i} = \frac{\partial}{\partial m_i} \left( \frac{\text{m\_hom}_x}{\text{m\_hom}_w} \right) ∂mi∂x′=∂mi∂(m_homwm_homx)
使用商规则:
∂ x ′ ∂ m i = m_hom w ⋅ ∂ m_hom x ∂ m i − m_hom x ⋅ ∂ m_hom w ∂ m i m_hom w 2 \frac{\partial x'}{\partial m_i} = \frac{\text{m\_hom}_w \cdot \frac{\partial \text{m\_hom}_x}{\partial m_i} - \text{m\_hom}_x \cdot \frac{\partial \text{m\_hom}_w}{\partial m_i}}{\text{m\_hom}_w^2} ∂mi∂x′=m_homw2m_homw⋅∂mi∂m_homx−m_homx⋅∂mi∂m_homw
具体到每个维度:
-
对 (m_x) 的偏导数 :
∂ x ′ ∂ m x = m_hom w ⋅ p 00 − m_hom x ⋅ p 30 m_hom w 2 = p 00 m_hom w − p 30 ⋅ m_hom x m_hom w 2 \frac{\partial x'}{\partial m_x} = \frac{\text{m\_hom}_w \cdot p00 - \text{m\_hom}_x \cdot p30}{\text{m\_hom}_w^2} = \frac{p00}{\text{m\_hom}_w} - \frac{p30 \cdot \text{m\_hom}_x}{\text{m\_hom}_w^2} ∂mx∂x′=m_homw2m_homw⋅p00−m_homx⋅p30=m_homwp00−m_homw2p30⋅m_homx -
对 (m_y) 的偏导数 :
∂ x ′ ∂ m y = m_hom w ⋅ p 01 − m_hom x ⋅ p 31 m_hom w 2 = p 01 m_hom w − p 31 ⋅ m_hom x m_hom w 2 \frac{\partial x'}{\partial m_y} = \frac{\text{m\_hom}_w \cdot p01 - \text{m\_hom}_x \cdot p31}{\text{m\_hom}_w^2} = \frac{p01}{\text{m\_hom}_w} - \frac{p31 \cdot \text{m\_hom}_x}{\text{m\_hom}_w^2} ∂my∂x′=m_homw2m_homw⋅p01−m_homx⋅p31=m_homwp01−m_homw2p31⋅m_homx -
对 (m_z) 的偏导数 :
∂ x ′ ∂ m z = m_hom w ⋅ p 02 − m_hom x ⋅ p 32 m_hom w 2 = p 02 m_hom w − p 32 ⋅ m_hom x m_hom w 2 \frac{\partial x'}{\partial m_z} = \frac{\text{m\_hom}_w \cdot p02 - \text{m\_hom}_x \cdot p32}{\text{m\_hom}_w^2} = \frac{p02}{\text{m\_hom}_w} - \frac{p32 \cdot \text{m\_hom}_x}{\text{m\_hom}_w^2} ∂mz∂x′=m_homw2m_homw⋅p02−m_homx⋅p32=m_homwp02−m_homw2p32⋅m_homx
对 (y') 的偏导数
类似地,对于 (y'):
∂ y ′ ∂ m i = ∂ ∂ m i ( m_hom y m_hom w ) \frac{\partial y'}{\partial m_i} = \frac{\partial}{\partial m_i} \left( \frac{\text{m\_hom}_y}{\text{m\_hom}_w} \right) ∂mi∂y′=∂mi∂(m_homwm_homy)
使用商规则:
∂ y ′ ∂ m i = m_hom w ⋅ ∂ m_hom y ∂ m i − m_hom y ⋅ ∂ m_hom w ∂ m i m_hom w 2 \frac{\partial y'}{\partial m_i} = \frac{\text{m\_hom}_w \cdot \frac{\partial \text{m\_hom}_y}{\partial m_i} - \text{m\_hom}_y \cdot \frac{\partial \text{m\_hom}_w}{\partial m_i}}{\text{m\_hom}_w^2} ∂mi∂y′=m_homw2m_homw⋅∂mi∂m_homy−m_homy⋅∂mi∂m_homw
具体到每个维度:
-
对 m x m_x mx 的偏导数 :
∂ y ′ ∂ m x = m_hom w ⋅ p 10 − m_hom y ⋅ p 30 m_hom w 2 = p 10 m_hom w − p 30 ⋅ m_hom y m_hom w 2 \frac{\partial y'}{\partial m_x} = \frac{\text{m\_hom}_w \cdot p10 - \text{m\_hom}_y \cdot p30}{\text{m\_hom}_w^2} = \frac{p10}{\text{m\_hom}_w} - \frac{p30 \cdot \text{m\_hom}_y}{\text{m\_hom}_w^2} ∂mx∂y′=m_homw2m_homw⋅p10−m_homy⋅p30=m_homwp10−m_homw2p30⋅m_homy -
对 m y m_y my的偏导数 :
∂ y ′ ∂ m y = m_hom w ⋅ p 11 − m_hom y ⋅ p 31 m_hom w 2 = p 11 m_hom w − p 31 ⋅ m_hom y m_hom w 2 \frac{\partial y'}{\partial m_y} = \frac{\text{m\_hom}_w \cdot p11 - \text{m\_hom}_y \cdot p31}{\text{m\_hom}_w^2} = \frac{p11}{\text{m\_hom}_w} - \frac{p31 \cdot \text{m\_hom}_y}{\text{m\_hom}_w^2} ∂my∂y′=m_homw2m_homw⋅p11−m_homy⋅p31=m_homwp11−m_homw2p31⋅m_homy -
对 m z m_z mz 的偏导数 :
∂ y ′ ∂ m z = m_hom w ⋅ p 12 − m_hom y ⋅ p 32 m_hom w 2 = p 12 m_hom w − p 32 ⋅ m_hom y m_hom w 2 \frac{\partial y'}{\partial m_z} = \frac{\text{m\_hom}_w \cdot p12 - \text{m\_hom}_y \cdot p32}{\text{m\_hom}_w^2} = \frac{p12}{\text{m\_hom}_w} - \frac{p32 \cdot \text{m\_hom}_y}{\text{m\_hom}_w^2} ∂mz∂y′=m_homw2m_homw⋅p12−m_homy⋅p32=m_homwp12−m_homw2p32⋅m_homy
3. 使用链式法则计算梯度
现在我们有了所有需要的偏导数,可以使用链式法则来计算损失函数 (L) 关于3D均值 (m) 的梯度。
假设已知损失函数关于2D投影点的梯度 dL_dmean2D[idx]
,我们可以将其反向传播回3D空间中的均值 (m)。
对于每个维度 i ∈ { x , y , z } i \in \{x, y, z\} i∈{x,y,z},我们有:
∂ L ∂ m i = ∑ j ∈ { x ′ , y ′ } ( ∂ x ′ ∂ m i ⋅ ∂ L ∂ x ′ + ∂ y ′ ∂ m i ⋅ ∂ L ∂ y ′ ) \frac{\partial L}{\partial m_i} = \sum_{j \in \{x', y'\}} \left( \frac{\partial x'}{\partial m_i} \cdot \frac{\partial L}{\partial x'} + \frac{\partial y'}{\partial m_i} \cdot \frac{\partial L}{\partial y'} \right) ∂mi∂L=j∈{x′,y′}∑(∂mi∂x′⋅∂x′∂L+∂mi∂y′⋅∂y′∂L)
10、损失函数对协方差参数S、旋转矩阵R(四元数)的梯度
M = S ∗ R M = S * R M=S∗R
c o v 3 D = M T M cov_{3D} = M^TM cov3D=MTM
所以
∂ L ∂ M = 2 M ∂ L ∂ σ \frac{\partial L}{\partial M} = 2M\frac{\partial L}{\partial \sigma} ∂M∂L=2M∂σ∂L
∂ L ∂ S = R ∂ L ∂ M T \frac{\partial L}{\partial S} = R\frac{\partial L}{\partial M^T} ∂S∂L=R∂MT∂L
∂ L ∂ R = S ∂ L ∂ M T \frac{\partial L}{\partial R} = S\frac{\partial L}{\partial M^T} ∂R∂L=S∂MT∂L
为了推导损失函数关于四元数 (q = (r, x, y, z)) 的梯度,我们需要从旋转矩阵 (R) 对四元数的偏导数出发,并结合链式法则来计算最终的梯度。下面将详细解释如何得到这些公式。
1. 四元数与旋转矩阵的关系
给定一个单位四元数 (q = (r, x, y, z)),其对应的旋转矩阵 (R) 可以表示为:
R ( q ) = [ 1 − 2 ( y 2 + z 2 ) 2 ( x y − r z ) 2 ( x z + r y ) 2 ( x y + r z ) 1 − 2 ( x 2 + z 2 ) 2 ( y z − r x ) 2 ( x z − r y ) 2 ( y z + r x ) 1 − 2 ( x 2 + y 2 ) ] R(q) = \begin{bmatrix} 1 - 2(y^2 + z^2) & 2(xy - rz) & 2(xz + ry) \\ 2(xy + rz) & 1 - 2(x^2 + z^2) & 2(yz - rx) \\ 2(xz - ry) & 2(yz + rx) & 1 - 2(x^2 + y^2) \end{bmatrix} R(q)= 1−2(y2+z2)2(xy+rz)2(xz−ry)2(xy−rz)1−2(x2+z2)2(yz+rx)2(xz+ry)2(yz−rx)1−2(x2+y2)
2. 计算旋转矩阵 (R) 对四元数 (q) 的偏导数
对于每个四元数分量 q i q_i qi( i ∈ { r , x , y , z } i \in \{r, x, y, z\} i∈{r,x,y,z}),我们需要计算其对旋转矩阵 (R) 中每个元素的偏导数。
偏导数的计算
-
∂ R ∂ r \frac{\partial R}{\partial r} ∂r∂R :
∂ R ∂ r = [ 0 − 2 z 2 y 2 z 0 − 2 x − 2 y 2 x 0 ] \frac{\partial R}{\partial r} = \begin{bmatrix} 0 & -2z & 2y \\ 2z & 0 & -2x \\ -2y & 2x & 0 \end{bmatrix} ∂r∂R= 02z−2y−2z02x2y−2x0 -
∂ R ∂ x \frac{\partial R}{\partial x} ∂x∂R :
∂ R ∂ x = [ − 4 x 2 y 2 z 2 y 0 − 2 r 2 z 2 r 0 ] \frac{\partial R}{\partial x} = \begin{bmatrix} -4x & 2y & 2z \\ 2y & 0 & -2r \\ 2z & 2r & 0 \end{bmatrix} ∂x∂R= −4x2y2z2y02r2z−2r0 -
∂ R ∂ y \frac{\partial R}{\partial y} ∂y∂R :
∂ R ∂ y = [ 0 2 x − 2 r 2 x − 4 y 2 z 2 r 2 z 0 ] \frac{\partial R}{\partial y} = \begin{bmatrix} 0 & 2x & -2r \\ 2x & -4y & 2z \\ 2r & 2z & 0 \end{bmatrix} ∂y∂R= 02x2r2x−4y2z−2r2z0 -
∂ R ∂ z \frac{\partial R}{\partial z} ∂z∂R :
∂ R ∂ z = [ 0 2 r 2 x − 2 r 0 2 y 2 x 2 y − 4 z ] \frac{\partial R}{\partial z} = \begin{bmatrix} 0 & 2r & 2x \\ -2r & 0 & 2y \\ 2x & 2y & -4z \end{bmatrix} ∂z∂R= 0−2r2x2r02y2x2y−4z
3. 应用链式法则
根据链式法则,损失函数关于四元数 (q) 的梯度可以表示为:
∂ L ∂ q = ∑ i , j ( ∂ R i j ∂ q k ⋅ ∂ L ∂ R i j ) \frac{\partial L}{\partial q} = \sum_{i,j} \left( \frac{\partial R_{ij}}{\partial q_k} \cdot \frac{\partial L}{\partial R_{ij}} \right) ∂q∂L=i,j∑(∂qk∂Rij⋅∂Rij∂L)
其中, ∂ L ∂ R i j \frac{\partial L}{\partial R_{ij}} ∂Rij∂L是损失函数关于旋转矩阵 (R) 的梯度,使用求和符号把每个元素的梯度累加起来。
补充:
在协方差矩阵的梯度转换过程中乘以0.5,主要是因为协方差矩阵是对称矩阵。这意味着它的元素满足 Σ i j = Σ j i \Sigma_{ij} = \Sigma_{ji} Σij=Σji,因此在计算损失函数关于这些元素的梯度时,需要考虑到这种对称性。
协方差矩阵及其对称性
对于一个3D协方差矩阵 Σ \Sigma Σ,它是一个3x3的对称矩阵:
Σ = [ Σ 00 Σ 01 Σ 02 Σ 10 Σ 11 Σ 12 Σ 20 Σ 21 Σ 22 ] \Sigma = \begin{bmatrix} \Sigma_{00} & \Sigma_{01} & \Sigma_{02} \\ \Sigma_{10} & \Sigma_{11} & \Sigma_{12} \\ \Sigma_{20} & \Sigma_{21} & \Sigma_{22} \end{bmatrix} Σ= Σ00Σ10Σ20Σ01Σ11Σ21Σ02Σ12Σ22
由于 Σ \Sigma Σ 是对称的,我们有:
- Σ 01 = Σ 10 \Sigma_{01} = \Sigma_{10} Σ01=Σ10
- Σ 02 = Σ 20 \Sigma_{02} = \Sigma_{20} Σ02=Σ20
- Σ 12 = Σ 21 \Sigma_{12} = \Sigma_{21} Σ12=Σ21
因此,在优化过程中,当我们考虑某个非对角线元素(如 Σ 01 \Sigma_{01} Σ01)的变化对损失函数的影响时,实际上是在同时考虑了两个等效变化:一个是 Σ 01 \Sigma_{01} Σ01 的变化,另一个是 Σ 10 \Sigma_{10} Σ10 的变化。这两个变化对损失函数的影响是相同的,因为它们实际上是同一个值。
梯度计算中的对称性处理
假设损失函数 L L L 关于协方差矩阵 Σ \Sigma Σ 的梯度被存储在一个数组 dL_dcov3D
中,按照以下顺序存储:
dL_dcov3D[0]
: ∂ L ∂ Σ 00 \frac{\partial L}{\partial \Sigma_{00}} ∂Σ00∂LdL_dcov3D[1]
: ∂ L ∂ Σ 01 \frac{\partial L}{\partial \Sigma_{01}} ∂Σ01∂LdL_dcov3D[2]
: ∂ L ∂ Σ 02 \frac{\partial L}{\partial \Sigma_{02}} ∂Σ02∂LdL_dcov3D[3]
: ∂ L ∂ Σ 11 \frac{\partial L}{\partial \Sigma_{11}} ∂Σ11∂LdL_dcov3D[4]
: ∂ L ∂ Σ 12 \frac{\partial L}{\partial \Sigma_{12}} ∂Σ12∂LdL_dcov3D[5]
: ∂ L ∂ Σ 22 \frac{\partial L}{\partial \Sigma_{22}} ∂Σ22∂L
由于 Σ \Sigma Σ的对称性,对于每个非对角线元素(如 Σ 01 \Sigma_{01} Σ01),其梯度应该平均分配给 Σ 01 \Sigma_{01} Σ01 和 Σ 10 \Sigma_{10} Σ10。因此,在将这些梯度重新组织成矩阵形式时,我们需要将非对角线元素的梯度除以2。
代码实现
cpp
glm::mat3 dL_dSigma = glm::mat3(
dL_dcov3D[0], 0.5f * dL_dcov3D[1], 0.5f * dL_dcov3D[2],
0.5f * dL_dcov3D[1], dL_dcov3D[3], 0.5f * dL_dcov3D[4],
0.5f * dL_dcov3D[2], 0.5f * dL_dcov3D[4], dL_dcov3D[5]
);
- 对角线元素 (如
dL_dcov3D[0]
,dL_dcov3D[3]
,dL_dcov3D[5]
)直接使用,因为它们只对应一个位置。 - 非对角线元素 (如
dL_dcov3D[1]
,dL_dcov3D[2]
,dL_dcov3D[4]
)乘以0.5,因为在反向传播过程中,它们代表了两个等价位置的梯度(例如,dL_dcov3D[1]
同时代表 ∂ L ∂ Σ 01 \frac{\partial L}{\partial \Sigma_{01}} ∂Σ01∂L 和 ∂ L ∂ Σ 10 \frac{\partial L}{\partial \Sigma_{10}} ∂Σ10∂L)。
具体解释
假设我们有一个损失函数 (L),其关于协方差矩阵 (\Sigma) 的梯度为:
- ∂ L ∂ Σ 01 = g 01 \frac{\partial L}{\partial \Sigma_{01}} = g_{01} ∂Σ01∂L=g01
- ∂ L ∂ Σ 10 = g 10 \frac{\partial L}{\partial \Sigma_{10}} = g_{10} ∂Σ10∂L=g10
由于 Σ 01 = Σ 10 \Sigma_{01} = \Sigma_{10} Σ01=Σ10,我们有 g 01 = g 10 g_{01} = g_{10} g01=g10。因此,在实际计算中,我们将这两个梯度合并为一个值,并在构建梯度矩阵时将其除以2:
Gradient matrix element at ( 0 , 1 ) = g 01 2 \text{Gradient matrix element at } (0, 1) = \frac{g_{01}}{2} Gradient matrix element at (0,1)=2g01
Gradient matrix element at ( 1 , 0 ) = g 10 2 \text{Gradient matrix element at } (1, 0) = \frac{g_{10}}{2} Gradient matrix element at (1,0)=2g10
这样做确保了我们在反向传播过程中正确地反映了协方差矩阵的对称性,避免了重复计算或不正确的梯度分配。
总结
乘以0.5的原因在于协方差矩阵的对称性。为了正确处理这种对称性并确保梯度的正确分配,非对角线元素的梯度在构建梯度矩阵时需要除以2。这样可以保证在优化过程中,每个参数更新步骤都准确反映了损失函数对各个参数的实际影响。