复合函数的前向微分与反向自动微分计算
关于
- 首次发表日期:2024-09-13
- 参考:
- 水平有限,如有错误,请不吝指出
前向与反向自动微分:数学
先复习一下微积分求导法则
微积分求导法则复习
乘法法则
f(x)=u(x)×v(x)
dxdyf′(x)=dxdu×v+dxdv×u=u′v+v′u
f(x)uu′f′(x)=(3x−5)×(4x+7)=3x−5v=4x+7=3v′=4=3(4x+7)+4(3x−5)=12x+21+12x−20=24x+1=24x+1
除法法则
f(x)=v(x)u(x)
f′(x)dxdy=v2u′v−v′u=v2dxduv−dxdvu
f(x)uu′f′(x)=4x+73x−5=3x−5v=4x+7=3v′=4=(4x+7)23(4x+7)−4(3x−5)=(4x+7)212x+21−12x+20=(4x+7)241
cos和sin求导
ydxdy=sin(x)=cos(x)
y=cos(x)dxdy=−sin(x)
链式法则(单变量复合函数)
y=f(u)u=f(x)
dxdy=dudy⋅dxdu
yydudydxdy=(2x+4)3=u3 and u=2x+4=3u2dxdu=2=3u2×2=2×3(2x+4)2=6(2x+4)2
多变量链式法则(Case 1)
zxy=f(x,y)=g(t)=h(t)
dtdz=∂x∂fdtdx+∂y∂fdtdy
多变量链式法则(Case 2)
zxy=f(x,y)=g(s,t)=h(s,t)
∂s∂z=∂x∂z∂s∂x+∂y∂z∂s∂y∂t∂z=∂x∂z∂t∂x+∂y∂z∂t∂y
当计算∂s∂z时,我们保持(hold)t 固定并计算 z 对 s 的普通导数,即应用多变量链式法则(Case 1)。计算∂t∂z时同理。
多变量链式法则(广义版)
uxk=f(x1,x2,…,xn)=g(t1,t2,…,tm)for 1≤k≤n
∂ti∂u=∂x1∂u∂ti∂x1+∂x2∂u∂ti∂x2+⋯+∂xn∂u∂ti∂xnfor 1≤i≤m
复合函数,偏微分,链式法则,前向和反向自动微分
前向与反向的计算顺序
对于组合函数:
yw0w1w2w3=f(g(h(x)))=f(g(h(w0)))=f(g(w1))=f(w2)=w3=x=h(w0)=g(w1)=f(w2)=y
链式法则将给出:
∂x∂y=∂w2∂y∂w1∂w2∂x∂w1=∂w2∂f(w2)∂w1∂g(w1)∂x∂h(w0)
计算顺序:
- 前向微分计算时 ,先计算∂w1/∂x,然后计算∂w2/∂w1,最后计算∂y/∂w2
- 反向微分计算时,先计算∂y/∂w2,然后计算∂w2/∂w1,最后计算∂w1/∂x
前向微分
对于组合函数:
rstxyzu=?=?=?=g(r,s,t)=h(r,s,t)=i(r,s,t)=f(x,y,z)
前向微分计算:
∂v∂r∂v∂s∂v∂t∂v∂x∂v∂y∂v∂z∂v∂u=?=?=?=∂r∂x∂v∂r+∂s∂x∂v∂s+∂t∂x∂v∂t=∂r∂y∂v∂r+∂s∂y∂v∂s+∂t∂y∂v∂t=∂r∂z∂v∂r+∂s∂z∂v∂s+∂t∂z∂v∂t=∂x∂u∂v∂x+∂y∂u∂v∂y+∂z∂u∂v∂z
当v=r,即将r作为独立变量并将s和t固定时,可得
∂v∂r∂v∂s∂v∂t∂r∂u=1=0=0=∂x∂u∂r∂x+∂y∂u∂r∂y+∂z∂u∂r∂z
当v=s,即将s作为独立变量并将r和t固定时,可得
∂v∂r∂v∂s∂v∂t∂s∂u=0=1=0=∂x∂u∂s∂x+∂y∂u∂s∂y+∂z∂u∂s∂z
当v=t,即将t作为独立变量并将s和r固定时,可得
∂v∂r∂v∂s∂v∂t∂t∂u=0=0=1=∂x∂u∂t∂x+∂y∂u∂t∂y+∂z∂u∂t∂z
反向微分
对于组合函数:
u1u2y1y2y3=r(x1,x2)=s(x1,x2)=f(u1,u2)=g(u1,u2)=h(u1,u2)
反向微分计算:
∂y1∂s∂y2∂s∂y3∂s∂u1∂s∂u2∂s∂x1∂s∂x2∂s=?=?=?=∂y1∂s∂u1∂y1+∂y2∂s∂u1∂y2+∂y3∂s∂u1∂y3=∂y1∂s∂u2∂y1+∂y2∂s∂u2∂y2+∂y3∂s∂u2∂y3=∂u1∂s∂x1∂u1+∂u2∂s∂x1∂u2=∂u1∂s∂xx∂u1+∂u2∂s∂xx∂u2
可以想象有一个函数s=function(y1,y2,y3)
当s=y1,即将y1作为独立变量并将y2和y3固定时,可得
∂y1∂s∂y2∂s∂y3∂s∂u1∂s∂u2∂s∂x1∂s∂x2∂s=1=0=0=∂y1∂s∂u1∂y1=∂y1∂s∂u2∂y1=∂u1∂s∂x1∂u1+∂u2∂s∂x1∂u2=∂u1∂s∂xx∂u1+∂u2∂s∂xx∂u2
以例子说明自动微分的计算
例子
假设有2个输入变量(x1, x2)和2个输出变量(y1, y2):
m1m2y1y2=x1⋅x2+sin(x1)=4x1+2x2+cos(x2)=m1+m2=m1⋅m2(1)
即:
y1y2=x1⋅x2+sin(x1)+4x1+2x2+cos(x2)=(x1+x2+sin(x1))⋅(4x1+2x2+cos(x2))
其中:
∂x1∂y1∂x2∂y1∂x1∂y2=x2+cos(x1)+4=x1+2−sin(x2)=(x2+cos(x1))⋅m2+m1⋅4
接下来,我们将以这个例子说明如何进行前向自动微分和反向自动微分
前向自动微分
我们将用到如下的链式法则:
∂t∂w=i∑(∂ui∂w⋅∂t∂ui)=∂u1∂w⋅∂t∂u1+∂u2∂w⋅∂t∂u2+⋯
其中:
- w表示输出
- ui表示直接影响w的输入变量
- t表示有待给出的输入变量
- 在例子中,为x1或者x2其中之一
在计算之前,我们先将公式(1)分解为简单的算子计算:
x1x2abcdm1m2y1y2=?=?=x1⋅x2=sin(x1)=4x1+2x2=cos(x2)=a+b=c+d=m1+m2=m1⋅m2(2)
现在我们对有待给出的变量t求导:
∂t∂x1∂t∂x2∂t∂a∂t∂b∂t∂c∂t∂d∂t∂m1∂t∂m2∂t∂y1∂t∂y2=?=?=x2∂t∂x1+x1∂t∂x2=cos(x1)∂t∂x1=4∂t∂x1+2∂t∂x2=−sin(x2)∂t∂x2=∂t∂a+∂t∂b=∂t∂c+∂t∂d=∂t∂m1+∂t∂m2=∂t∂m1⋅m2+∂t∂m2⋅m1
前面有提到t是有待给出的,现在是时候给出了:
- 将t=x1代入以上公式,则∂t∂x1=1而∂t∂x2=0,然后可以计算∂x1∂y1和∂x1∂y2
∂t∂x1∂t∂x2∂t∂a∂t∂b∂t∂c∂t∂d∂t∂m1∂t∂m2∂t∂y1∂t∂y2=1=0=x2∂t∂x1+x1∂t∂x2=x2=cos(x1)∂t∂x1=cos(x1)=4∂t∂x1+2∂t∂x2=4=−sin(x2)∂t∂x2=0=∂t∂a+∂t∂b=x2+cos(x1)=∂t∂c+∂t∂d=4=∂t∂m1+∂t∂m2=x2+cos(x1)+4=∂t∂m1⋅m2+∂t∂m2⋅m1=(x2+cos(x1))⋅m2+4⋅m1
- 将t=x2代入以上公式,则∂t∂x1=0而∂t∂x2=1,然后可以计算∂x2∂y1和∂x2∂y2
可以推断:
- 当有n个输入变量时(本例中有2个),需要计算n次上述公式。
- 假设神经网络中的输入是一张1280 x 720的图片,输出是51个浮点数,那么前向微分方法则需要计算921600次。
反向自动微分
我们将用到如下的链式法则:
∂u∂s=i∑(∂u∂wi⋅∂wi∂s)=∂u∂w1⋅∂w1∂s+∂u∂w2⋅∂w2∂s+⋯
其中:
- u 表示输入变量
- wi 表示依赖 u 的输出变量
- s 表示有待给出的变量
回顾拆解后的简单算子计算(2):
x1x2abcdm1m2y1y2=?=?=x1⋅x2=sin(x1)=4x1+2x2=cos(x2)=a+b=c+d=m1+m2=m1⋅m2(2)
现在计算反向微分:
∂y1∂s∂y2∂s∂m1∂s∂m2∂s∂a∂s∂b∂s∂c∂s∂d∂s∂x1∂s∂x2∂s=?=?=∂y1∂s∂m1∂y1+∂y2∂s∂m1∂y2=∂y1∂s∂m2∂y1+∂y2∂s∂m2∂y2=∂m1∂s∂a∂m1=∂m1∂s∂b∂m1=∂m2∂s∂c∂m2=∂m2∂s∂d∂m2=∂a∂s∂x1∂a+∂b∂s∂x1∂b+∂c∂s∂x1∂c=∂a∂s∂x1∂a+∂c∂s∂x1∂c+∂d∂s∂x1∂d
当s=y1时:
∂y1∂s∂y2∂s∂m1∂s∂m2∂s∂a∂s∂b∂s∂c∂s∂d∂s∂x1∂s∂x2∂s=1=0=∂y1∂s∂m1∂y1+∂y2∂s∂m1∂y2=1=∂y1∂s∂m2∂y1+∂y2∂s∂m2∂y2=1=∂m1∂s∂a∂m1=1=∂m1∂s∂b∂m1=1=∂m2∂s∂c∂m2=1=∂m2∂s∂d∂m2=1=∂a∂s∂x1∂a+∂b∂s∂x1∂b+∂c∂s∂x1∂c=1⋅x2+1⋅cos(x1)+1⋅4=x2+cos(x1)+4=∂a∂s∂x2∂a+∂c∂s∂x2∂c+∂d∂s∂x2∂d=1⋅x1+1⋅2+1⋅(−sin(x2))=x1+2−sin(x2)
同理可以计算当s=y2时。
可以推断:
- 当有n个输出变量时(本例中有2个),需要计算n次上述公式。
- 假设神经网络中的输入是一张1280 x 720的图片,输出是51个浮点数,那么反向微分方法则需要计算51次。