复合函数的前向微分与反向自动微分计算

复合函数的前向微分与反向自动微分计算

关于

前向与反向自动微分:数学

先复习一下微积分求导法则

微积分求导法则复习

乘法法则

f(x)=u(x)×v(x)

dydx=dudx×v+dvdx×uf(x)=uv+vu

f(x)=(3x5)×(4x+7)u=3x5v=4x+7u=3v=4f(x)=3(4x+7)+4(3x5)=12x+21+12x20=24x+1=24x+1

除法法则

f(x)=u(x)v(x)

f(x)=uvvuv2dydx=dudxvdvdxuv2

f(x)=3x54x+7u=3x5v=4x+7u=3v=4f(x)=3(4x+7)4(3x5)(4x+7)2=12x+2112x+20(4x+7)2=41(4x+7)2

cos和sin求导

y=sin(x)dydx=cos(x)

y=cos(x)dydx=sin(x)

链式法则(单变量复合函数)

y=f(u)u=f(x)

dydx=dydududx

y=(2x+4)3y=u3 and u=2x+4dydu=3u2dudx=2dydx=3u2×2=2×3(2x+4)2=6(2x+4)2

多变量链式法则(Case 1)

z=f(x,y)x=g(t)y=h(t)

dzdt=fxdxdt+fydydt

多变量链式法则(Case 2)

z=f(x,y)x=g(s,t)y=h(s,t)

zs=zxxs+zyyszt=zxxt+zyyt

当计算zs时,我们保持(hold)t 固定并计算 zs 的普通导数,即应用多变量链式法则(Case 1)。计算zt时同理。

多变量链式法则(广义版)

u=f(x1,x2,,xn)xk=g(t1,t2,,tm)for 1kn

uti=ux1x1ti+ux2x2ti++uxnxntifor 1im

复合函数,偏微分,链式法则,前向和反向自动微分

前向与反向的计算顺序

对于组合函数:

y=f(g(h(x)))=f(g(h(w0)))=f(g(w1))=f(w2)=w3w0=xw1=h(w0)w2=g(w1)w3=f(w2)=y

链式法则将给出:

yx=yw2w2w1w1x=f(w2)w2g(w1)w1h(w0)x

计算顺序:

  • 前向微分计算时 ,先计算w1/x,然后计算w2/w1,最后计算y/w2
  • 反向微分计算时,先计算y/w2,然后计算w2/w1,最后计算w1/x

前向微分

对于组合函数:

r=?s=?t=?x=g(r,s,t)y=h(r,s,t)z=i(r,s,t)u=f(x,y,z)

前向微分计算:

rv=?sv=?tv=?xv=xrrv+xssv+xttvyv=yrrv+yssv+yttvzv=zrrv+zssv+zttvuv=uxxv+uyyv+uzzv

v=r,即将r作为独立变量并将st固定时,可得

rv=1sv=0tv=0ur=uxxr+uyyr+uzzr

v=s,即将s作为独立变量并将rt固定时,可得

rv=0sv=1tv=0us=uxxs+uyys+uzzs

v=t,即将t作为独立变量并将sr固定时,可得

rv=0sv=0tv=1ut=uxxt+uyyt+uzzt

反向微分

对于组合函数:

u1=r(x1,x2)u2=s(x1,x2)y1=f(u1,u2)y2=g(u1,u2)y3=h(u1,u2)

反向微分计算:

sy1=?sy2=?sy3=?su1=sy1y1u1+sy2y2u1+sy3y3u1su2=sy1y1u2+sy2y2u2+sy3y3u2sx1=su1u1x1+su2u2x1sx2=su1u1xx+su2u2xx

可以想象有一个函数s=function(y1,y2,y3)

s=y1,即将y1作为独立变量并将y2y3固定时,可得

sy1=1sy2=0sy3=0su1=sy1y1u1su2=sy1y1u2sx1=su1u1x1+su2u2x1sx2=su1u1xx+su2u2xx

以例子说明自动微分的计算

