泰勒及Jacobian、Hessian

定义:泰勒公式是一个用函数在某点的信息描述其附近取值的公式。具有局部有效性。

基本形式: f(x)=n=0f(n)(x0)n!(xx0)nf(x)=\sum\limits_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n

一阶泰勒展开: f(x)f(x0)+f(x0)(xx0)f(x)\approx f(x_0)+f'(x_0)(x-x_0)

二阶泰勒展开: f(x)f(x0)+f(x0)(xx0)+f(x0)(xx0)22f(x)\approx f(x_0)+f'(x_0)(x-x_0)+f''(x_0)\frac{(x-x_0)^2}{2}

迭代形式:假设 xt=xt1+Δxx^t=x^{t-1}+\Delta x ,将 f(xt)f(x^t)xt1x^{t-1} 处进行泰勒展开:

f(xt)=f(xt1+Δx)f(xt1)+f(xt1)Δx+f(xt1)Δx22f(x^t)=f(x^{t-1}+\Delta x) \approx f(x^{t-1})+f'(x^{t-1})\Delta x+f''(x^{t-1})\frac{\Delta x^2}{2}

举个例子,例如函数 y=x3y = x^3 ,当自变量有变化时,即 Δx\Delta x ,就有:

Δy=(x+Δx)3x3=3x2Δx+3x(Δx)2+(Δx)3\Delta y = (x+\Delta x)^3-x^3 = 3x^2\Delta x+3x(\Delta x)^2+(\Delta x)^3

Δx0\Delta x \to 0 时,上式的后两项是 Δx\Delta x 的高阶无穷小舍去的话上式就变成了 Δy=3x2Δx\Delta y = 3x^2\Delta x 。也就是说当自变量 xx 足够小的时候,也就是在某点的很小的邻域内, Δy\Delta y 是可以表示成 Δx\Delta x 的线性函数的。线性函数计算起来,求导起来会很方便,若进行 nn 次近似,就得到了泰勒展开的基本形式。

Jacobian与Hessian

有时我们需要计算输入和输出都为向量的函数的所有偏导数。包含所有这样的偏导数的矩阵被称为Jacobian矩阵。具体来说,如果我们有一个函数: f:RmRnf:\mathbb{R}^m\to\mathbb{R}^nff 的Jacobian矩阵 JRn×mJ\in\mathbb{R}^{n\times m} 定义为 Ji,j=xjf(x)iJ_{i,j}=\frac{\partial}{\partial x_j}f(x)_i

有时,我们也对导数的导数感兴趣,即二阶导数(second derivative)。例如,有一个函数 f:RmRf:\mathbb{R}^m\to \mathbb{R}ff 的一阶导数(关于 xjx_j)关于 xix_i 的导数记为 2xixjf\frac{\partial^2}{\partial x_i\partial x_j}f 。在一维的情况下,我们可以将 2x2f\frac{\partial^2}{\partial x^2}ff(x)f''(x) 。二阶导数告诉我们,一阶导数将如何随着输入的变化而变化。它表示只基于梯度信息的梯度下降步骤是否会产生如我们预期的那样大的改善,因此它是重要的。我们可以认为,二阶导数是对曲率的衡量。假设我们有一个二次函数(虽然很多实践中的函数都不是二次的,但至少在局部可以很好地用二次近似)。如果这样的函数具有零二阶导数,那就没有曲率。也就是一条完全平坦的线,仅用梯度就可以预测它的值。我们使用沿负梯度方向大小为 ϵ\epsilon 的下降步,当该梯度是 11 时,代价函数将下降 ϵ\epsilon 。如果二阶导数是负的,函数曲线向下凹陷(向上凸出),因此代价函数将下降的比 ϵ\epsilon 多。如果二阶导数是正的,函数曲线是向上凹陷(向下凸出),因此代价函数将下降的比 ϵ\epsilon 少。从下图可以看出不同形式的曲率如何影响基于梯度的预测值与真实的代价函数值的关系。

当我们的函数具有多维输入时,二阶导数也有很多。我们可以将这些导数合并成一个矩阵,称为Hessian矩阵。Hessian矩阵 H(f)(x)H(f)(x) 定义为:

H(f)(x)i,j=2xixjf(x)H(f)(x)_{i,j}=\frac{\partial^2}{\partial x_i \partial x_j}f(x)

Hessian等价于梯度的Jacobian矩阵。

微分算子在任何二阶偏导连续的点处可交换,也就是它们的顺序可以互换:

2xixjf(x)=2xjxif(x)\frac{\partial^2}{\partial x_i\partial x_j}f(x)=\frac{\partial^2}{\partial x_j\partial x_i}f(x)

