草庐IT

矩阵求导(本质、原理与推导)详解

生信小兔 2023-08-17 原文

矩阵求导是机器学习与深度学习的基础,它是高等数学、线性代数知识的综合,并推动了概率论与数理统计向多元统计的发展。在一般的线性代数的课程中,很少会提到矩阵导数的概念;而且在网上寻找矩阵求导的知识点,也是五花八门,各有各的说法,各有各自的定义,好多东西也是很容易弄得混淆。那么兔兔今天就从头到尾详细讲解矩阵求导的本质,原理与一般解法的推导。

 一:认识函数,认识自变量(变元)

认识函数,认识自变量是非常重要的,这是我们的立足点。回顾高数中的知识,我们大部分情况下遇到的都是自变量是一个数,值是一个数,函数的作用是把一个数映射成另一个数。但是也有自变量是多个数,值是一个数(即多元函数)。

那么在从传统的高等数学向矩阵延伸时,自变量就不一定是一个数了。自变量可以是一个数,可以是多个数(多个数是一个向量或是一个矩阵);经函数映射处理后得到的值以是一个数,一个向量或矩阵。至于值是数还是向量、矩阵,与函数function有关。

这样我们就把自变量分成数,向量,矩阵三种,我们也可以把自变量叫做函数function的变元。把函数function分成三种:function是标量、向量、矩阵,我们就把function分别叫做——实值标量函数(映射成数)、实向量函数(映射成向量)、实矩阵函数(映射成矩阵)。

(1)function是实标量函数(用f表示),其变元是标量(用x表示)

这个其实就是我们最最常见的一元函数。比如,等。它就是把一个数映射成另一个数。

(2)function是实标量函数(用f表示),其变元是向量(用x表示)

如果我们纸上书写,最好用表示,便于区分,而在电脑上一般用加粗表示向量。

对于这种情况,就是高数中的多元函数。只不过自变量的多元我们用向量表示,并且我们通常都认为是列向量(这个是约定俗成的东西,而且大家用同样的标准,交流起来也很方便)。例如,变元x就是,变元x就是

(3)function是实标量函数(用f表示),其变元是矩阵(用X表示)

比如函数,变元X=。函数,变元X=

(4)function是实向量函数(用f表示),其变元是标量(用x表示)。

这时function就是把一个数x映射成向量。例如,里面的f1,f2,f3其实就是前面讲的实标量函数。组合成向量形成的就是一个实向量函数。

(5)function是实向量函数(用f表示),其变元是向量(用x表示)。

这时function把向量映射成向量。例如,x=。和刚才一样,里面f1,f2,f3是实标量函数,每个都把向量映射成数,又把数排列一起成向量。

注意:我们在高数等其它教材或是网上看到的向量函数(vector function)对应的就是该(5)条的情形。那里的向量函数定义是:从的映射。对应这里就是function是m维的,把n维向量x在function作用下映射成m维向量。

(6)function是实向量函数(用f表示),其变元是矩阵(用X表示)

例子就是。变元就是。它其实就是把矩阵映射成了向量。里面f1,f2,f3分别把矩阵X映射成数,也就是(3)那一部分。

(7)function是实矩阵函数(用F表示),其变元是标量(用x表示)。

比如,就是在实矩阵函数的映射下,变成了相应的矩阵。

(8)function是实矩阵函数(用F表示),其变元是向量(用x表示)。

把向量映射成矩阵。向量维数是变元维数,矩阵维数是实矩阵函数维数。,其中变元

(9)function是实矩阵函数(用F表示),其变元是矩阵(用X表示)。

到这里应该就很好理解了,,

其中,变元X=

总结:我们可以发现,最终的值是数、向量还是矩阵与函数有关——函数是几维的向量或矩阵,相应值就是几维的数或矩阵。并且我们在写的过程中都是把向量f或矩阵F拆解成最小单元f,用一元函数f分别计算数x、向量x或矩阵X,得到的数按原来对应的f位置堆叠。无论变元是向量还是矩阵,我们最终都是把它拆成单个数x,集体代入f中计算。

标量变元向量变元矩阵变元
实值标量函数
实向量函数
实矩阵函数

一会儿兔兔会告诉你们,我们之后很少遇到给定的这样的复杂的函数。更多的是AX、bxa等这样的函数,把它们展开其实就是对应上面的样子啦。

二:理解这些函数的导数。

 导数,无外乎就是函数对自变量求导。由于函数与自变量在这里已经延申到向量、矩阵,肯定与以往既有区别,又有联系。

对于(1)的情况,兔兔不必再讲了,它就是普通的一元函数求导。

