优化,可以说是最常见到的一类数学问题,尤其在深度学习时代,大部分的工作都是围绕着数据构建,模型设计,loss 设计来开展的,深度学习训练模型的目的是拟合训练数据,或者说让设计的 loss 最优,无论是拟合训练数据,还是让 loss 最优,这都涉及到优化问题。模型的最终性能取决于两个因素:一个是模型本身的设计;二是对模型的优化。
我们很早以前就接触过函数,有些函数很简单,比如线性函数,一元多次函数。有些函数很复杂,比如现在的 AI 模型,AI 模型本身也是一种函数,只是这个函数的表达式过于复杂,已经不能显式地将表达式写出来了。
函数或者说模型在优化问题中,一般是用来拟合当前的观测值,比如我们有一组观测值 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) (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)
上面的 f f f 就是函数的表达式, θ \theta θ 就是函数的参数, x x x 是我们的观测数据, y ′ y' y′ 是函数根据观测数据做的预测,对于一个优化问题来说,就是希望 y ′ y' y′ 要与 y y y 尽可能地接近:
arg min θ E ( y ′ , y ) (2) \argmin_{\theta} \mathbb{E}(y',y) \tag{2} θargminE(y′,y)(2)
上式是一个常见的优化目标函数, E \mathbb{E} E 可以选择不同的形式,比如 L 1 , L 2 L1, L2 L1,L2 范数,如果是 L 2 L2 L2 范数,那就是我们常见的最小二乘法的优化:
arg min θ 1 2 ∑ 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 θ 就是模型的参数, f f f 就是模型的结构,或者说模型的表达式。
如果我们把上面的式 (3) 写成另外一种函数的形式:
L ( θ ) = 1 2 ∑ 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 ( x 0 ) 0 ! + f ′ ( x 0 ) 1 ! ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . + f n ( x 0 ) n ! ( x − x 0 ) n + R n ( 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)(x−x0)+2!f′′(x0)(x−x0)2+...+n!fn(x0)(x−x0)n+Rn(x)(5)
如果我们把 L ( θ ) \mathcal{L}(\theta) L(θ) 看做是 f ( x ) f(x) f(x), x 0 x_0 x0 看做是初始值,那么上面的泰勒展开式就是对 L ( θ ) \mathcal{L}(\theta) L(θ) 在 x 0 x_0 x0 附近的一个逼近,如果我们只考虑一阶近似的时候,上面的式子可以写成:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) (6) f(x) \approx f(x_0) + f'(x_0)(x-x_0) \tag{6} f(x)≈f(x0)+f′(x0)(x−x0)(6)
上面的式子 (6) 是用一条直线去逼近当前函数在 x 0 x_0 x0 附近的邻域,迭代过程可以表示为:
f ( x n + 1 ) ≈ f ( x n ) + f ′ ( x n ) ( x n + 1 − x n ) (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+1−xn)(7)
- 一阶泰勒展开到梯度下降
从上面的式子,可以推导出常见的梯度下降算法:
因为优化的目标是希望 f ( x ) f(x) f(x) 越来越小,所以每一次迭代,都希望比前一次的值越小,
f ( x n + 1 ) ≤ f ( x n ) ⇒ f ′ ( x n ) ( x n + 1 − x n ) ≤ 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+1−xn)≤0(8)
为了让上面的式子 (8) 成立,令:
x n + 1 − x n = − α f ′ ( x n ) ⇒ x n + 1 = x n − α f ′ ( x n ) (9) x_{n+1}-x_n = -\alpha f'(x_n) \Rightarrow x_{n+1} = x_n -\alpha f'(x_n) \tag{9} xn+1−xn=−αf′(xn)⇒xn+1=xn−αf′(xn)(9)
- 二阶泰勒展开到牛顿法
如果是泰勒二阶近似,那么上的式子可以写成:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 ( x − x 0 ) 2 f ′ ′ ( x 0 ) (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)(x−x0)+21(x−x0)2f′′(x0)(10)
公式(10) 就是用一条二次曲线去逼近当前函数在 x 0 x_0 x0 附近的邻域,如果 x x x 为极值点,那么意味着 f ′ ( x ) f'(x) f′(x) 为 0,所以上式转化为求 f ′ ( x ) = 0 f'(x) = 0 f′(x)=0 处的值,式 (10) 对 x x x 进行求导,可以得到:
f
′
(
x
)
≈
f
′
(
x
0
)
+
(
x
−
x
0
)
f
′
′
(
x
0
)
(11)
f'(x) \approx f'(x_0) + (x-x_0)f''(x_0) \tag{11}
f′(x)≈f′(x0)+(x−x0)f′′(x0)(11)
那么它的迭代优化过程可以表示成:
x n + 1 = x n − f ′ ( x n ) f ′ ′ ( x n ) (12) x_{n+1} = x_{n} - \frac{f'(x_n)}{f''(x_n)} \tag{12} xn+1=xn−f′′(xn)f′(xn)(12)
这个是我们常见的二阶梯度优化,也就是牛顿迭代法。
- 高维空间中的泰勒展开
上面介绍的一阶和二阶泰勒展开都是针对单变量的,如果是多变量的函数,也就是一个高维空间的函数,其泰勒展开要复杂很多,主要是高维空间的导数求解相对来说比较复杂,这里给出高维空间的二阶泰勒展开:
f ( x ) ≈ f ( x 0 ) + ( x − x 0 ) T ▽ f ( x 0 ) + 1 2 ( x − x 0 ) T ▽ 2 f ( x 0 ) ( x − x 0 ) (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)+(x−x0)T▽f(x0)+21(x−x0)T▽2f(x0)(x−x0)(13)
- ▽ f ( x 0 ) \bigtriangledown f(\mathbf{x}_0) ▽f(x0) 表示一阶导数,称为雅克比矩阵: J ( x 0 ) \mathbf{J}(\mathbf{x}_0) J(x0)
- ▽ 2 f ( x 0 ) \bigtriangledown^{2}f(\mathbf{x}_0) ▽2f(x0) 表示二阶导数,称为海森矩阵: H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0)
对于高维空间的一阶梯度下降,可以沿用公式 (8),(9) 的推导过程,同样可以得到:
( x − x 0 ) T ▽ f ( x 0 ) ≤ 0 ⇒ x − x 0 = − α ▽ f ( x 0 ) (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} (x−x0)T▽f(x0)≤0⇒x−x0=−α▽f(x0)(14)
所以高维空间的一阶梯度下降同样满足:
x n + 1 = x n − α ▽ f ( x n ) (15) \mathbf{x}_{n+1} = \mathbf{x}_n - \alpha \bigtriangledown f(\mathbf{x}_n) \tag{15} xn+1=xn−α▽f(xn)(15)
对于二阶的牛顿法会更复杂一些,从式 (11) 可以推出高维空间下的表达式为:
▽ f ( x 0 ) + ▽ 2 f ( x 0 ) ( x − x 0 ) = 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)(x−x0)=0(16)
注意,上面的公式 (16) 里的 0 \mathbf{0} 0 是一个向量,所以这个的求解涉及到矩阵的运算:
x n + 1 = x n − H − 1 ( x n ) J ( x n ) (17) \mathbf{x}_{n+1} = \mathbf{x}_n - \mathbf{H}^{-1}(\mathbf{x}_n)\mathbf{J}(\mathbf{x}_n) \tag{17} xn+1=xn−H−1(xn)J(xn)(17)
高维空间中的牛顿迭代法,需要求解海森矩阵的逆。