优化,可以说是最常见到的一类数学问题,尤其在深度学习时代,大部分的工作都是围绕着数据构建,模型设计,loss 设计来开展的,深度学习训练模型的目的是拟合训练数据,或者说让设计的 loss 最优,无论是拟合训练数据,还是让 loss 最优,这都涉及到优化问题。模型的最终性能取决于两个因素:一个是模型本身的设计;二是对模型的优化。

我们很早以前就接触过函数,有些函数很简单,比如线性函数,一元多次函数。有些函数很复杂,比如现在的 AI 模型,AI 模型本身也是一种函数,只是这个函数的表达式过于复杂,已经不能显式地将表达式写出来了。

函数或者说模型在优化问题中,一般是用来拟合当前的观测值,比如我们有一组观测值 (x1,y1),(x2,y2),...,(xm,ym)(x_1,y_1),(x_2, y_2),...,(x_m,y_m)(x1,y1),(x2,y2),...,(xm,ym),首先我们希望能找到一个函数或者模型,去拟合这组观测值:

y′=fθ(x)(1) y' = f_{\theta}(x) \tag{1} y=fθ(x)(1)

上面的 fff 就是函数的表达式,θ\thetaθ 就是函数的参数,xxx 是我们的观测数据,y′y'y 是函数根据观测数据做的预测,对于一个优化问题来说,就是希望 y′y'y 要与 yyy 尽可能地接近:

