机器学习--基础--微分

机器学习中用到的微分

文章目录

  • 机器学习中用到的微分
    • 背景
    • 现有常见微分方式梳理
    • 自动微分
      • forward 方法
      • backward方法
    • 自动微分与机器学习
    • 自动微分与机器视觉

背景

机器学习中尤其是深度学习用到的数学基础首推微分。机器学习中优化问题的解决大多数情况下同微分有关,比如牛顿法,梯度下降法;深度学习中就更不用说了,整个深度学习框架(tensorflow,pytoch等等)的基石,或者说首要处理的问题就是自动微分,pytorch的前身Chainer名字的来源更是微分中的链式罚则。可见理解机器学习中的微分有多重要。这篇博客主要来自于链接内容。

现有常见微分方式梳理

常见的求解微分的方式有以下几种,各有各的特点:

  • 手动微分:是指在较为简单的函数表达下通过手动推导出微分的形式,然后将具体点代入,比如 y = x y=x y=x它的微分我们通过微分定理推得出就是1

  • 数值微分:数值微分是利用微分定义 d y = f ( d x ) dy = f(dx) dy=f(dx)的形式进行极限推导,注意这里的推导不是上述的手动推导形式,而是利用微分的定义
    [ f ( x ) − f ( x + σ ) ] / ( σ ) [f(x)-f(x+\sigma)]/(\sigma) [f(x)f(x+σ)]/(σ)
    其中 σ \sigma σ趋近于0

  • 符号微分:利用微分的链式法则进行微分求导
    h ( x ) = g ( x ) f ( x ) h(x)=g(x)f(x) h(x)=g(x)f(x)
    d h ( x ) d x = d f ( x ) d x g ( x ) + d g ( x ) d x f ( x ) \frac{dh(x)}{dx}=\frac{df(x)}{dx}g(x)+\frac{dg(x)}{dx}f(x) dxdh(x)=dxdf(x)g(x)+dxdg(x)f(x)

  • 自动微分法:现有的广泛运用于机器学习中的微分方法

这里罗列了几种微分方法,各有优缺点。
很明显第一种方法对操作者的数学能力以及函数的形式有一定的要求,仅仅是较为简单的函数可以用这样的方式进行处理,如果函数非解析或者函数形式过于复杂,采用这种方法就无从计算。第二种方法存在巨大的隐患,真正在计算机领域我们知道会存在截断误差与累积误差,并且一般情况下如下图所示:
机器学习--基础--微分_第1张图片
假设采用的是中心求微分的方式(center difference)
∂ f ( x ) ∂ x i = f ( x + h ϵ ) − f ( x − h ϵ ) 2 h + O ( h 2 ) \frac{\partial f(x)}{\partial x_i} = \frac{f(x+h\epsilon)-f(x-h\epsilon)}{2h}+O(h^2) xif(x)=2hf(x+hϵ)f(xhϵ)+O(h2)
那么从上面可以看出引入的误差是非常巨大的。综合来看,计算机领域采用的微分方式只能是后两种。
第三种方案,符号微分的方案也并不是非常完美,以下面的示例为例:
机器学习--基础--微分_第2张图片
可以看出,当函数简单时 d f d x \frac{df}{dx} dxdf的形式比较简单,但是从链式法则的定义来看,无论如何 d f d x \frac{df}{dx} dxdf的形式不会比 f ( x ) f(x) f(x)简单,尤其是 f ( x ) f(x) f(x)较为复杂时,比如 64 x ( 1 − x ) ( 1 − 2 x ) 2 ( 1 − 8 x + 8 x 2 ) 2 64x(1-x)(1-2x)^2(1-8x+8x^2)^2 64x(1x)(12x)2(18x+8x2)2其微分形式更加复杂;这实际上为计算机的存储资源开销带来巨大挑战,尤其是当函数形式复杂时,所以符号微分也不是最好的选择。

自动微分

这里自动微分与符号微分相关,但是并不如上述那样作为一个整体进行求解;自动微分是基于一个有向图来进行求解,有forward和backward两种形式。比如对于这样的一个函数 f ( x 1 , x 2 ) = l n ( x 1 ) + x 1 x 2 − s i n ( x 2 ) f(x_1,x_2)=ln(x_1)+x_1x_2-sin(x_2) f(x1,x2)=ln(x1)+x1x2sin(x2),自动微分将其拆解为下面图的形式:
机器学习--基础--微分_第3张图片
这里每个节点代表一个操作,一个可微分的操作,比如:

  • v − 1 v_{-1} v1: v − 1 = x 1 v_{-1}=x_1 v1=x1 赋值操作
  • v 0 v_{0} v0: v 0 = x 2 v_0=x_2 v0=x2 赋值操作
  • v 1 v_1 v1: l n ( x 1 ) ln(x_1) ln(x1) 在赋值操作后,获取 v − 1 v_{-1} v1节点信息,并进行对数操作
  • v 2 v_2 v2: x 1 × x 2 x_1\times x_2 x1×x2 在获取两个节点信息后,进行乘法操作
  • v 3 v_3 v3: s i n ( x 2 ) sin(x_2) sin(x2) 在获取上一节点信息后,进行正弦操作
  • v 4 v_4 v4: l n ( x 1 ) + x 1 x 2 ln(x_1)+x_1x_2 ln(x1)+x1x2 在获得上两个节点信息后,进行加和操作
  • v 5 v_5 v5: l n ( x 1 ) + x 1 x 2 − s i n ( x 2 ) ln(x_1)+x_1x_2-sin(x_2) ln(x1)+x1x2sin(x2) 在获得上两个节点信息后,进行加和操作
    这样首先是将一个函数的各种操作进行分解成可微分的子操作。总结,自动微分首先有两个要点:
  1. 拆分各个计算项
  2. 确保这些计算项可微分

