矩阵求导原理详解

目录

序言

一.标量对向量求导

二.标量对矩阵求导

2.1 基本定义

2.2 一个在机器学习中常见的例子

三.向量对向量的导数

四.矩阵求导链式法则

序言

如果你对机器学习|深度学习相关模型的底层原理推导感兴趣的话,矩阵求导的知识是绕不开的。所以本文我想帮助对这一块感兴趣且有疑问的小伙伴对矩阵求导相关知识进行梳理。

一.标量对向量求导

f(x)=a^Tx\rightarrow\frac{\partial f}{\partial x}=a

这里 a 和 x 均是列向量(不加T的默认表示列向量,后面出现不再赘述)

跟大家说一下我对公式的理解,这个公式是如何诞生的(ps:我觉得搞清楚公式产生的原因比记住公式本身更重要,掌握创造公式的思路,以后你自己也可以造新的公式)

x=[x_1,x_2,...x_n]^Tf(x)=a_1x_1+a_2x_2+...a_nx_n,可以发现f对每个x_i的偏导均为前面的系数a_i,此时我们想找一种优雅的规范,把x的导数统一组织起来,那最简单的方式就是把其对应的导数也组织成与x相同的向量形式,即a=[a_1,a_2,...a_n]^T,这样,fx的导数就可以写成上面那个简单的形式。

二.标量对矩阵求导

2.1 基本定义

先给出结论,下面再分析公式的形成思想:

df=Tr\left[(\frac{\partial f}{\partial x})^Tdx\right]

其中,f为标量,x\frac{\partial f}{\partial x}均为 m×n 的矩阵。

设:

x=\left[ \begin{matrix} x_{11} &x_{12} &\cdots &x_{1n}\\x_{21} &x_{22} &\cdots &x_{2n}\\ \vdots &\vdots &\ddots &\vdots \\x_{m1} &x_{m2} &\cdots &x_{mn}\end{matrix} \right]

则标量fx的导数可表示为:

\frac{\partial f}{\partial x}=\left[ \begin{matrix} \frac{\partial f}{\partial x_{11}} &\frac{\partial f}{\partial x_{12}} &\cdots &\frac{\partial f}{\partial x_{1n}}\\\frac{\partial f}{\partial x_{21}} &\frac{\partial f}{\partial x_{22}} &\cdots &\frac{\partial f}{\partial x_{2n}}\\ \vdots &\vdots &\ddots &\vdots \\\frac{\partial f}{\partial x_{m1}} &\frac{\partial f}{\partial x_{m2}} &\cdots &\frac{\partial f}{\partial x_{mn}}\end{matrix} \right]

那么此时考虑另一个问题,f的微分如何优雅的表示?首先以标量微分为例:设zuv的二元函数,则dz=\frac{\partial z}{\partial u}du+\frac{\partial z}{\partial v}dv,可以进一步写成dz=[\frac{\partial z}{\partial u}, \frac{\partial z}{\partial v}][du,dv]^T。类比到我们这里,在上面已经给出了\frac{\partial f}{\partial x}的定义,可以类似的写出dx的定义:

dx=\left[ \begin{matrix} dx_{11} &dx_{12} &\cdots &dx_{1n}\\dx_{21} &dx_{22} &\cdots &dx_{2n}\\ \vdots &\vdots &\ddots &\vdots \\dx_{m1} &dx_{m2} &\cdots &dx_{mn}\end{matrix} \right]

关键的一步思考来了,如何把\frac{\partial f}{\partial x}dx关联起来?是不是像标量运算那样直接乘起来就行了?不过这2个矩阵都是m \times n,不能直接相乘。那如果把\frac{\partial f}{\partial x}转置一下乘以dx呢?欸~好像在运算上可以成立:相当于\frac{\partial f}{\partial x}的每一列与dx的每一列相乘。还有一点要注意,因为f是标量,所以df也同样应该是标量,但是(\frac{\partial f}{\partial x})^Tdx的结果依旧为矩阵,如何对应呢?

df理论上的结果应该等于\sum_{i}\sum_{j}\frac{\partial f}{\partial x_{ij}}dx_{ij},即对每个变量的偏导乘以对应变量的微分。想到这,可以惊奇的发现,这个结果就是(\frac{\partial f}{\partial x})^Tdx的对角线元素和。大学时学过线性代数都知道,有个定义叫矩阵的迹,用Tr表示,含义就是矩阵的对角线元素和。到这里,df完整的定义就构思出来了:

df=\sum_{i}\sum_{j}\frac{\partial f}{\partial x_{ij}}dx_{ij}=Tr\left[(\frac{\partial f}{\partial x})^Tdx\right]

2.2 一个在机器学习中常见的例子

这里举一个在机器学习模型关于损失函数推导时常出现的某个步骤:

f(x)=x^TAx,求\frac{\partial f}{\partial x}

在证明前先列出几个基本定义:

\begin{aligned} d(AB)=A\cdot dB+dA\cdot B \quad (1) \\ Tr(AB)=Tr(BA) \quad (2)\\ Tr(A)=Tr(A^T) \quad (3) \end{aligned}

定义(1)类似标量微分乘法的运算,定义(2)和(3)就是线性代数中描述的矩阵迹的性质,这些基础性的知识我就不展开说了(你可能会说我看你就是懒,啊你说得对^-^)