对于(2)和(3)的情况,其实就是求偏导了。比如,分别对x1,x2,x3求偏导(也就是对变元求导),再排列成向量,结果就是,其实写成列向量和行向量关系倒不是很大(一会儿讲布局时细说)。

如果是f(X)对X求导,那就分别对里面xij求导,结果分别写在矩阵i行j列处(这个就是梯度矩阵)梯度矩阵:。把梯度矩阵转置,就是Jacobian矩阵。第三种就是把矩阵按列堆栈向量化,比如,vec(X) (堆栈化)后就是。之后操作就是向量求导了。如果是这样的列向量,求导后的列向量就叫做梯度向量,把它转置就叫做行向量偏导。除了堆栈向量化,这四个矩阵稍微了解就好,不同特意去记它们。

当实向量函数f(x)对数x求导,就是,其中。实矩阵函数对单个数的求导,把实矩阵函数堆栈化,像刚才一样分别抽走第1列,2列...首尾连接成一个向量,然后求导。

那么对于(1)(2)(3)(4)(7)的情况,不是函数是单个的,就是变元是单个数,求导也很容易理解。其中(3)需要对变元堆栈化,(7)对函数堆栈化。

那么问题就来了,其它的该怎样求导呢?求导又该怎样排布呢?

 这里又一个很大的坑——分子布局、分母布局与混合布局

由于在布局方面没有统一的标准,导致我们在看其它文章时各有各的结果,很容易把我们搞糊涂。所以我们十分有必要了解这三种布局的情况。

我们先看(5),实向量函数对向量变元求导。‘

比如f(x),向量函数为2维,即,变元为3维的向量。那么x求导,就是f1分别对x1,x2,x3求偏导,再f2对x1,x2,x3求偏导。分子布局,就是分子是列向量形式,分母是行向量形式。对这个例子来说,就是求导后的矩阵第1行全是f1分别对x1,x2,x3求导,第2行是f2对x求导,那么矩阵就是2x3维(行数是函数维数,列数是变元维数)。分母布局,就是分母是列向量,分子是行向量。求导后是刚才分子分布的转置。。那么,对于刚才(2)的情况,咱们当时说无论排成行还是列向量,关系不是很大,准确来说就是——如果是分子布局,结果就是列向量;分母布局,结果就是行向量(因为分母布局定义:分母是行向量形式,分子是列向量,此时只不过分母是一个数)。

简单来说,分子就代表函数,分母就是变元,是什么分布,什么就是列向量,另一个就是行向量。而且如果是分子布局,实向量函数是列向量形式,导数结果当中f1,f2,f3也相应是竖着的,第一行是f1对x求导,第二行是f2对x求导......。分母布局对应也是如此。至于选哪种布局计算,其实都可以的。一旦求导时分子和分母的形式确定了,布局也就确定了,结果也就是唯一的。

其实,只要知道实向量函数对向量求导的方法。其余的就容易很多了。只要碰到矩阵,堆栈化成向量就可以了,之后再考虑用哪个布局。比如实矩阵函数对矩阵求导,分别把函数、矩阵变元堆栈化就可以了。

三:由定义尝试求一些导数,尝试发现规律:

兔兔在这里以几个例子说明。

例1:求f(x)=ax 的导数。a是常数。

 很显然,导数就是a。

例2:求的导数,其中a是常数,

很显然,它是由向量映射向量,对应(5)。求导是向量对向量求导。按分子分布,就是

例3:求的导数,其中,a1,a2,a3是常数。

 可以看出,它是把向量映射成数,对应(2)。按分母布局(分母x是列向量形式)计算,就是

例4:求的导数,其中,

 可以看出,它是把向量映射成向量。对应(5)。可以按分子布局求导(Ax是列向量,对求导),就是

例5:求的导数,其中a是常数,

这个是把矩阵映射矩阵,对应(9)。把F(X)堆栈化得,X堆栈化得。按分子布局,求导后就是。可以尝试,分母布局计算也是这个结果的。

例6:求的导数,其中,

这个是把矩阵映射成行向量。按照分母分布计算导数,结果就是。若按照分子分布,结果就是分母分布的转置:

例7:求的导数。其中,

到这里同学们应该已经知道如何计算了,把函数和变元都堆栈化,然后求导。按分子布局,我们发现是,分母布局是。和6的结论是一致的。

此时同学们应该发现其中的规律了,无论是矩阵还是向量还是数,他们求导后都显示出与我们曾经的一元函数求导有着很相似的地方——曾经一元的,当把a和x分别变成向量、矩阵,也是有着类似的形式。那么对于复杂的函数呢?比如的导数,对x或的导数呢。我们用这种方法显然就麻烦许多。那么有没有像我们曾经学过的求导法则一样,针对这一类函数的求导方法呢?答案是肯定的。

