矢量求导的微分法则: 链式法则

  • 介绍
  • 核心原理
    • 矢量求导
    • 矩阵求导
  • 链式法则

介绍

这篇博文推导了矢量情形下, 标量函数对矢量进行求导的微分法则,从定义出发推导了链式法则的形式。

核心原理

核心原理:
标量情形下, 由中学的标量求导知识可知,忽略泰勒展开高次项,有: Δf(x)=f′(x)Δx\Delta f(x) = {f^{'}}(x) \Delta x Δf(x)=f′(x)Δx
即, 函数变化量 = 导数 * 变量变化量。

拓展到多变量情形下,显然有类似的:Δf(x,y)=f′(x)Δx+f′(y)Δy\Delta f(x,y) = {f^{'}}(x)\Delta x + {f^{'}}(y)\Delta yΔf(x,y)=f′(x)Δx+f′(y)Δy。

矢量求导

而一个矢量,可以看做多个标量的组合,如有矢量 x=[x1x2]\mathbf{x}=\left[\begin{array}{l}{x_{1}} \\ {x_{2}}\end{array}\right]x=[x1​x2​​]
f(x)f(\mathbf{x})f(x)是以矢量 x\mathbf{x}x为变量的标量函数, 那么根据上面的知识,有:

Δf(x)=f′(x1)Δx1+f′(x2)Δx2\Delta f(\mathbf{x}) = {f^{'}}(x_1)\Delta x_1 + {f^{'}}(x_2)\Delta x_2Δf(x)=f′(x1​)Δx1​+f′(x2​)Δx2​

利用线性代数知识,可以将其写为矩阵形式:
Δf(x)=[f′(x1)f′(x2)]×[Δx1Δx2]\Delta f(\mathbf{x}) = \left[\begin{array}{ll}{{f^{'}}(x_1)} & {{f^{'}}(x_2)}\end{array}\right] \times \left[\begin{array}{l}{\Delta x_{1}} \\ {\Delta x_{2}}\end{array}\right]Δf(x)=[f′(x1​)​f′(x2​)​]×[Δx1​Δx2​​]

其中,f′(x1){f^{'}}(x_1)f′(x1​)是一个多变量函数对单变量求导的结果,也被称为偏微分, 可写为:
f′(x1)=∂f(x)∂x1{{f^{'}}(x_1)}=\frac{{\partial f({\bf{x}})}}{{\partial {x_1}}}f′(x1​)=∂x1​∂f(x)​
同理, f′(x2)=∂f(x)∂x2{{f^{'}}(x_2)}=\frac{{\partial f({\bf{x}})}}{{\partial {x_2}}}f′(x2​)=∂x2​∂f(x)​
变化量的Δ\DeltaΔ符号往往用d\mathbf{d}d代替,利用这些表示,式子可以改写为:

df(x)=[∂f(x)∂x1∂f(x)∂x2]×[dx1dx2]\mathbf{d} f(\mathbf{x}) = \left[\begin{array}{ll}{\frac{{\partial f({\bf{x}})}}{{\partial {x_1}}}} & {\frac{{\partial f({\bf{x}})}}{{\partial {x_2}}}}\end{array}\right] \times \left[\begin{array}{l}{\mathbf{d}x_{1}} \\ {\mathbf{d} x_{2}}\end{array}\right]df(x)=[∂x1​∂f(x)​​∂x2​∂f(x)​​]×[dx1​dx2​​].

注意到,根据矢量微分的定义,标量函数对一个矢量求导的结果可表示为:
∇xf(x)=[∂f(x)∂x1∂f(x)∂x2]\nabla_{\mathbf{x}}f(\mathbf{x})= \left[\begin{array}{l}{\frac{{\partial f({\bf{x}})}}{{\partial {x_1}}}} \\ {\frac{{\partial f({\bf{x}})}}{{\partial {x_2}}}}\end{array}\right]∇x​f(x)=[∂x1​∂f(x)​∂x2​∂f(x)​​]

上式也被称为函数f(x)f(\mathbf{x})f(x)对于x\mathbf{x}x的梯度
利用这一定义,可以进一步的:
df(x)=∇xf(x)Tdx\mathbf{d} f(\mathbf{x}) =\nabla_{\mathbf{x}}f(\mathbf{x})^T\mathbf{d} \mathbf{x}df(x)=∇x​f(x)Tdx.
其中,dx=[dx1dx2]\mathbf{d} \mathbf{x}=\left[\begin{array}{l}{\mathbf{d}x_{1}} \\ {\mathbf{d} x_{2}}\end{array}\right]dx=[dx1​dx2​​], 上式也被称为对矢量x\mathbf{x}x的全微分

注意,为了便于理解,笔者以一个2×12\times12×1的矢量举例,但无疑,类似的过程可以推导出N维矢量的结论,从而统一为上式的表示。

矩阵求导

严格来说,矩阵也是矢量的一种。在许多时候,对于一个变量为x×yx\times yx×y的矩阵的求导问题,我们常用的处理方式是可以将其列化为xy∗1xy*1xy∗1的向量,再对其进行求导。为了便于理解,笔者同样以一个最简单的2×22\times22×2矩阵X\mathbf{X}X举例了:
X=[x1x3x2x4]\mathbf{X}=\left[\begin{array}{ll}{x_1} & {x_3} \\ {x_2} & {x_4}\end{array}\right]X=[x1​x2​​x3​x4​​]
根据定义(可以搜索维基百科),矩阵的求导(梯度)可以表示为:
∇Xf(X)=[∂f∂x1∂f∂x3∂f∂x2∂f∂x4]\nabla_{\mathbf{X}}f(\mathbf{X})=\left[\begin{array}{ll}{\frac{\partial f}{\partial x_{1}}} & {\frac{\partial f}{\partial x_{3}}} \\ {\frac{\partial f}{\partial x_{2}}} & {\frac{\partial f}{\partial x_{4}}}\end{array}\right]∇X​f(X)=[∂x1​∂f​∂x2​∂f​​∂x3​∂f​∂x4​∂f​​].
而如果对X\mathbf{X}X进行列化的话,求得的向量梯度中包含的元素,刚好对应了矩阵梯度的元素。 也就是说,一种解决的思路是:

  • 将矩阵变量列化为向量
  • 利用向量求导的结论,求出梯度
  • 将向量梯度矩阵化,就是所求的矩阵梯度。

这个方法非常有效,但有些时候,矩阵变量不容易向量化,如目标函数是矩阵的逆的时候。那么,我们可以按照上节的写法,推广到矩阵的形式,有:

df(X)=tr(∇Xf(X)TdX)\mathbf{d} f(\mathbf{X}) =\mathrm{tr}(\nabla_{\mathbf{X}}f(\mathbf{X})^T\mathbf{d} \mathbf{X})df(X)=tr(∇X​f(X)TdX).
这个读者可以自己推导一下,和上节的原理一致,由于线性代数的原因,在矩阵情况下会多一个tr(trace)。

链式法则

先讨论实数的情况:
标量情形下,我们知道,若f(x)=f(g(x))f(x) =f(g(x))f(x)=f(g(x)), 那么f′(x)=f′(g)×g′(x)f^{'}(x)=f^{'}(g)\times g^{'}(x)f′(x)=f′(g)×g′(x).
多维情况下,根据之前的类似思想,也可以推导结果,但这里我们使用上面讲述的方法

假设标量函数f(x)f(x)f(x), 中间变量矢量g\mathbf{g}g, 变量x\mathbf{x}x.
根据上面推导:

df(g)=∇gf(g)Tdg\mathbf{d} f(\mathbf{g}) =\nabla_{\mathbf{g}}f(\mathbf{g})^T\mathbf{d} \mathbf{g}df(g)=∇g​f(g)Tdg.
dg=∇xTg(x)dx\mathbf{d} \mathbf{g} = \nabla_{\mathbf{x^T}}\mathbf{g}(\mathbf{x})\mathbf{d} \mathbf{x}dg=∇xT​g(x)dx
(之前没有讨论矢量对矢量微分的情形,但显然很容易从标量函数情形推广)
因此有:
df(g)=∇gf(g)T∇xTg(x)dx\mathbf{d} f(\mathbf{g}) =\nabla_{\mathbf{g}}f(\mathbf{g})^T \nabla_{\mathbf{x^T}}\mathbf{g}(\mathbf{x})\mathbf{d} \mathbf{x}df(g)=∇g​f(g)T∇xT​g(x)dx.

可得:

∇xf(x)=(∇gf(g)T∇xTg(x))T=∇xgT×∇gf(g)\nabla_{\mathbf{x}}f(\mathbf{x}) = (\nabla_{\mathbf{g}}f(\mathbf{g})^T \nabla_{\mathbf{x^T}}\mathbf{g}(\mathbf{x}))^T= \nabla_{\mathbf{x}}\mathbf{g}^T\times \nabla_{\mathbf{g}}f(\mathbf{g})∇x​f(x)=(∇g​f(g)T∇xT​g(x))T=∇x​gT×∇g​f(g).

最后,总结下多种情形链式法则的结论,推导过程均可由上面过程拓展:

  • 标量 fff, 矢量g\mathbf{g}g, 标量xxx
    ∇xf(x)=∂f∂x=∂f∂gT×∂g∂x\nabla_{x}f(x) =\frac{{\partial f}}{{\partial x}}=\frac{{\partial f}}{{\partial {\mathbf{g}^T}}} \times \frac{{\partial \mathbf{g}}}{{\partial x}}∇x​f(x)=∂x∂f​=∂gT∂f​×∂x∂g​
    *标量 fff, 矢量ggg, 矢量xxx
    ∂f∂x=∂gT∂x×∂f∂g\frac{{\partial f}}{{\partial \mathbf{x}}}=\frac{{\partial \mathbf{g}^T}}{{\partial \mathbf{x}}}\times \frac{{\partial f}}{{\partial {\mathbf{g}}}} ∂x∂f​=∂x∂gT​×∂g∂f​
    *矢量 fff, 矢量ggg, 矢量xxx
    ∂f∂x=∂gT∂x×∂f∂g\frac{{\partial \mathbf{f}}}{{\partial \mathbf{x}}}=\frac{{\partial \mathbf{g}^T}}{{\partial \mathbf{x}}}\times \frac{{\partial \mathbf{f}}}{{\partial {\mathbf{g}}}} ∂x∂f​=∂x∂gT​×∂g∂f​
    *标量 fff, 矩阵ggg, 标量xxx
    ∂f∂x=tr(∂f∂gT∂g∂x)\frac{{\partial f}}{{\partial x}}= \mathrm{tr}(\frac{{\partial f}}{{\partial {\mathbf{g}^T}}} \frac{{\partial \mathbf{g}}}{{\partial x}})∂x∂f​=tr(∂gT∂f​∂x∂g​)

矢量求导的微分法则: 链式法则相关推荐

  1. 矢量求导之位移与速度及加速度

    矢量求导之位移与速度及加速度

  2. 求导,微分,积分的区别

    导数和微分 导数和微分在书写的形式有些区别,如y'=f(x),则为导数,书写成dy=f(x)dx,则为微分.积分是求原函数,可以形象理解为是函数导数的逆运算. 积分 :设F(x)为函数f(x)的一个原 ...

  3. matlab 微分命令 求导,Matlab微分和积分

    第六讲 Matlab 微分和积分 理论介绍:微分.有限差分.积分.离散求和 软件求解:函数及常见注意事项 一.一元函数导数与微分 Matlab 由命令函数diff 来完成求导运算,调用格式为:diff ...

  4. 数理基础(高等代数)------sympy三角、指数、对数、幂函数、极限、求导、微分、积分等基础知识

    sympy基础知识 1.sympy import sympy print(sympy.pi.evalf())#圆周率π print(sympy.E)#e print(sympy.I)#虚数i prin ...

  5. 矩阵求导(标量对矢量求导)

    文章目录 前言 一.标量对向量求导 二.例子 1.y=wT∗xy = w^T*xy=wT∗x 2.y=xT∗wy = x^T * wy=xT∗w 2.y=xT∗An∗n∗xy = x^T * A_{n ...

  6. 线性代数之 矩阵求导(4)矩阵微分,迹与求导

    线性代数之 矩阵求导(4)迹与矩阵求导 前言 矩阵微分定义 矩阵微分计算法则 常矩阵 线性 乘积 转置 迹 通过矩阵微分进行求导 常用的矩阵微分 后记 前言 本次将记录如何进行矩阵求导(标量对矩阵). ...

  7. 导数的四则运算法则_【数学】求导的方法之四则运算法则

    小孩子才分对错,成年人只看利弊. 没错,导数就是一个可爱的小孩子,在小孩子的世界中有它最简单的交友规则,只要你遵守了,你们就是好朋友,一辈子的好朋友. 我们来了解一下小孩子的交友法则→四则运算法则. ...

  8. 浅谈微分求导+泰勒展开+生成函数

    前言 作为求解数论多项式题的必备知识,这几样东西每一样都不会讲得太深入,但是互相关联. 以下部分讲解摘自巨佬DY的"生成函数.pdf". (由于笔者对富文本编辑器情有独钟,下面的推 ...

  9. 复合函数求导的链式法则

    定义 若有两个一元函数 f(x)f(x)f(x) 和 g(x)g(x)g(x) ,我们可以把 ggg 的函数值作为 fff 的自变量,得到一个新的函数称为 f(x)f(x)f(x) 和 g(x)g(x ...

最新文章

  1. 2021 年 NLP 重要国际会议时间
  2. 《Python编程初学者指南》——1.6 回到Game Over程序
  3. LeetCode-数组-704. 二分查找
  4. 动态加入JS及加入CSS
  5. Android与Js进行交互
  6. 双向链表示意图_图文详解双向链表原理
  7. 高中计算机算计Access怎么做,Access非常简单实用的计算器
  8. JS判断两个日期的差或者判断两个日期的大小
  9. ad16不能去除铺铜_海水小讲堂006 铜离子的正确使用姿势
  10. 关于map的几种非常规排序
  11. JVM调优总结:一些概念
  12. 浙大 PAT 甲级 1077 Kuchiguse
  13. 斐讯 http文件服务器,斐讯刷机教程(硬件版本A5)
  14. STM32 使用基本定时器实现微秒us级延时
  15. 【魔方攻略】斜转魔方教程(原创)
  16. 支气管分割并3D展示效果
  17. A - Oulipo(KMP算法经典)
  18. java线程-从生产者和消费者模型说起
  19. powertop代码走读记录
  20. 怎么使用config文件

热门文章

  1. android高德地图定位到村,高德地图可以定位手机找人吗
  2. 亲测可用fiddler手机抓包配置代理后没有网络
  3. ios系统元素悬浮滑动错乱,和ios页面无故刷新问题
  4. Hough直线变换、圆变换原理解析与python实验
  5. 只有数据分析师才能看懂的十大吐槽
  6. 腾讯云linux root权限获取,普通用户获取root权限
  7. docker入门实践,安装指定版本的mysql镜像
  8. 上海中国电信IPTV频道列表
  9. 非计算机专业可以考软考吗?
  10. DeepID算法实践