这意味着 Hi,j=Hj,iH_{i,j}=H_{j,i} ,因此Hessian矩阵在这些点上是对称的。在深度学习背景下,我们遇到的大多数函数的Hessian几乎处处都是对称的。因为Hessian矩阵是实对称的,我们可以将其分解成一组实特征值和一组特征向量的正交基。在特定方向 dd 上的二阶导数可以写成 dHdd^\top Hd 。当 ddHH 的一个特征向量时,这个方向的二阶导数就是对应的特征值。对于其他的方向 dd ,方向二阶导数是所有特征值的加权平均,权重在 0011 之间,且与 dd 夹角越小的特征向量的权重越大。最大特征值确定最大二阶导数,最小特征值确定最小二阶导数。

我们可以通过(方向)二阶导数预期一个梯度下降步骤能表现得多好。

我们在当前点 x(0)x^{(0)} 处作函数 f(x)f(x) 的近似二阶泰勒级数:

f(x)f(x(0))+(xx(0))g+12(xx(0))H(xx(0))f(x)\approx f(x^{(0)})+(x-x^{(0)})^\top g+\frac{1}{2}(x-x^{(0)})^\top H (x-x^{(0)})

其中 gg 是梯度, HHx(0)x^{(0)} 点的Hessian。如果我们使用学习率 ϵ\epsilon ,那么新的点 xx 将会是 x(0)ϵgx^{(0)}-\epsilon g 。代入上述的近似,可得

f(x(0)ϵg)f(x(0))ϵgg+12ϵ2gHgf(x^{(0)}-\epsilon g)\approx f(x^{(0)})-\epsilon g^\top g+\frac{1}{2}\epsilon^2 g^\top Hg

其中有 33 项:函数的原始值、函数斜率导致的预期改善、函数曲率导致的矫正。当最后一项太大时,梯度下降实际上式可能向上移动的。当 gHgg^\top H g 为零或负时,近似的泰勒级数表明增加 ϵ\epsilon 将永远使 ff 下降。在实践中,泰勒级数不会在 ϵ\epsilon 大的时候也保持准确,因此在这种情况下我们必须采取更启发式的选择。当 gHgg^\top H g 为正时,通过计算可得,使近似泰勒级数下降最多的最优步长为

ϵ=gggHg\epsilon^*=\frac{g^\top g}{g^\top Hg}

最坏的情况下, ggHH 最大特征值 λ\lambda 对应的特征向量对齐,则最优步长是 1λmax\frac{1}{\lambda_{\max}} 。我们要最小化的函数能用二次函数很好地近似的情况下,Hessian的特征值决定了学习率的量级。

二阶导数还可以被用于确定一个临界点是否是局部极大点、局部极小点或鞍点。

回想一下,在临界点处 f(x)=0f'(x)=0 。而 f(x)>0f''(x)>0 意味着 f(x)f'(x) 会随着我们移向右边而增加,移向左边而减小,也就是 f(xϵ)<0f'(x-\epsilon)<0f(x+ϵ)>0f'(x+\epsilon)>0 对足够小的 ϵ\epsilon 成立。换句话说,当我们移向右边,斜率开始指向右边的上坡,当我们移向左边,斜率开始指向左边的上坡。因此我们得出结论,当 f(x)=0f'(x)=0f(x)>0f''(x)>0 时, xx 是一个局部极小点。同样,当 f(x)=0f'(x)=0f(x)<0f''(x)<0 时, xx 是一个局部极大点。这就是所谓的二阶导数测试。不幸的是,当 f(x)=0f''(x)=0 时测试是不准确的。在这种情况下, xx 可以是一个鞍点或平坦区域的一部分。

在多维情况下,我们需要检测函数的所有二阶导数。利用Hessian的特征值分解,我们可以将二阶导数测试扩展到多维情况。在临界点处 (xf(x)=0)(\nabla_xf(x)=0) ,我们通过检测Hessian的特征值来判断该临界点是一个局部极大点、局部极小点还是鞍点。当Hessian是正定的(所有特征值都是正的),则该临界点是局部极小点。同样,当Hessian是负定的(所有特征值都是负的),这个点就是局部极大点。在多维情况下,实际上我们可以找到确定该点是否为鞍点的积极迹象(某些情况下)。如果Hessian的特征值中至少一个是正的且至少一个是负的,那么 xxff 某个横截面的局部极大点,却是另一个横截面的局部极小点,如下图例子。最后,多维二阶导数测试可能像单变量版本那样是不确定的。当所有非零特征值是同号的且至少有一个特征值是 00 时,这个检测就是不确定的。这是因为单变量的二阶导数测试在零特征值对应的横截面上是不确定的。

上图既有正曲率又有负曲率的鞍点。示例中的函数是 f(x)=x12x22f(x) = x_1^2-x_2^2 。函数沿 x1x_1 轴向上弯曲。 x1x_1 轴是Hessian的一个特征向量,并且具有正特征值。函数沿 x2x_2 轴向下弯曲。该方向对应于Hessian负特征值的特征向量。名称“鞍点”源自该处函数的鞍状形状。这是具有鞍点函数的典型示例。维度多于一个时,鞍点不一定要具有 00 特征值:仅需要同时具有正特征值和负特征值。我们可以想象这样一个鞍点(具有正负特征值)在一个横截面内是局部极大点,而在另一个横截面内是局部极小点。

Last updated