arg min⁡θE(y′,y)(2) \argmin_{\theta} \mathbb{E}(y',y) \tag{2} θargminE(y,y)(2)

上式是一个常见的优化目标函数,E\mathbb{E}E 可以选择不同的形式,比如 L1,L2L1, L2L1,L2 范数,如果是 L2L2L2 范数,那就是我们常见的最小二乘法的优化:

arg min⁡θ12∑i(fθ(x)−y)2(3) \argmin_{\theta} \frac{1}{2} \sum_{i} (f_{\theta}(x) - y )^{2} \tag{3} θargmin21i(fθ(x)y)2(3)

对于这类优化问题,大家都知道可以用梯度下降结合链式法则去优化,现在的深度学习,本质上也是上面这种形式,θ\thetaθ 就是模型的参数,fff 就是模型的结构,或者说模型的表达式。

如果我们把上面的式 (3) 写成另外一种函数的形式:

L(θ)=12∑i(fθ(x)−y)2(4) \mathcal{L}(\theta) = \frac{1}{2} \sum_{i} (f_{\theta}(x) - y )^{2} \tag{4} L(θ)=21i(fθ(x)y)2(4)

L(θ)\mathcal{L}(\theta)L(θ) 可以看成是关于 θ\thetaθ 的一个函数,理论上来说,我们取一系列的 θ\thetaθ 值,可以看到不同的 L(θ)\mathcal{L}(\theta)L(θ) 值,那么优化公式 (3) 就相当于在 L(θ)\mathcal{L}(\theta)L(θ) 这个函数下,找到一个最优的 θ∗\theta^{*}θ,使得 L(θ)\mathcal{L}(\theta)L(θ) 最小。

在优化这类问题的时候,一般我们会先对待优化参数 θ\thetaθ 做一个随机初始化,然后基于这个初始值开始优化。因为一般来说,这种优化函数的表达式都很复杂,很难直接求出解析解,需要通过迭代的方式慢慢收敛到最优值。初始化很好理解,但是后续的迭代是怎么做的呢。这个就要说到著名的泰勒展开。

  • 泰勒展开:是用一个函数在某点的信息,描述其附近取值的公式。如果函数足够平滑,在已知函数在某一点的各阶导数值的情况下,泰勒公式可以利用这些导数值来做系数,构建一个多项式近似函数,求得在这一点的邻域中的值。

泰勒展开式的定义:

f(x)=f(x0)0!+f′(x0)1!(x−x0)+f′′(x0)2!(x−x0)2+...+fn(x0)n!(x−x0)n+Rn(x)(5) f(x) = \frac{f(x_0)}{0!} + \frac{f'(x_0)}{1!}(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^{2} + ... + \frac{f^{n}(x_0)}{n!}(x-x_0)^{n} + R_n(x) \tag{5} f(x)=0!f(x0)+1!f(x0)(xx0)+2!f′′(x0)(xx0)2+...+n!fn(x0)(xx0)n+Rn(x)(5)

如果我们把 L(θ)\mathcal{L}(\theta)L(θ) 看做是 f(x)f(x)f(x)x0x_0x0 看做是初始值,那么上面的泰勒展开式就是对 L(θ)\mathcal{L}(\theta)L(θ)x0x_0x0 附近的一个逼近,如果我们只考虑一阶近似的时候,上面的式子可以写成:

f(x)≈f(x0)+f′(x0)(x−x0)(6) f(x) \approx f(x_0) + f'(x_0)(x-x_0) \tag{6} f(x)f(x0)+f(x0)(xx0)(6)

上面的式子 (6) 是用一条直线去逼近当前函数在 x0x_0x0 附近的邻域,迭代过程可以表示为:

f(xn+1)≈f(xn)+f′(xn)(xn+1−xn)(7) f(x_{n+1}) \approx f(x_n) + f'(x_n)(x_{n+1}-x_n) \tag{7} f(xn+1)f(xn)+f(xn)(xn+1xn)(7)

  • 一阶泰勒展开到梯度下降

从上面的式子,可以推导出常见的梯度下降算法:

因为优化的目标是希望 f(x)f(x)f(x) 越来越小,所以每一次迭代,都希望比前一次的值越小,

f(xn+1)≤f(xn)⇒f′(xn)(xn+1−xn)≤0(8)f(x_{n+1}) \leq f(x_n) \Rightarrow f'(x_n)(x_{n+1}-x_n) \leq 0 \tag{8} f(xn+1)f(xn)f(xn)(xn+1xn)0(8)

为了让上面的式子 (8) 成立,令:

xn+1−xn=−αf′(xn)⇒xn+1=xn−αf′(xn)(9) x_{n+1}-x_n = -\alpha f'(x_n) \Rightarrow x_{n+1} = x_n -\alpha f'(x_n) \tag{9}xn+1xn=αf(xn)xn+1=xnαf(xn)(9)

  • 二阶泰勒展开到牛顿法

如果是泰勒二阶近似,那么上的式子可以写成:

f(x)≈f(x0)+f′(x0)(x−x0)+12(x−x0)2f′′(x0)(10) f(x) \approx f(x_0) + f'(x_0)(x-x_0) + \frac{1}{2}(x-x_0)^{2}f''(x_0) \tag{10} f(x)f(x0)+f(x0)(xx0)+21(xx0)2f′′(x0)(10)

公式(10) 就是用一条二次曲线去逼近当前函数在 x0x_0x0 附近的邻域,如果 xxx 为极值点,那么意味着 f′(x)f'(x)f(x) 为 0,所以上式转化为求 f′(x)=0f'(x) = 0f(x)=0 处的值,式 (10) 对 xxx 进行求导,可以得到:

f′(x)≈f′(x0)+(x−x0)f′′(x0)(11) f'(x) \approx f'(x_0) + (x-x_0)f''(x_0) \tag{11} f(x)f(x0)+(xx0)f′′(x0)(11)
那么它的迭代优化过程可以表示成:

xn+1=xn−f′(xn)f′′(xn)(12) x_{n+1} = x_{n} - \frac{f'(x_n)}{f''(x_n)} \tag{12} xn+1=xnf′′(xn)f(xn)(12)

这个是我们常见的二阶梯度优化,也就是牛顿迭代法。

  • 高维空间中的泰勒展开

上面介绍的一阶和二阶泰勒展开都是针对单变量的,如果是多变量的函数,也就是一个高维空间的函数,其泰勒展开要复杂很多,主要是高维空间的导数求解相对来说比较复杂,这里给出高维空间的二阶泰勒展开:

f(x)≈f(x0)+(x−x0)T▽f(x0)+12(x−x0)T▽2f(x0)(x−x0)(13) f(\mathbf{x}) \approx f(\mathbf{x}_0) + (\mathbf{x} - \mathbf{x}_0)^{T}\bigtriangledown f(\mathbf{x}_0) + \frac{1}{2}(\mathbf{x} - \mathbf{x}_0)^{T } \bigtriangledown^{2}f(\mathbf{x}_0)(\mathbf{x} - \mathbf{x}_0) \tag{13} f(x)f(x0)+(xx0)Tf(x0)+21(xx0)T2f(x0)(xx0)(13)

  • ▽f(x0)\bigtriangledown f(\mathbf{x}_0)f(x0) 表示一阶导数,称为雅克比矩阵: J(x0)\mathbf{J}(\mathbf{x}_0)J(x0)
  • ▽2f(x0)\bigtriangledown^{2}f(\mathbf{x}_0)2f(x0) 表示二阶导数,称为海森矩阵:H(x0)\mathbf{H}(\mathbf{x}_0)H(x0)

对于高维空间的一阶梯度下降,可以沿用公式 (8),(9) 的推导过程,同样可以得到:

(x−x0)T▽f(x0)≤0⇒x−x0=−α▽f(x0)(14) (\mathbf{x} - \mathbf{x}_0)^{T}\bigtriangledown f(\mathbf{x}_0) \leq 0 \Rightarrow \mathbf{x} - \mathbf{x}_0 = - \alpha \bigtriangledown f(\mathbf{x}_0) \tag{14} (xx0)Tf(x0)0xx0=αf(x0)(14)

所以高维空间的一阶梯度下降同样满足:

xn+1=xn−α▽f(xn)(15) \mathbf{x}_{n+1} = \mathbf{x}_n - \alpha \bigtriangledown f(\mathbf{x}_n) \tag{15} xn+1=xnαf(xn)(15)

对于二阶的牛顿法会更复杂一些,从式 (11) 可以推出高维空间下的表达式为:

▽f(x0)+▽2f(x0)(x−x0)=0(16) \bigtriangledown f(\mathbf{x}_0) + \bigtriangledown^{2}f(\mathbf{x}_0)(\mathbf{x} - \mathbf{x}_0) = \mathbf{0} \tag{16} f(x0)+2f(x0)(xx0)=0(16)

注意,上面的公式 (16) 里的 0\mathbf{0}0 是一个向量,所以这个的求解涉及到矩阵的运算:

xn+1=xn−H−1(xn)J(xn)(17) \mathbf{x}_{n+1} = \mathbf{x}_n - \mathbf{H}^{-1}(\mathbf{x}_n)\mathbf{J}(\mathbf{x}_n) \tag{17} xn+1=xnH1(xn)J(xn)(17)

高维空间中的牛顿迭代法,需要求解海森矩阵的逆。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