四:矩阵求导的通用方法。

兔兔在讲公式之前先补充一些知识点。

(1)矩阵的的迹(trace)

的方阵A的主对角线之和就是矩阵A的迹,记作tr(A)。

性质:(重点,之后会用到的)

,即线性性质.

:就是把其中相邻两个看作整体,与第三个做交换,本质就是上一条结论

对于,:就是两个矩阵对应位置相乘求和。对于里面我们也是可以用转置、交换律的,结果不变。

(2)微分

微分只要掌握高数里面那些知识就足够了。这里用到了微分的一些性质。

微分性质:(重点)

, c可以是常数、常向量、常矩阵。

:即线性性质,与迹相同,u,v可以是一元函数f,也可以是f,F。

:注意:对于向量或矩阵不可以随便交换乘积先后顺序,他们是不满足交换律的。

d(uvw)=d(u)vw+ud(v)w+uvd(w):上面的推广,多个函数乘积也是如此。u、v、w可以是f,F。

:转置性质,与迹的性质相同。

,F为维。

矩阵微分:

大概了解一下微分过程与微分形式,后面几条需要记一下。

:A,B是常数阵,微分是零矩阵。

:按第一行展开,即元素乘代数余子式,求偏导即可。

:X是方阵。用,两边微分移项即可。

我们看到上面的几个情况,不难发现,函数微分等于函数对变元导数乘变元的微分(变元的微分就是按原来的形式把里面xi或xij都变成dxi或dxij)。有时外面加上tr也是成立的。

矩阵微分与导数关系:

这里就是本次矩阵导数的重点结论:

用类似这样形式的式子就可以通过微分来求矩阵导数啦。但对于F,我们可以求tr(F(X))的对X或导数。

举例(这里式子很长,兔兔就用纸质书写推导了):

 

 

 

 

同学们要注意一下数学矩阵论中的矩阵函数:它和我们这里其实还是很不一样的。那里的矩阵函数是把函数展开成幂级数进行计算的。而我们在深度学习或机器学习过程中,往往是函数作用与向量或矩阵中的每一个元素。而这两种操作结果是完全不一样的。比如对于当A=。用幂级数去计算。

import numpy as np
from math import factorial
A=np.mat([[1,2],[3,4]])
s=np.zeros((2,2))
for i in range(10):
    s+=A**i/factorial(i) #求级数,先求前十项
print(s) #按数学中矩阵函数的方法求解
print(np.exp(A)) #按机器学习中常用的方法,即对每个元素操作求解

运行结果

s=[[ 49.52944224  71.18115079]
   [106.77172619 156.30116843]]

exp(A)=[[ 2.71828183  7.3890561 ]
       [20.08553692 54.59815003]]

可见的确是不一样的,它们也似乎没有什么太大的关联。而在矩阵论中关于矩阵函数乘积的求导,也有着它的定义,它的导数公式是。它理论应该可以用于咱们这里两个实矩阵函数乘积对变元矩阵的求导,但是它这里由于导数定义和咱们这里有一些区别,所以这个式子应该也是需要调整的,感兴趣的同学可以试一下。

五:总结

我们通过了解函数与变元的形式以及导数的定义,知道了这些导数的形式,并且掌握用微分方法求一般的矩阵导数。以上内容虽多,但真正运用的时候应该还是仅仅其中几个。而且在一般模型的推导中,例如BP神经网络的反向传递公式的推导,里面还涉及了很多东西,与今天所讲的矩阵导数可能还是有一定区别,到时候兔兔会详细讲解的。总之,同学们还是需要抓住本质,从根本上去理解。

有关矩阵求导(本质、原理与推导)详解的更多相关文章

  1. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  2. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  3. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  4. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  5. 欧拉角表示的姿态矩阵(313和312转序) - 2

    一、习惯约定图片来自PSINS(高精度捷联惯导算法)PSINS工具箱入门与详解.pptx二、基本旋转矩阵绕x轴逆时钟旋转α\alphaα角度Rx(α)=[ 1000cos⁡αsin⁡α0−sin⁡αcos⁡α]R_x(\alpha)=\begin{bmatrix}\1&0&0\\0&\cos\alpha&\sin\alpha\\0&-\sin\alpha&\cos\alpha\end{bmatrix}Rx​(α)=​ 100​0cosα−sinα​0sinαcosα​​绕y轴逆时钟旋转α\alphaα角度Ry(α)=[ cos⁡α0−sin⁡α010sin⁡α0cos⁡α]R_y(\alpha

  6. 欧拉角、旋转矩阵及四元数 - 2

    欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋

  7. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  8. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  9. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  10. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

随机推荐