【课堂笔记】稳定性和反向传播误差
文章目录
- 浮点数运算
- 算法条件数
- 例子
浮点数运算
对于两个算法,我们总是希望比较:
- 其中一个算法比另一个快吗(fast)
- 其中一个算法比另一个更稳健吗(robust)
通常在运算浮点数时,会产生溢出和精度不足等问题,这是影响算法性能的一个重要原因。所以我们会去统计算法进行的浮点数运算次数(flops)
算法条件数
如果将要解决的问题定义为f:X→Yf: X \to Yf:X→Y,而算法实现为f~:X→Y\tilde{f} : X \to Yf~:X→Y,如果算法f~\tilde{f}f~是精确的(accuracy),如果对任意x∈Xx \in Xx∈X,
∥f~(x)−f(x)∥∥f(x)∥=O(ϵ)\frac{\|\tilde{f}(x) - f(x)\|}{\|f(x)\|} =O(\epsilon) ∥f(x)∥∥f~(x)−f(x)∥=O(ϵ)
记δf=f(x+δx)−f(x)\delta f = f(x + \delta x) - f(x)δf=f(x+δx)−f(x),绝对条件数(absolute condition number)记为:
k^=supδx≠0∥δf∥∥δx∥\hat{k} = \underset{\delta x \neq 0}{\text{sup}} \frac{\|\delta f\|}{\|\delta x\|} k^=δx=0sup∥δx∥∥δf∥
相对条件数(relative condition number)记为:
k=supδx≠0∥δf∥∥f(x)∥/∥δx∥∥x∥k = \underset{\delta x \neq 0}{\text{sup}}\frac{\|\delta f\|}{\|f(x)\|} / \frac{\|\delta x\|}{\|x\|} k=δx=0sup∥f(x)∥∥δf∥/∥x∥∥δx∥
假设fff是可微的,x∈Rm,y∈Rnx \in \mathbb{R}^m, y \in \mathbb{R}^nx∈Rm,y∈Rn, ∂x→0\partial x \to 0∂x→0,我们可以得到雅可比矩阵:
J(x)=[∂f1∂x1∂f1∂x2⋯∂f1∂xm∂f2∂x1∂f2∂x2⋯∂f2∂xm⋮⋮⋱⋮∂fn∂x1∂fn∂x2⋯∂fn∂xm]J(x) = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \cdots & \frac{\partial f_1}{\partial x_m} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_2}{\partial x_m} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x_1} & \frac{\partial f_n}{\partial x_2} & \cdots & \frac{\partial f_n}{\partial x_m} \end{bmatrix} J(x)=∂x1∂f1∂x1∂f2⋮∂x1∂fn∂x2∂f1∂x2∂f2⋮∂x2∂fn⋯⋯⋱⋯∂xm∂f1∂xm∂f2⋮∂xm∂fn
于是
k^=∥J(x)∥k=∥J(x)∥/∥f(x)∥∥x∥\begin{align*} \hat{k} &= \|J(x)\| \\ k &= \|J(x)\| / \frac{\|f(x)\|}{\|x\|} \end{align*} k^k=∥J(x)∥=∥J(x)∥/∥x∥∥f(x)∥
一个数值算法被称为 stable,如果它在计算过程中对舍入误差不敏感,即:算法得到的结果近似于某个接近原始输入的问题的精确解。
- 数学描述:设真实问题是f(x)f(x)f(x),算法解为f~(x)\tilde{f}(x)f~(x),存在一个微小扰动δx\delta xδx,使得f~(x)≈f(x+δx)\tilde{f}(x) \approx f(x + \delta x)f~(x)≈f(x+δx)
一个算法被称为 backward stable,如果它计算出的结果是某个微小扰动后输入的精确解。
- 数学描述:算法输出f~(x)=f(x~)\tilde{f}(x) = f(\tilde{x})f~(x)=f(x~),其中x~=x+δ(x)\tilde{x} = x + \delta(x)x~=x+δ(x)
换句话说,我没有精确解出f(x)f(x)f(x),但我精确解出了一个非常接近的问题f~(x)\tilde{f}(x)f~(x)
例子
外积是stable的,但不是backward stable的
Aij~=xy∗(1+ϵ∗)=Aij(1+ϵ∗)\tilde{A_{ij}} = xy^*(1 + \epsilon_*)=A_{ij}(1+\epsilon_*) Aij~=xy∗(1+ϵ∗)=Aij(1+ϵ∗)
然而,得到的A~\tilde{A}A~不是秩1的,无法表示为下面的形式(某个扰动后向量的精确外积)
A~=(x+δx)(y+δy)∗(×)\tilde{A} = (x + \delta x)(y + \delta y)^* \ \ (\times ) A~=(x+δx)(y+δy)∗ (×)
内积是backward stable的:
[x1x2]⊤[y1y2]=x1y1(1+ϵ∗(1))+x2y2(1+ϵ∗(2))=[x1(1+ϵ∗(1))(1+ϵ+(1))x2(1+ϵ∗(2))(1+ϵ+(2))]⊤[y1y2]\begin{align*} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}^\top \begin{bmatrix} y_1 \\ y_2 \end{bmatrix}&=x_1y_1(1 + \epsilon_*^{(1)}) + x_2y_2(1 + \epsilon_*^{(2)}) \\ &= \begin{bmatrix} x_1(1+\epsilon_*^{(1)})(1+\epsilon_+^{(1)}) \\ x_2(1+\epsilon_*^{(2)})(1+\epsilon_+^{(2)}) \end{bmatrix}^\top \begin{bmatrix} y_1 \\ y_2 \end{bmatrix} \end{align*} [x1x2]⊤[y1y2]=x1y1(1+ϵ∗(1))+x2y2(1+ϵ∗(2))=[x1(1+ϵ∗(1))(1+ϵ+(1))x2(1+ϵ∗(2))(1+ϵ+(2))]⊤[y1y2]
通过以下方法解方程Ax=bAx = bAx=b是backward stable的:
- 通过Householder方法得到A=QRA = QRA=QR
- y=Q∗by = Q^*by=Q∗b
- x=R−1yx = R^{-1}yx=R−1y
证明:
显然后两步是backward stable的,(Q~+δQ)y~=b(\tilde{Q} + \delta Q)\tilde{y} = b(Q~+δQ)y~=b,(R~+δR)x~=y~(\tilde{R} + \delta R)\tilde{x} = \tilde{y}(R~+δR)x~=y~。
于是
b=(Q~+δQ)(R~+δR)x~=(Q~R~+δQR~+Q~δR+δQδR)x~\begin{align*} b &= (\tilde{Q} + \delta Q)(\tilde{R} + \delta R)\tilde{x} \\ &= (\tilde{Q}\tilde{R} + \delta Q\tilde{R} + \tilde{Q}\delta R + \delta Q \delta R)\tilde{x} \end{align*} b=(Q~+δQ)(R~+δR)x~=(Q~R~+δQR~+Q~δR+δQδR)x~
这里A~=Q~R~\tilde{A} = \tilde{Q}\tilde{R}A~=Q~R~,δA=δQR~+Q~δR+δQδR\delta A = \delta Q\tilde{R} + \tilde{Q}\delta R + \delta Q \delta RδA=δQR~+Q~δR+δQδR,∥δA∥∥A∥=O(ϵmath)\frac{\|\delta A\|}{\|A\|} = O(\epsilon_{\text{math}})∥A∥∥δA∥=O(ϵmath)