如果我们不看后面具体的做法,那么仅仅拆分到这一步,实际上就可以针对每一个节点进行求微分,求的方式有上面那三种都可以,因为拆分到每一个节点上的具体操作都是较为简单的;然后按照链式法则将其意义集合起来就行。
常见的用来处理自动微分的方法在基于上述有向无环图时有forward和backward两种方法。

forward 方法

前向方法,简单来说就是从自变量x出发进行微分求导。下面就是针对上述问题的前向求导过程
机器学习--基础--微分_第4张图片
这个过程其实可以通过jacobian 矩阵的形式来进行表述,这里不再进行赘述。但是forward方法在处理诸如深度神经网络时往往会带来更多的计算开销(当然这里看不出来,我没自己写过forward方法,所以也没有深入分析过),因而实际运用中最常见的是下面的backward方法

backward方法

回溯法,简而言之就是从因变量开始反推回去进行的计算,还是以上面的例子为例:
机器学习--基础--微分_第5张图片
实际计算步骤:
机器学习--基础--微分_第6张图片
注意上表右边是从下往上,推到最后。我们这里分析一下从下往上的步骤:

  1. 在v5 看来: v 5 = v 4 − v 3 v5=v4-v3 v5=v4v3,因此 ∂ v 5 ∂ v 4 = 1 \frac{\partial v_5}{\partial v_4}=1 v4v5=1, ∂ v 5 ∂ v 3 = − 1 \frac{\partial v_5}{\partial v_3}=-1 v3v5=1
  2. 在v4看来: v 4 = v 1 + v 2 v_4=v_1+v_2 v4=v1+v2,类似的,有两个偏微分都为1
  3. 在v3看来 v 3 = s i n ( v 0 ) v_3 = sin(v_0) v3=sin(v0),则有 c o s ( v 0 ) cos(v_0) cos(v0),将5代入则有0.2836
  4. 在v2看来 v − 1 × v 0 v_{-1}\times v_0 v1×v0两个部分构成,因此 ∂ v 2 ∂ v − 1 = v 0 \frac{\partial v_2}{\partial v_{-1}}=v_0 v1v2=v0, ∂ v 2 ∂ v 0 = v − 1 \frac{\partial v_2}{\partial v_0}=v_{-1} v0v2=v1
  5. 在v1看来, ∂ v 1 ∂ v − 1 = 1 v − 1 \frac{\partial v_1}{\partial v_{-1}}=\frac{1}{v_{-1}} v1v1=v11

这样参照上表从下往上的计算,把上面的项代入对应位置,逐渐求出各个子节点的导数。最终求得 d y d x 1 = 5.5 \frac{dy}{dx_1}=5.5 dx1dy=5.5,即 y y y对于 x 1 x_1 x1的偏微分。

自动微分与机器学习

众所周知,机器学习中存在大量的基于一阶梯度的优化方法,这些方法本身就是直接对上述backward方法的运用,这一点在上述链接的文档中有详细的统计说明。另外,传统机器学习中常用的基于二阶微分的方法,比如牛顿法,是结合了上述的微分方法计算梯度以及利用了海森矩阵;但是海森矩阵在实际运用中如果直接饮用那么每一次迭代的计算开销将会十分巨大,因而实际上使用的还是基于上述一阶微分所得出的海森矩阵的数值近似。
自动微分在目前的深度学习中的应用就更加广泛,可以说整个深度学习的提出就是建立在反向传播梯度的基础上,也就是backward计算的基础之上,这一点在上述链接中讲述非常详细。

自动微分与机器视觉

自动微分技术除了在于机器视觉相关的深度学习任务中最基石存在,还影像机器视觉的其他方面。
比如图形学中,有一派流派基于自动微分建模光线追踪,设计制作基于微分的渲染器,用于构建计算机生成的三维场景。另外也有在跟踪领域中,将自动微分技术应用于目标跟踪,手势跟踪等等。

你可能感兴趣的:(机器学习)