书到用时方恨少,知识到用时才知道没有学精通。函数求导的链式规则,我记得f(g(x))' = f'(g)*g'(x)。我甚至还记得更便于理解记忆的形式:df/dx = df/dg * dg/dx. 没错,看上去我记得很清楚。可是实际工作中碰到的函数是这样的:
已知:
f(g1, g2, ...., gm) // f 是 g1, g2, ..., gm 的函数
g1(u1, u2, ...., un) // g1 是 u1, u2, ...., un 的函数
g2(u1, u2, ...., un)
...
gm(u1, u2, ..., un)
u1(x1, x2, ... xk) // u1是x1, x2, ..., xk 的函数
u2(x1, x2, ... xk)
...
un(x1, x2, ... xk)
求:f'(x1),..., f'(xk) // 求 f 对 x1, x2, ..., xk 的导数
居然一下子傻眼了。这里,一个函数有多个变量,而变量本身又是函数,传递超过两层。折腾了半天,才了解链式规则的真谛:函数f对x的微分,等于f对其自身变量u的微分乘以u对x的微分。如果自身变量不止一个,则要把对所有变量的微分相加。所以,正确的结果是:
f'(x1) = f'(g1)*g1'(x1) + f'(g2)*g2'(x1) + .... + f'(gm)*gm'(x1)
...
f'(xk) = f'(g1)*g1'(xk) + f'(g2)*g2'(xk) + .... + f'(gm)*gm'(xk)
写成易于理解的形式,是:
df/dx1 = df/dg1 * dg1/dx1 + df/dg2 * dg2/dx1 + .... + df/dgm * dgm/dx1
...
df/dxk = df/dg1 * dg1/dxk + df/dg2 * dg2/dxk + ... + df/dgm * dgm/dxk
可是,g1'(x1),也就是dg1/dx1仍然是不知道的啊。答案是继续运用链式规则:
g1'(x1) = g1'(u1)*u1'(x1) + g1'(u2)*u2'(x1) + .... + g1'(un)*un'(x1)
写成易于理解的形式,是:
dg1/dx1 = dg1/du1 * du1/dx1 + dg1/du2 * du2/dx1 + ... + dg1/dun * dun/dx1
到这一步,u1'(x1),也就是dg1/du1就是已知的了。一路回代,就可以写出f'(x1) 的公式了。
后记:整个回代过程如果用程序实现,就是前向自动微分方法(Forward mode automatic differenation)。因为任意复杂的函数最后都可以写成基本数学函数(u1, u2, ..., un)的组合,而基本数学函数的微分公式我们是知道的,可以以硬编码的方式写进去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY