自动微分(AutoDiff)的原理

自动微分(AutoDiff)的原理

1/ 各种自动微分的优缺点1

机器学习的一个重要的任务,就是对参数求导得到损失函数对于每个参数的偏导数,然后进行梯度下降。

而求偏微分,可以选择的方法有:手工微分(manual differentiation)、符号微分(symbolic differentiation)、数值微分(numerical differentiation)、前向自动微分(forward-mode autodiff)和反向自动微分(reverse-mode autodiff)。

而在 Julia 的 Flux 包里和 Tensorflow 一样,就是使用的反向自动微分。

手工微分:手工微分对于复杂的函数,会变得非常繁琐,容易出错

符号微分:利用计算图来处理。但是对于复杂的函数,会出现计算图十分巨大的,降低性能,而一个最大的缺点就是,符号微分无法处理任意编码的函数。

数值微分:数值微分根据公式:
h ′ ( x ) = lim ⁡ x → x 0 h ( x ) − h ( x 0 ) x − x 0 = lim ⁡ ϵ → 0 h ( x 0 + ϵ ) − h ( x 0 ) ϵ \begin{aligned} h^{\prime}(x)&=\lim_{x\rightarrow x_0}\frac{h(x)-h(x_0)}{x-x_0}\\ &=\lim_{\epsilon\rightarrow 0}\frac{h(x_0+\epsilon)-h(x_0)}{\epsilon} \end{aligned} h(x)=xx0limxx0h(x)h(x0)=ϵ0limϵh(x0+ϵ)h(x0)
要计算函数 f ( x 1 , x 2 , ⋯   , x n ) f(x_1,x_2,\cdots,x_n) f(x1,x2,,xn) 在某个点关于 x i x_i xi 的偏导数,只需要计算当 ϵ \epsilon ϵ 很小的时候 f ( x 1 , x 2 , ⋯   , x i − ϵ , ⋯   , x n ) f(x_1,x_2,\cdots,x_i-\epsilon,\cdots,x_n) f(x1,x2,,xiϵ,,xn) 处以 ϵ \epsilon ϵ 的商。

不过数值微分的缺点就是,结果并不准确,是一种近似,并且会重复调用函数 f ( x ) f(x) f(x) 很多次,在机器学习参数很多的情况下,会变得很低效。但是由于数值微分很容易执行,它可以作为一个检查其他算法是否正确的有用工具。

前向自动微分:虽然既不是符号微分也不是数值微分,但是在某些方面,前向自动微分是符号微分和数值微分的结合。

前向自动微分依赖于 dual number,形式为 a + b ϵ a+b\epsilon a+bϵ,其中 a , b a,b a,b 是两个是两个实数, ϵ \epsilon ϵ 是一个无穷小的数字。dual number 在存储的时候,用一对浮点数表示,例如 42 + 24 ϵ 42+24\epsilon 42+24ϵ ( 42 , 0 , 24.0 ) (42,0,24.0) (42,0,24.0) 表示。

对于 dual number 的基本运算如下:(注意 ϵ 2 = 0 \epsilon^2=0 ϵ2=0
λ ( a + b ϵ ) = λ a + λ b ϵ ( a + b ϵ ) + ( c + d ϵ ) = ( a + c ) + ( b + d ) ϵ ( a + b ϵ ) × ( c + d ϵ ) = a c + ( a d + b d ) ϵ + ( b d ) ϵ 2 = a c + ( a d + b c ) ϵ \begin{aligned} \lambda(a+b\epsilon)&=\lambda a+\lambda b\epsilon\\ (a+b\epsilon)+(c+d\epsilon)&=(a+c)+(b+d)\epsilon\\ (a+b\epsilon)\times(c+d\epsilon)&=ac+(ad+bd)\epsilon+(bd)\epsilon^2\\ &=ac+(ad+bc)\epsilon \end{aligned} λ(a+bϵ)(a+bϵ)+(c+dϵ)(a+bϵ)×(c+dϵ)=λa+λbϵ=(a+c)+(b+d)ϵ=ac+(ad+bd)ϵ+(bd)ϵ2=ac+(ad+bc)ϵ
更为重要的是 h ( a + b ϵ ) = h ( a ) + b × h ′ ( a ) ϵ h(a+b\epsilon)=h(a)+b\times h^{\prime}(a)\epsilon h(a+bϵ)=h(a)+b×h(a)ϵ,所以当我们计算 h ( a + ϵ ) h(a+\epsilon) h(a+ϵ) 的时候,可以一次给出 h ( a ) h(a) h(a) h ′ ( a ) h^{\prime}(a) h(a).

假如函数 f ( x , y ) = x 2 y + y + 2 f(x,y)=x^2y+y+2 f(x,y)=x2y+y+2,我们要计算关于 x x x 的偏导数,需要做的就是计算 f ( 3 + ϵ , 4 ) f(3+\epsilon,4) f(3+ϵ,4),结果为一个 dual number 42 + 24 ϵ 42+24\epsilon 42+24ϵ,那么就可以得到 f ( 3 , 4 ) = 42 f(3,4)=42 f(3,4)=42 并且偏导数 ∂ x f ( 3 , 4 ) = 24 \partial_xf(3,4)=24 xf(3,4)=24

前向自动微分的缺点就是,穿过一次图,只能计算一个参数的偏导数,虽然结果精确,但是对于多个参数的时候,要穿过很多次图。

反向自动微分:正向穿过图来计算每个节点的值,然后第二次反向穿过图,计算所有的偏导数。

反向自动微分(Reverse-mode autodiff)依赖于链式法则: ∂ f ∂ x = ∂ f ∂ n i × ∂ n i ∂ x \frac{\partial f}{\partial x}=\frac{\partial f}{\partial n_i}\times \frac{\partial n_i}{\partial x} xf=nif×xni.

自动微分认为,任何数值计算的本质其实是一系列可微分算子的组合。那么,我们就可以假设我们求不出这个函数的导数,但是将该函数拆解成为其他子部分后,子部分可以通过常规的求导方式得到,最终将每个子部分进行组合,就得到了最终的结果。2


  1. CSDN:DL | 一文读懂自动微分( AutoDiff)原理 ↩︎

  2. 知乎:Lecture 4: Automatic Differentiation ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值