例子

假设有2个输入变量(x1, x2)和2个输出变量(y1, y2):

(1)m1=x1x2+sin(x1)m2=4x1+2x2+cos(x2)y1=m1+m2y2=m1m2

即:

y1=x1x2+sin(x1)+4x1+2x2+cos(x2)y2=(x1+x2+sin(x1))(4x1+2x2+cos(x2))

其中:

y1x1=x2+cos(x1)+4y1x2=x1+2sin(x2)y2x1=(x2+cos(x1))m2+m14

接下来,我们将以这个例子说明如何进行前向自动微分和反向自动微分

前向自动微分

我们将用到如下的链式法则:

(1)wt=i(wuiuit)(2)=wu1u1t+wu2u2t+

其中:

  • w表示输出
    • 在例子中,为y1或者y2
  • ui表示直接影响w的输入变量
    • 在例子中,为ab
  • t表示有待给出的输入变量
    • 在例子中,为x1或者x2其中之一

在计算之前,我们先将公式(1)分解为简单的算子计算:

(2)x1=?x2=?a=x1x2b=sin(x1)c=4x1+2x2d=cos(x2)m1=a+bm2=c+dy1=m1+m2y2=m1m2

现在我们对有待给出的变量t求导:

x1t=?x2t=?at=x2x1t+x1x2tbt=cos(x1)x1tct=4x1t+2x2tdt=sin(x2)x2tm1t=at+btm2t=ct+dty1t=m1t+m2ty2t=m1tm2+m2tm1

前面有提到t是有待给出的,现在是时候给出了:

  • t=x1代入以上公式,则x1t=1x2t=0,然后可以计算y1x1y2x1

x1t=1x2t=0at=x2x1t+x1x2t=x2bt=cos(x1)x1t=cos(x1)ct=4x1t+2x2t=4dt=sin(x2)x2t=0m1t=at+bt=x2+cos(x1)m2t=ct+dt=4y1t=m1t+m2t=x2+cos(x1)+4y2t=m1tm2+m2tm1=(x2+cos(x1))m2+4m1

  • t=x2代入以上公式,则x1t=0x2t=1,然后可以计算y1x2y2x2

可以推断:

  • 当有n个输入变量时(本例中有2个),需要计算n次上述公式。
  • 假设神经网络中的输入是一张1280 x 720的图片,输出是51个浮点数,那么前向微分方法则需要计算921600次。

反向自动微分

我们将用到如下的链式法则:

(3)su=i(wiuswi)(4)=w1usw1+w2usw2+

其中:

  • u 表示输入变量
  • wi 表示依赖 u 的输出变量
  • s 表示有待给出的变量

回顾拆解后的简单算子计算(2):

(2)x1=?x2=?a=x1x2b=sin(x1)c=4x1+2x2d=cos(x2)m1=a+bm2=c+dy1=m1+m2y2=m1m2

现在计算反向微分:

sy1=?sy2=?sm1=sy1y1m1+sy2y2m1sm2=sy1y1m2+sy2y2m2sa=sm1m1asb=sm1m1bsc=sm2m2csd=sm2m2dsx1=saax1+sbbx1+sccx1sx2=saax1+sccx1+sddx1

s=y1时:

sy1=1sy2=0sm1=sy1y1m1+sy2y2m1=1sm2=sy1y1m2+sy2y2m2=1sa=sm1m1a=1sb=sm1m1b=1sc=sm2m2c=1sd=sm2m2d=1sx1=saax1+sbbx1+sccx1=1x2+1cos(x1)+14=x2+cos(x1)+4sx2=saax2+sccx2+sddx2=1x1+12+1(sin(x2))=x1+2sin(x2)

同理可以计算当s=y2时。

可以推断:

  • 当有n个输出变量时(本例中有2个),需要计算n次上述公式。
  • 假设神经网络中的输入是一张1280 x 720的图片,输出是51个浮点数,那么反向微分方法则需要计算51次。
posted @   shizidushu  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示