如果你理解上面的几条定义,那下面的证明就比较简单理解了:

\begin{aligned}df&=d(x^TAx) \\ &=dTr[x^TAx]=Tr[d(x^TAx)]\\&=Tr[x^Td(Ax)+d(x^T)Ax] \\ &=Tr[x^TAdx+x^TA^Tdx] \\ &=Tr[(x^TA+x^TA^T)dx] \\ &=Tr[(A^Tx+Ax)^Tdx] \end{aligned}

结合前面提到的df的定义,可以发现A^Tx+Ax就是\frac{\partial f}{\partial x}

三.向量对向量的导数

先给出结论:设f=[f_1,f_2,...f_m]^Tx=[x_1,x_2,...x_n]^T

\frac{\partial f}{\partial x}=\left[ \begin{matrix} \frac{\partial f_1}{\partial x_1} &\frac{\partial f_2}{\partial x_1} &\cdots &\frac{\partial f_m}{\partial x_1}\\\frac{\partial f_1}{\partial x_2} &\frac{\partial f_2}{\partial x_2} &\cdots &\frac{\partial f_m}{\partial x_2}\\ \vdots &\vdots &\ddots &\vdots \\\frac{\partial f_1}{\partial x_n} &\frac{\partial f_2}{\partial x_n} &\cdots &\frac{\partial f_m}{\partial x_n}\end{matrix} \right]

为什么这样定义?我的理解是为了遵循标量对向量的导数定义。怎么说?单独拎一个f_i出来可以发现,f_ix的导数就是\frac{\partial f}{\partial x}的第i个列向量,而x也是列向量,这符合标量对向量的导数定义。那么把多个标量对向量的导数作为列向量拼起来,不就刚好是上面的形式嘛。

至于df,其形式甚至比标量对矩阵的导数还要简单:

df=\left(\frac{\partial f}{\partial x}\right)^Tdx

结合上面的说法,其实就是\frac{\partial f}{\partial x}的每个列向量和x做点乘,结果刚好就是[df_1,df_2,...df_m]

大家在学习数学相关的算法时应该都接触过Hessian矩阵和Jacobian矩阵,其实如果你看懂了我前面说的内容,你会惊讶的发现下面的结论(下面公式中f为标量,x为列向量):

Hessian=\left[ \begin{matrix} \frac{\partial f}{\partial x_1^2} &\frac{\partial f}{\partial x_1\partial x_2} &\cdots &\frac{\partial f}{\partial x_1\partial x_n}\\\frac{\partial f}{\partial x_2\partial x_1} &\frac{\partial f}{\partial x_2^2} &\cdots &\frac{\partial f}{\partial x_2\partial x_n}\\ \vdots &\vdots &\ddots &\vdots \\\frac{\partial f}{\partial x_n\partial x_1} &\frac{\partial f}{\partial x_n\partial x_2} &\cdots &\frac{\partial f}{\partial x_n^2}\end{matrix} \right]=\frac{\partial^2f}{\partial x^2}

Jacobian=\left[ \begin{matrix} \frac{\partial f_1}{\partial x_1} &\frac{\partial f_1}{\partial x_2} &\cdots &\frac{\partial f_1}{\partial x_n}\\\frac{\partial f_2}{\partial x_1} &\frac{\partial f_2}{\partial x_2} &\cdots &\frac{\partial f_2}{\partial x_n}\\ \vdots &\vdots &\ddots &\vdots \\\frac{\partial f_m}{\partial x_1} &\frac{\partial f_m}{\partial x_2} &\cdots &\frac{\partial f_m}{\partial x_n}\end{matrix} \right]=\left(\frac{\partial f}{\partial x}\right)^T\\ (f=[f_1,f_2,...f_m]^T, x=[x_1,x_2,...x_n]^T)

利用矩阵求导法则,是不是发现曾经让人头痛的2个矩阵看起来异常清晰?

四.矩阵求导链式法则

x_1,x_2,...x_n为一组列向量,且x_ix_{i-1}的函数,则:

\frac{\partial x_n}{\partial x_1}=\frac{\partial x_2}{\partial x_1} \cdot \frac{\partial x_3}{\partial x_2}...\frac{\partial x_n}{\partial x_{n-1}}

proof:

\begin{aligned} dx_2&=\left(\frac{\partial x_2}{\partial x_1}\right)^Tdx_1 \\ dx_3&=\left(\frac{\partial x_3}{\partial x_2}\right)^Tdx_2 \\ \vdots \\ dx_n&=\left(\frac{\partial x_n}{\partial x_{n-1}}\right)^Tdx_{n-1} \\ \Rightarrow dx_n&=\left(\frac{\partial x_n}{\partial x_{n-1}}\right)^T\left(\frac{\partial x_{n-1}}{\partial x_{n-2}}\right)^T...\left(\frac{\partial x_2}{\partial x_1}\right)^Tdx_1\\ &=\left(\frac{\partial x_2}{\partial x_1}\cdot \frac{\partial x_3}{\partial x_2}...\frac{\partial x_n}{\partial x_{n-1}}\right)^Tdx_1 \end{aligned}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值