模型降阶方法之 POD
POD 方法是 PCA 在更一般的函数空间的推广,POD 是 PCA 的一般化,PCA 是 POD 的特例。
从简单的例子说起
例子一
我们考虑一个向量值常微分方程组( ODEs ):
{
d
u
1
d
t
+
u
1
=
f
1
d
u
2
u
2
+
u
2
=
f
2
d
u
3
d
t
+
u
3
=
f
1
\left\{\begin{array}{l} \frac{d u_{1}}{d t}+u_{1}=f_{1} \\ \frac{d u_{2}}{u_{2}}+u_{2}=f_{2} \\ \frac{d u_{3}}{d t}+u_{3}=f_{1} \end{array}\right.
⎩
⎨
⎧dtdu1+u1=f1u2du2+u2=f2dtdu3+u3=f1
我们认真观察可以发现,这个 ODEs 是具有冗余的,也就是说,
u
3
=
u
1
u_3=u_1
u3=u1,我们只要求解前两个方程(约化方程):
{
d
u
1
d
t
+
u
1
=
f
1
d
u
2
u
2
+
u
2
=
f
2
\left\{\begin{array}{l} \frac{d u_{1}}{d t}+u_{1}=f_{1} \\ \frac{d u_{2}}{u_{2}}+u_{2}=f_{2} \\ \end{array}\right.
{dtdu1+u1=f1u2du2+u2=f2
再令
u
3
=
u
1
u_3 = u_1
u3=u1 就可以了,削减了计算的复杂度。那么,如何从第一个方程组到第二个方程组呢?事实上,增加一个辅助矩阵,就可以把第一个方程表达组表达为:
(
1
0
0
1
1
0
)
(
d
u
1
d
t
d
u
2
d
t
)
+
(
1
0
0
1
1
0
)
(
u
1
u
2
)
=
(
1
0
0
1
1
0
)
(
f
1
f
2
)
\left(\begin{array}{ll} 1 & 0 \\ 0 & 1 \\ 1 & 0 \end{array}\right)\left(\begin{array}{l} \frac{d u_{1}}{d t}\\ \frac{d u_{2}}{d t} \end{array}\right)+\left(\begin{array}{ll} 1 & 0 \\ 0 & 1 \\ 1 & 0 \end{array}\right)\left(\begin{array}{l} u_{1} \\ u_{2} \end{array}\right)=\left(\begin{array}{ll} 1 & 0 \\ 0 & 1 \\ 1 & 0 \end{array}\right)\left(\begin{array}{l} f_{1} \\ f_{2} \end{array}\right)
⎝
⎛101010⎠
⎞(dtdu1dtdu2)+⎝
⎛101010⎠
⎞(u1u2)=⎝
⎛101010⎠
⎞(f1f2)
左右两边再左乘矩阵
V
T
:
=
(
1
0
0
1
1
0
)
T
V ^T:=\left( \begin{array}{ll} 1 & 0 \\ 0 & 1 \\ 1 & 0 \end{array}\right)^T
VT:=⎝
⎛101010⎠
⎞T
便可得到方程:
{
2
d
u
1
d
t
+
2
u
1
=
2
f
1
d
u
2
u
2
+
u
2
=
f
2
\left\{\begin{array}{l} 2\frac{d u_{1}}{d t}+2u_{1}=2f_{1} \\ \frac{d u_{2}}{u_{2}}+u_{2}=f_{2} \\ \end{array}\right.
{2dtdu1+2u1=2f1u2du2+u2=f2
这就和上述约化方程等价类。从这个例子中,我们看出,一个三阶的方程,我们经过简单的处理,就变成了二阶的方程。我们看到了模型降阶的可能性。
例子二
我们再看一个例子:
(
1
2
0
2
1
0
0
0
3
)
(
d
u
1
d
t
d
u
2
d
t
d
u
3
d
t
)
+
(
1
2
0
2
1
0
0
0
3
)
(
u
1
u
2
u
3
)
=
(
f
1
f
2
f
1
+
f
2
)
\left(\begin{array}{lll} 1 & 2 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 3 \end{array}\right)\left(\begin{array}{c} \frac{d u_{1}}{d t} \\ \frac{d u_{2}}{d t} \\ \frac{d u_{3}}{d t} \end{array}\right)+\left(\begin{array}{ccc} 1 & 2 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 3 \end{array}\right)\left(\begin{array}{l} u_{1} \\ u_{2} \\ u_{3} \end{array}\right)=\left(\begin{array}{c} f_{1} \\ f_{2} \\ f_{1}+f_{2} \end{array}\right)
⎝
⎛120210003⎠
⎞⎝
⎛dtdu1dtdu2dtdu3⎠
⎞+⎝
⎛120210003⎠
⎞⎝
⎛u1u2u3⎠
⎞=⎝
⎛f1f2f1+f2⎠
⎞
假设,我们令
u
3
=
u
1
+
u
2
u_3=u_1+u_2
u3=u1+u2,那么,只要前两个方程满足,第三个方程自然满足。令,
(
u
1
u
2
u
3
)
=
(
1
0
0
1
1
1
)
(
u
1
u
2
)
:
=
V
(
u
1
u
2
)
\left(\begin{array}{l} u_{1} \\ u_{2} \\ u_{3} \end{array}\right)=\left(\begin{array}{ll} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{array}\right)\left(\begin{array}{l} u_{1} \\ u_{2} \end{array}\right):=V\left(\begin{array}{l} u_{1} \\ u_{2} \end{array}\right)
⎝
⎛u1u2u3⎠
⎞=⎝
⎛101011⎠
⎞(u1u2):=V(u1u2)
代入上式,并左乘
V
T
V^T
VT 可得:
(
4
5
5
4
)
(
d
u
1
d
t
d
u
2
d
t
)
+
(
4
5
5
4
)
(
u
1
u
2
)
=
(
2
f
1
+
f
2
2
f
2
+
f
1
)
\left(\begin{array}{ll} 4 & 5 \\ 5 & 4 \end{array}\right)\left(\begin{array}{l} \frac{d u_{1}}{d t} \\ \frac{d u_{2}}{d t} \end{array}\right)+\left(\begin{array}{ll} 4 & 5 \\ 5 & 4 \end{array}\right)\left(\begin{array}{l} u_{1} \\ u_{2} \end{array}\right)=\left(\begin{array}{c} 2 f_{1}+f_{2} \\ 2 f_{2}+f_{1} \end{array}\right)
(4554)(dtdu1dtdu2)+(4554)(u1u2)=(2f1+f22f2+f1)
容易知道,这个方程组的求解其实就等价于原方程租的前两个方程的求解。如此,我们便把一个三阶的问题,降成了二阶的问题。
POD 的核心思想
上面的两个例子,分别满足 u 3 = u 1 u_3 = u_1 u3=u1 和 u 3 = u 1 + u 2 u_3 = u_1+u_2 u3=u1+u2。这揭示一种共性,即虽然是解空间是一个三维的空间,但是他们的解都位于一个二维的超平面里面,也就是说,用两个变量,就可以把三维的向量值解表达出来了。从几何直观上看, u 3 = u 1 u_3 = u_1 u3=u1 和 u 3 = u 1 + u 2 u_3 = u_1+u_2 u3=u1+u2 反应的是 z = x z=x z=x 和 z = x + y z=x+y z=x+y ,分别表示的是两个三维空间中的平面,而上述方程组的解就位于这两个平面内,就给了我们足够充分的降阶理由。也就是说,我们可以用低维的超平面的一个基组去表达高维中间中的解表达进行降维,这不就是主成分分析的思想嘛。
在更高维的空间中,一般的 ODEs 的解的分布区域也不是充满整个空间的,它是位于一个特定的平面或者流形上的。由上述例子得到的启发,我们似乎可以把 ODEs 进行降阶。我们只要找到解所在的低维超平面即可。
那么问题来了,上述的两个例子很简单,我们用肉眼都能观察到方程之间的关系,从而进行降阶,对于更一般的问题,我们应该怎么处理呢?这里,我们就可以用所谓的 POD(Proper Orthogonal Decomposition)方法。
我们想要找到解所在的超平面,那么事实上,我们只要找到这个超平面上足够多个“典型”的点,那么事实上,我们就获得了平面的信息。这些离散的典型点,我们可以通过 “snapshot”(快照)的方式获得,即通过一般的数值解法,获得不同时刻的解的数值表征。
这些数值算法算出来的典型点,因为数值误差和方程固有的冗余两方面的原因,不一定都位于同一个超平面内,但是我们可以令这种 “差距” 尽可能地小,主成分分析就能很好地做到这点。事实上,这种做法在降低维度的同时刚好舍弃数值误差带来的“噪声”,所以效果很好。天下没有免费的午餐,这是一种基于已有数值解的降阶方法。
POD 的一般做法
我们来够了一下 POD 方法的一般做法。首先我们考虑一个含参的模型:
E
(
μ
)
d
u
d
t
+
A
(
μ
)
u
=
f
(
μ
,
u
)
\boldsymbol{E}(\boldsymbol{\mu}) \frac{\mathrm{d} \boldsymbol{u}}{\mathrm{d} t}+\boldsymbol{A}(\boldsymbol{\mu}) \boldsymbol{u}=\boldsymbol{f}(\boldsymbol{\mu}, \boldsymbol{u})
E(μ)dtdu+A(μ)u=f(μ,u)
其中,
u
∈
R
n
\mathbf{u} \in \mathbb{R}^{n}
u∈Rn,
A
(
μ
)
∈
R
n
×
n
\boldsymbol{A}(\boldsymbol{\mu}) \in \mathbb{R}^{n \times n}
A(μ)∈Rn×n,
E
(
μ
)
∈
R
n
×
n
\boldsymbol{E}(\boldsymbol{\mu}) \in \mathbb{R}^{n \times n}
E(μ)∈Rn×n,
f
(
μ
,
u
)
∈
R
n
\boldsymbol{f}(\boldsymbol{\mu}, \mathbf{u}) \in \mathbb{R}^{n}
f(μ,u)∈Rn。我们先考虑右端项是线性的不含参的模型:
E
d
u
d
t
+
A
u
=
b
\boldsymbol{E} \frac{\mathrm{d} \boldsymbol{u}}{\mathrm{d} t}+\boldsymbol{A} \boldsymbol{u}=\boldsymbol{b}
Edtdu+Au=b
我们取
n
s
n_s
ns 个时刻的数值方法得到解( snapshots )每个时刻一列,把它排成一个矩阵:
U
∈
R
n
×
n
s
,
U
=
[
u
1
,
u
2
,
…
,
u
n
s
]
\boldsymbol{U} \in \mathbb{R}^{n \times n_{s}}, \boldsymbol{U}=\left[\mathbf{u}_{1}, \mathbf{u}_{2}, \ldots, \mathbf{u}_{n_{s}}\right]
U∈Rn×ns,U=[u1,u2,…,uns]
我们对 U \boldsymbol{U} U 做(满秩)奇异值分解如下:
U = V Σ W T \boldsymbol{U}=\boldsymbol{V} \boldsymbol{\Sigma} \boldsymbol{W}^{\mathrm{T}} U=VΣWT
取
X
\boldsymbol{X}
X 的前几列,构成矩阵
V
r
=
[
v
1
,
…
,
v
r
]
\boldsymbol{V_r}=\left[\boldsymbol{v}_{1}, \ldots, \boldsymbol{v}_{r}\right]
Vr=[v1,…,vr]
一般我们称之为 POD 基。很容易理解,这其实就是 PCA 的过程,参考:
https://blog.csdn.net/lusongno1/article/details/80517808
https://blog.csdn.net/lusongno1/article/details/79683461
PCA 告诉我们,POD 基表示对于投影距离平方和的极小化:
min
V
∈
R
n
×
r
∥
U
−
V
V
T
U
∥
F
2
=
min
V
∈
R
n
×
r
∑
i
=
1
n
s
∥
u
i
−
V
V
T
u
i
∥
2
2
=
∑
i
=
r
+
1
n
s
σ
i
2
\begin{aligned} &\min _{V \in \mathbb{R}^{n \times r}}\left\|\boldsymbol{U}-\boldsymbol{V} \boldsymbol{V}^{\mathrm{T}} \boldsymbol{U}\right\|_{F}^{2} \\ &=\min _{V \in \mathbb{R}^{n \times r}} \sum_{i=1}^{n_{s}}\left\|\mathbf{u}_{i}-\boldsymbol{V} \boldsymbol{V}^{\mathrm{T}} \mathbf{u}_{i}\right\|_{2}^{2}=\sum_{i=r+1}^{n_{s}} \sigma_{i}^{2} \end{aligned}
V∈Rn×rmin∥
∥U−VVTU∥
∥F2=V∈Rn×rmini=1∑ns∥
∥ui−VVTui∥
∥22=i=r+1∑nsσi2
有了 POD 基之后,我们令
u
r
=
V
r
T
u
\mathbf{u}_{r}=\boldsymbol{V_r}^{T} \mathbf{u}
ur=VrTu,即将
u
=
V
r
u
r
\mathbf{u} =\boldsymbol{V_r} \mathbf{u}_{r}
u=Vrur 代入方程,并在最后的表达式上再左乘一个
V
r
T
\boldsymbol{V_r}^T
VrT,最后可以得到一个低阶的方程,
E
r
d
u
r
d
t
+
A
r
u
r
=
b
r
\boldsymbol{E}_{r} \frac{\mathrm{d} \boldsymbol{u}_{r}}{\mathrm{~d} t}+\boldsymbol{A}_{r} \mathbf{u}_{r}=\boldsymbol{b}_{r}
Er dtdur+Arur=br
其中,
E
r
=
V
r
T
E
V
r
\boldsymbol{E}_{r}=\boldsymbol{V_r}^{\mathrm{T}} \boldsymbol{E} \boldsymbol{V_r}
Er=VrTEVr,
A
r
=
V
r
T
A
V
r
\boldsymbol{A}_{r}=\boldsymbol{V_r}^{\mathrm{T}} \boldsymbol{A} \boldsymbol{V_r}
Ar=VrTAVr,
b
r
=
V
r
T
b
\boldsymbol{b}_{r}=\boldsymbol{V_r}^{\mathrm{T}} \boldsymbol{b}
br=VrTb
这样,就把一个 n n n 阶的模型降维成了 r r r 阶的模型,怎么样,是不是很简单呢?
关于 POD 方法的讨论
注意到,上述的过程是对右端项线性的特殊情况,如果右端是非线性的,那么, POD 方法就无法在数量级上降低计算了。譬如对于一般的非线性系统:
E
(
μ
)
d
u
d
t
+
A
(
μ
)
u
=
f
(
μ
,
u
)
\boldsymbol{E}(\boldsymbol{\mu}) \frac{\mathrm{d} \boldsymbol{u}}{\mathrm{d} t}+\boldsymbol{A}(\boldsymbol{\mu}) \boldsymbol{u}=\boldsymbol{f}(\boldsymbol{\mu}, \mathbf{u})
E(μ)dtdu+A(μ)u=f(μ,u)
用上述的方式,我们得到:
E
r
(
μ
)
d
u
r
d
t
+
A
r
(
μ
)
u
r
=
f
r
(
μ
,
u
r
)
=
V
r
T
f
(
μ
,
V
r
u
r
)
\boldsymbol{E}_{r}(\boldsymbol{\mu}) \frac{\mathrm{d} \boldsymbol{u}_{r}}{\mathrm{~d} t}+\boldsymbol{A}_{r}(\boldsymbol{\mu}) \mathbf{u}_{r}=\boldsymbol{f}_{r}\left(\boldsymbol{\mu}, \mathbf{u}_{r} \right) = \boldsymbol{V_r}^{\mathrm{T}} \boldsymbol{f}\left(\boldsymbol{\mu}, \boldsymbol{V_r} \boldsymbol{u}_{r}\right)
Er(μ) dtdur+Ar(μ)ur=fr(μ,ur)=VrTf(μ,Vrur)
假设我们使用迭代法求解这个问题,那么我们可以看到,在每一次迭代当中,我们必须计算和
n
n
n 行的量
V
r
\boldsymbol{V_r}
Vr 的乘法,以及
n
n
n 维非线性函数
f
\boldsymbol{f}
f 的计算。这个拌住了整个方程求解的计算量。为了解决这个问题,我们必须想办法搞掉
f
\boldsymbol{f}
f 对
u
r
\boldsymbol{u}_{r}
ur 的直接依赖,否则就避不开非线性项的复杂性问题。
下一个主题,会介绍 DEIM ,就是为了解决非线性项的问题,持续关注。