跳转至

Lecture 4 | Model Fitting and Optimization

约 4135 个字 预计阅读时间 21 分钟

优化

首先我们来定义一个优化(Optimization)问题的模型:

优化问题的模型

目标函数f0(x)f_0(\vec x) 满足约束条件

{fi(x)0,i=1,...,minequality constraint functionsgi(x)=0,i=1,...,pequality constraint functions \left\{ \begin{aligned} f_i(\vec x) &\leq 0, &i = 1,...,m & \text{inequality constraint functions} \\ g_i(\vec x) &= 0, &i = 1,...,p & \text{equality constraint functions}& \end{aligned} \right.

xRn\vec x\in \mathrm{R}^n ,使 f0(x)f_0(\vec{x}) 最小(即最优)。

很显然,这和我们高中接触的线性规划很像,实际上线性规划就是其中一种优化问题。

而接下来,我们需要尝试将一些复杂问题转化为优化问题,即根据问题,写出目标函数和约束条件,并通过一些方法来得到我们需要的 x\vec x

🌰 图像去模糊问题

在这个 🌰 中,我们已知模糊图像 YY 和模糊滤波器(卷积核) FF,需要通过优化的方法来求卷积运算之前的清晰图像 XX

进一步来说,就是找到清晰的图像 XX,使得它做模糊处理后与已知的模糊图像 YY 差别尽可能小,于是问题转化为:

  • 目标函数为 minXYFX22\min\limits_{X} || Y - F * X ||^2_2 的优化问题。

模型拟合

为了研究分析实际问题,我们需要对问题进行一个建模,更具体的来说就是根据实际情况,寻找数据之间的关系,并建立数学模型。

一个数学模型(model)描述问题中输入和输出的关系,例如:线性模型(linear model) b=aTxb = a^T x 就描述了输入(input) aa 和输出(output) bb 关于模型参数(model parameter) xx 的关系。

而实际的结果很难严格满足数学模型,这是由多方原因导致的,所以我们往往做的是对实际情况进行模型拟合(model fitting)

更具体的来说,我们可能已经有一个先验的假设,即数据符合哪种模型,接下来根据数据来分析得到合适的 model parameters,而这个步骤也常常被称为 learning。

一种比较经典的逼近方法(最小二乘法)是求使均方误差(mean square error, MSE)最小的 model parameters:

x^=argminxi(biaiTx)2\hat{x} = \mathop{\arg \min\limits_x} \sum\limits_i(b_i - a_i^Tx)^2

而如果我们假设数据中的噪声是高斯分布的(实际上大部分噪声在基数足够大的情况下都可以看作为高斯分布的),那么可以与统计学的极大似然估计(maximum likelihood estimation, MLE)相统一.

具体来说,bi=aiTx+n,    nG(0,σ)b_i = a_i^T x + n, \;\; n \sim G(0,\sigma),而对于给定的 xx,其似然(likehood)P[(ai,bi)x]=P[biaiTx]exp((biaiTx)22σ2)P[(a_i,b_i)|x] = P[b_i-a_i^Tx] \propto \exp \left( - \frac{(b_i-a_i^Tx)^2}{2\sigma^2} \right),表示在 model parameter 为 xx 的情况下,数据符合 (ai,bi)(a_i,b_i) 的可能性。

Maximum Likelihood Estimation

If the data points are independent,

P[(a1,b1)(a2,b2)x]=iP[(ai,bi)x]=iP[biaiTx]exp(i(biaiTx)22σ2)=exp(Axb222σ2) \begin{aligned} P[(a_1, b_1)(a_2, b_2)\dots|x] & = \prod\limits_iP[(a_i, b_i)|x] = \prod\limits_i P[b_i - a_i^T x] \\ & \propto \exp\left(-\frac{\sum_i(b_i - a_i^Tx)^2}{2\sigma^2}\right) = \exp\left(-\frac{||Ax-b||^2_2}{2\sigma^2}\right) \end{aligned}

That is, maximize the likelihood to find the best xx.

x^=argmaxxP[(a1,b1)(a2,b2)x]=argmaxxexp(Axb222σ2)=argminxAxb22 \begin{aligned} \hat x &= \mathop{\arg \max\limits_x} P[(a_1, b_1)(a_2, b_2)\dots|x] \\ &= \mathop{\arg \max\limits_x} \exp\left(-\frac{||Ax-b||^2_2}{2\sigma^2}\right) = \mathop{\arg \min\limits_x}||Ax - b||_2^2 \end{aligned}

MSE = MLE with Gaussian noise assumption

需要补数学知识,完善这部分内容


数值方法

上一小节介绍了如何对实际问题进行数学建模,接下来需要介绍的是如何求解数学模型。

我们知道,对于一些比较简单的模型,我们可以直接求其解析解(analytical solution),比如使用求导等方法。

🌰

以刚才的线性 MSE 为例,x^=argminxi(biaiTx)2\hat{x} = \mathop{\arg \min\limits_x} \sum\limits_i(b_i - a_i^Tx)^2 等效于求解等式 ATAx=ATbA^TAx=A^Tb

然而,实际情况是大部分问题过于复杂,我们没法直接求其解析解,所以我们需要采用一些即采用一些数值方法(numerical methods)


梯度下降

由于相关领域的“函数”等基本上都是高维的,所以我们一般使用二维函数图像的方法来形象表示函数,即使用“等高线”的形式来可视化函数。

虽然没法直接求解析解,但是一般函数都具有一些局部性质,例如极值点临域的梯度都指向极值点。模糊地来说,只要我们随着“梯度”去“下降”,就有可能找到极值点,这就是通过梯度下降(gradient descent)的方法来解决优化问题。

简单描述梯度下降的过程:

  1. 初始化起点坐标 x;
  2. 直到 x 收敛到我们满意的程度之前:
    1. 计算下降方向 p
    2. 决定下降步长 ⍺;
    3. 更新 x = x + ⍺p

Sourece: https://commons.wikimedia.org/w/index.php?curid=2283984

其中有三件事需要特殊说明:

  • 如何确定下降方向 p\vec p
  • 如何确定下降步长
  • 全局最优和局部最优

确定下降方向

对于我们以前接触过的函数,即形式相对简单的函数,我们当然可以直接求其梯度得到下降方向。然而实际问题中的函数可能非常复杂,或梯度解析式很难得到。这时候我们就只能退而求其次,求其“近似”梯度方向。换句话来说,我们希望能够找到一个和原函数在局部和该函数很像的拟合函数,并且用这个拟合函数的梯度方向来决定梯度下降的方向。

于是我们想到泰勒展开,它将函数展开为多项式,而多项式的梯度是相对容易得到的。

其中比较常用的是:

  • first-order approximation: F(xk+Δx)F(xk)+JFΔxF(x_k + \Delta x) \approx F(x_k) + J_F \Delta x
  • second-order approximation: F(xk+Δx)F(xk)+JFΔx+12ΔxTHFΔxF(x_k + \Delta x) \approx F(x_k) + J_F\Delta x + \frac{1}{2}\Delta x^T H_F \Delta x

其中 JFJ_F雅各比矩阵,可以理解为多维向量函数的导数;HFH_F海森矩阵,可以理解为多位向量函数的二阶导数。

接下来以 first-order approximation 为例继续分析。

观察 F(xk+Δx)F(xk)+JFΔxF(x_k + \Delta x) \approx F(x_k) + J_F \Delta x,发现当 JFΔx<0J_F\Delta x < 0 时, F(x0+Δx)F(x_0 + \Delta x) 大概率比 F(x0)F(x_0) 小,即“下降”,所以在 first-order approximation 的情况下,一般选择方向 p=JFT\vec p = -J_F^T,于是位移量 movement=JFJFTstepmovement = -J_F \cdot J_F^T \cdot step


确定下降步长

即使但从下降速率来考虑,步长太长或太小也都有明显的问题:

所以步长的选择对下降速率的十分关键。

为了专注于步长的选择,我们记 ϕ(α)=F(x+αh),    where x and h fixed,x0\phi(\alpha) = F(x+\alpha h),\;\;\text{where x and h fixed}, x\geq 0。现在我们希望找到一个能让 ϕ(α)\phi(\alpha) 尽可能小于 ϕ(0)\phi(0)α\alpha。接下来我们介绍 Backtracking Algorithm:

  1. 初始化 α\alpha 为一个比较大的值;
  2. 不断减小 α\alpha 直到 ϕ(α)ϕ(0)+γϕ(0)α\phi(\alpha) \leq \phi(0) + \gamma\phi'(0)\alpha
    • 其中 γ(0,1)\gamma\in(0,1) 是一个固定的参数;

换句话说就是,符合预期的最大步长,这个“预期”,就是通过 γ\gamma 体现的。图中红色虚线和黑色细线分别是 γ\gamma 取边界值时的情况,而红色实线则表示我们的预期随 α\alpha 的变化。


上面使用 first-order approximation 为例介绍的这套方法就是最速梯度下降法(steepest descent method)

最速梯度下降法

p=JFT\vec p = -J_F^T

  • 优点
    • 容易实现;
    • 在距离目标点较远时表现良好;
  • 缺点
    • 在目标点附近收敛比较慢;
    • 浪费了大量算力;

这是因为,最速梯度下降法主要采用的是 first-order approximation,没有体现曲率特征。

因而一种很自然的改进方法就是使用 second-order approximation,即牛顿法(Newton Method)

牛顿法

F(xk+Δx)F(xk)+JFΔx+12ΔxTHFΔxF(x_k + \Delta x) \approx F(x_k) + J_F\Delta x + \frac{1}{2}\Delta x^T H_F \Delta x

对它求导得到 FΔx=JFT+HFΔx=0\frac{\partial F}{\partial \Delta x} = J_F^T+H_F\Delta x = 0

所以得到方向为 p=Δx=HF1JFT\vec p = \Delta x = -H_F^{-1}J_F^T

  • 优点
    • 在目标点附近下降速度相对更快;
  • 缺点
    • Hessian matrix 的计算需要相当算力,甚至有时候无法计算;

由此发现,牛顿法的表现会好很多,如果能够避免计算黑塞矩阵,就可以进一步提高牛顿法的效果,于是就出现了高斯牛顿法(Gauss-Newton method)

高斯牛顿法

对于解决最小二乘法 x^=argminxR(x)22\hat x = \mathop{\arg \min\limits_x} ||R(x)||^2_2 的问题表现非常好。

对于这类问题,高斯牛顿法使用 JRTJRJ_R^TJ_R 来近似代替 HFH_F,得到下降方向为 p=(JRTJR)1JRT,    where JR is the Jacobian of R(x)\vec p = -(J_R^TJ_R)^{-1}J_R^T,\;\;\text{where }J_R\text{ is the Jacobian of }R(x)

  • 优点
    • 不需要计算 Hessian matrix,只需要计算 Jacobian matrix;
  • 缺点
    • 由于 JRTJRJ_R^TJ_R 不正定,所以未必可逆,高斯牛顿法成立的前提是其可逆;
    • 当然,可以使用 Levenberg-Marquardt 算法(LM 算法),即将 JRTJRJ_R^TJ_R 修正为 JRTJR+λIJ_R^TJ_R + \lambda I 以保证正定;
Levenberg-Marquardt

Wiki: 🔗

Δx=(JRTJR+λI)1JRTR(xk) \Delta x = -(J_R^TJ_R+\lambda I)^{-1}J_R^TR(x_k)
  • The effect of λ\lambda:
    • λ\lambda \to \infty: Gradient descent, and stepsize is small;
    • λ0\lambda \to 0: Gauss-Newton step;
  • How to determine λ\lambda:
    • Update in every iteration;
    • When decreases obviously, λ\lambda\uparrow;
    • When doesn't decrease obviously, λ\lambda\downarrow;

简单来说,LM 就是综合了最速梯度下降法和牛顿法的优点,在远离目标点的时候使用最速梯度下降法,保证启动速度快;在靠近目标点的时候使用牛顿法,保证收敛速度足够快;并且保证 JRTJR+λIJ_R^TJ_R+\lambda I 正定,所以始终能够使牛顿法成立。

带约束的优化问题

对于带约束的优化问题(constrained optimization),则需要根据实际问题求解。

  • 我们可能可以转化问题,使用更简单的表达式去拟合原来的表达式,来求解;
  • 其中,(凹)凸函数是一定能找到最优解的,我们称这种问题为凸优化问题(Convex optimization)

推荐同名读物:https://web.stanford.edu/class/ee364a


全局最优和局部最优

分多个 batch 来处理,大量撒点,然后比较每一个 batch 的结果,最终取最好的一个即可。


鲁棒估计

鲁棒估计(robust estimation)是对从各种概率分布(尤其是非正态分布)中提取的数据具有良好性能的统计。

在拟合模型中,难免出现一些不符合预期的点,而它们会对拟合结果产生或多或小的影响,而如何权衡这些噪声与真正有用的数据点之间的关系,就是鲁棒估计的课题。


内点 & 外点

首先我们对数据点进行分类:

  • 内点(inlier):符合我们预期的模型拟合的点;
  • 外点(outlier):完全不符合我们预期模型的点,又叫离群;

外点的影响

由于外点偏离很大,而最小二乘法中存在平方操作,所以最小二乘法拟合受这些外点影响很大:


不同的损失函数

于是我们考虑,可以更换拟合的损失函数,来减小大偏差点带来的影响,比如使用 L1 loss(即求绝对值)。不过更好的是一种选择叫 huber loss,它在距离远点较远的时候比较接近 L1 loss。

L1 & L2 & Huber
  • L1 loss 即直接对偏差取绝对值,其公式为 L1=f(x)YL_1 = |f(x)-Y|,其最大的问题就是在拐点处不光滑,即不可导,而且其收敛可能过快;
  • L2 loss 即将偏差取平方,即 L2=f(x)Y2L_2 = |f(x)-Y|^2,L2 loss 在拐点处则是光滑可导的,且收敛相对稳定光滑,但是且在某些时候具有比较好的几何意义,但是对于偏差较大的点更敏感;
  • Huber loss 又叫 smooth L1 loss,即使用分段函数,在拐点附近使用 L2 loss,在远端使用 L1 loss;


随机抽样一致

随机抽样一致(random sample consensus, RANSAC)采用迭代的方式从包含外点的数据中估计数学模型参数,是一个对于存在明显外点的数据非常有效的方法。

RANSAC procedure

  1. 首先随机找两个点拟合一条直线,然后检查有多少点符合这条直线,并对其进行 vote;
  2. 重复这个步骤,最后选择票数最高的拟合;

由 outlier 拟合出来的直线一般 votes 比较少,因为 outlier 之间很难一致;但是inlier之间容易一致,因而得分往往更高,于是将它们区分开来。这不就是 Voting Tree (逃


病态问题

如果一个问题的解不唯一,那么这个问题是一个病态问题(ill-posed problem)。特别的,在线性问题中,一个线性方程(组)的解如果不唯一(不满秩),则同样是一个病态问题。

当然,对于线性方程组,根据线性代数的知识,我们可以增加方程,即增加约束。而这种约束一般来自于对变量的先验约束,比如:

L2 regularization

L2 norm: x2=ixi2||x||_2 = \sum_i x_i^2;

L2 regularization: minxAxb22    s.t.x21\min\limits x ||Ax-b||^2_2\;\;s.t. ||x||_2 \leq 1;

通过让选择的解尽可能接近原点,而让我们没有用的解的维度尽可能接近 0,以减小没用的变量的影响,抑制冗余变量。

L1 regularization

L1 norm: x1=ixi||x||_1=\sum_i|x_i|;

L1 regularization: minxAxb22    s.t.x11\min\limits x ||Ax-b||^2_2\;\;s.t. ||x||_1 \leq 1

L1 可视化中可以发现,坐标轴上比较容易抓住解,此时意味着有些变量(维度)是 0,换句话来说能让解变得“稀疏(sparse)”,即在维度上的分布只比较集中于个别项。

不过,将他们作为约束条件参与求解,不如直接加进去作为一个项,其效果是等价的:

L2 regularization:or L1 regularization:minxAxb22+λx22minxAxb22+λx1s.t.x21s.t.x11 \begin{matrix} \text{L2 regularization:} & | & \text{or L1 regularization:}\\ \min_{x}||Ax-b||^2_2+\lambda ||x||_2^2 & | & \min_{x}||Ax-b||^2_2+\lambda ||x||_1\\ s.t. ||x||_2 \leq 1 & | & s.t. ||x||_1 \leq 1 \\ \end{matrix}

过拟合和欠拟合

在这个过程中,也要小心过拟合(overfitting)欠拟合(underfitting),它们的含义非常直白:


插值

插值(interpolation)其实已经在 lec 3 的笔记 里提到过了。

这里先略过。

  • TODO: 再细说。
sketch

线性拟合、二次样条插值(每一段都是一个二次函数)、三次样条插值(一阶导二阶导连续,但最终是个病态问题,需要额外再约束起点和终点二阶导为零或者限定给定斜率等,就需要俩额外约束条件)、


上面是连续优化问题,下面是离散优化问题

图割 & 马可夫随机场

图像标签问题

图像标签问题(image labeling problems)即通过图片信息给每一个像素分配标签,实际上就是一个对图像内容的分类和识别问题。

其中一个比较强的先验(prior)是:相邻且相似的像素应当拥有相同的标签。

而图割和马可夫随机场可以建模这种先验。


图割

图割(Graphcut)的核心思想是,把一张图片的每一个像素看作一个 graph 中的 vertex,并在像素之间建 edge,并将 weight 定义为两像素之间的相似性或关联性(affinity or similarity)。

measuring affinity

比如,我们可以这样衡量像素的相似性:

  • ff 表示颜色;
  • 像素差异(dissimilarity)为 s(fi,fj)=k(fik,fjk)2s(f_i,f_j)=\sqrt{\sum_k(f_{ik},f_{jk})^2}
  • 则相似性(affinity)权重为:w(i,j)=A(fi,fj)=e12σ2s(fi,fj)w(i,j) = A(f_i,f_j) = e^{\frac{-1}{2\sigma^2}s(f_i,f_j)}

再接下来,通过这样的方式将图片建成图后,就可以把问题转化为图割问题,我们将小权的边删去,最终会形成若干连通分量,而这些连通分量那的点则被视为一个“分割”。

具体来说,图割的代价为断的边权之权重和 cut(VA,VB)=uVA,vVBw(u,v)cut(V_A,V_B)= \sum_{u\in V_A, v\in V_B} w(u,v),而我们需要找代价尽可能小的,满足我们要求的图割。当然,这个问题也等效于最大流问题;

Problem with min-cut

Bias to cut small, isolated segments.

由于 min-cut 的这个问题,我们还需要衡量这个子集是否足够稠密,所以我们倾向于使用 normalized-cut。

assoc(VA,V)=uVA,vVw(u,v)NCut(VA,VB)=cut(VA,VB)assoc(VA,V)+cut(VA,VB)assoc(VB,V) assoc(V_A,V) = \sum_{u\in V_A, v\in V} w(u,v) \\ NCut(V_A,V_B) = \frac{cut(V_A,V_B)}{assoc(V_A,V)} + \frac{cut(V_A,V_B)}{assoc(V_B,V)}
  • NP-Complete
  • Approximate solution by eigenvalue decomposition

马可夫随机场

马可夫随机场(Markov Random Field, MRF)是一种更通用的解决方案,可惜我第一次没听懂,等我听懂了再来补充这里的内容。

sketch

Markov chains


最后更新: 2024年1月19日 15:53:31
创建日期: 2024年1月13日 19:00:24
激励

评论