机器学习中的线性代数之矩阵求导
前面针对机器学习中基础的线性代数知识,我们做了一个常用知识的梳理。接下来针对机器学习公式推导过程中经常用到的矩阵求导,我们做一个详细介绍。
矩阵求导(Matrix Derivative)也称作矩阵微分(Matrix Differential),在机器学习、图像处理、最优化等领域的公式推导中经常用到。
矩阵的微积分本质上是多元变量的微积分问题,只是应用在矩阵空间上而已
根据Y\bf YY 与 X\bf XX 的不同类型(实值、向量、矩阵)给出如下表中的表示:
类型 | 标量(Scalar)yyy | 向量(Vector)y\bf yy | 矩阵(Matrix)Y\bf YY |
---|---|---|---|
Scalar xxx | ∂y∂x\frac {\partial y}{\partial x}∂x∂y | ∂y∂x\frac {\partial \bf y}{\partial x}∂x∂y | ∂Y∂x\frac {\partial \bf Y}{\partial x}∂x∂Y |
Vector x\bf xx | ∂y∂x\frac {\partial y}{\partial \bf x}∂x∂y | ∂y∂x\frac {\partial \bf y}{\partial \bf x}∂x∂y | |
Matrix X\bf XX | ∂y∂X\frac {\partial y}{\partial \bf X}∂X∂y |
下面我们根据分子的布局(即X的类型)来介绍矩阵的导数求解
0 布局约定(Layout conventions)
事实上,所有求导的法则都可以从最基本的求导规则推导出来。不知你有没发现,不同的文献中,同样的式子求导的结果有时候会不一样,仔细观察会发现刚好相差一个转置,于是我们得先说说求导的两个派别(布局)。
由向量关于向量的求导∂y∂x\frac{\partial y}{\partial x}∂x∂y可以得出两种矛盾的表示:结果表示为n×mn×mn×m 矩阵或m×nm×nm×n 矩阵。也就是把y\bf yy 表示为列向量x\bf xx 表示为行向量或者反过来表示的问题。
布局(Layout):在矩阵求导中有两种布局,分别为分母布局(denominator layout)和分子布局(numerator layout)。这两种不同布局的求导规则是不一样的。
向量 y=[y1y2⋮yn]{\bf y} = \begin {bmatrix} y_1 \\ y_2\\ \vdots \\ y_n\end{bmatrix}y=⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤,关于标量xxx 的求导,
在分子布局下,为:
∂y∂x=[∂y1∂x∂y2∂x⋮∂yn∂x](1)\frac {\partial \bf y}{\partial x} = \begin {bmatrix} \frac{\partial y_1}{\partial x} \\ \frac{\partial y_2}{\partial x} \\ \vdots \\ \frac{\partial y_n}{\partial x} \end{bmatrix}\tag{1} ∂x∂y=⎣⎢⎢⎢⎡∂x∂y1∂x∂y2⋮∂x∂yn⎦⎥⎥⎥⎤(1)
而在分母布局下,为:
∂y∂x=[∂y1∂x∂y2∂x⋯∂yn∂x](2)\frac {\partial \bf y}{\partial x} = \begin {bmatrix} \frac{\partial y_1}{\partial x} & \frac{\partial y_2}{\partial x} & \cdots & \frac{\partial y_n}{\partial x} \end{bmatrix}\tag{2} ∂x∂y=[∂x∂y1∂x∂y2⋯∂x∂yn](2)
通过观察和推导我们可以知道,分子布局和分母布局之间刚好差一个转置,即在分子布局下与原来Y\bf YY相同,而在分母布局下差一个转置。
对于正切矩阵∂y∂x\frac{\partial y}{\partial x}∂x∂y采用分母布局,即Y⊤\bf Y^ \topY⊤,很不符合表达的习惯,所以本文中我们采用的是分子布局。
1 关于标量的导数
对于 X\bf XX 是标量的情况,是我们最熟悉的一种情况。
1.1 标量关于标量X的求导
这中情况就是我们平时的代数求导,直接就是∂y∂x\frac {\partial y}{\partial x}∂x∂y
1.2 向量关于标量X的求导
向量 y=[y1y2⋮yn]{\bf y} = \begin {bmatrix} y_1 \\ y_2\\ \vdots \\ y_n\end{bmatrix}y=⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤,关于标量xxx 的求导就是 y{\bf y}y 的每一个元素分别对xxx求导,可以表示为
∂y∂x=[∂y1∂x∂y2∂x⋮∂yn∂x](3)\frac {\partial \bf y}{\partial x} = \begin {bmatrix} \frac{\partial y_1}{\partial x} \\ \frac{\partial y_2}{\partial x} \\ \vdots \\ \frac{\partial y_n}{\partial x} \end{bmatrix}\tag{3} ∂x∂y=⎣⎢⎢⎢⎡∂x∂y1∂x∂y2⋮∂x∂yn⎦⎥⎥⎥⎤(3)
此时为正切向量,∂y∂x\frac {\partial \bf y}{\partial x}∂x∂y 为 y\bf yy 的正切向量,有映射 y\bf yy : Rm⟹Rm{\Bbb R}^m \implies {\Bbb R}^mRm⟹Rm 。
1.3 矩阵关于标量X的求导
矩阵对标量的求导类似于向量关于标量的求导,也就是矩阵的每个元素分别对标量xxx求导,矩阵 Y=[y11y12⋯y1ny21y22⋯y2n⋮⋮⋱⋮yn1yn2⋯ynn]{\bf Y} = \begin {bmatrix} y_{11} & y_{12} & \cdots & y_{1n} \\ y_{21} & y_{22} & \cdots & y_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ y_{n1} & y_{n2} & \cdots & y_{nn} \end{bmatrix}Y=⎣⎢⎢⎢⎡y11y21⋮yn1y12y22⋮yn2⋯⋯⋱⋯y1ny2n⋮ynn⎦⎥⎥⎥⎤ 对标量xxx的导数为
∂Y∂x=[∂y11∂x∂y12∂x⋯∂y1n∂x∂y21∂x∂y22∂x⋯∂y2n∂x⋮⋮⋱⋮∂yn1∂x∂yn2∂x⋯∂ynn∂x](4)\frac {\partial \bf Y}{\partial x} = \begin {bmatrix} \frac{\partial y_{11} }{\partial x } & \frac{\partial y_{12} }{\partial x }& \cdots & \frac{\partial y_{1n} }{\partial x } \\ \frac{\partial y_{21}}{\partial x } & \frac{\partial y_{22}}{\partial x } & \cdots & \frac{\partial y_{2n}}{\partial x } \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_{n1} }{\partial x } & \frac{\partial y_{n2} }{\partial x } & \cdots & \frac{\partial y_{nn}}{\partial x } \end{bmatrix}\tag{4} ∂x∂Y=⎣⎢⎢⎢⎡∂x∂y11∂x∂y21⋮∂x∂yn1∂x∂y12∂x∂y22⋮∂x∂yn2⋯⋯⋱⋯∂x∂y1n∂x∂y2n⋮∂x∂ynn⎦⎥⎥⎥⎤(4)
2 关于向量的导数
2.1标量关于向量 x\bf xx 的导数
标量yyy 关于向量 x=[x1x2⋮xn]{\bf x } = \begin {bmatrix} x_1 \\ x_2\\ \vdots \\ x_n\end{bmatrix}x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤ 的求导可以表示为
∂y∂x=[∂y∂x1∂y∂x2⋯∂y∂xn](5)\frac {\partial y}{\partial \bf x} = \begin {bmatrix} \frac{\partial y}{\partial x_{1} }\ \frac{\partial y}{\partial x_{2} } \ \cdots \ \frac{\partial y}{\partial x_{n} } \end{bmatrix}\tag{5} ∂x∂y=[∂x1∂y ∂x2∂y ⋯ ∂xn∂y](5)
此时的向量叫做梯度向量。 ∂y∂x\frac {\partial y}{\partial \bf x}∂x∂y 为标量yyy 在空间 Rn{\Bbb R}^nRn 的梯度,该空间以xxx 为基。
2.2 向量关于向量 x\bf xx 的导数
向量函数(即函数组成的向量)y=[y1y2⋮yn]{\bf y} = \begin {bmatrix} y_1 \\ y_2\\ \vdots \\ y_n\end{bmatrix}y=⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤ 关于向量x=[x1x2⋮xn]{\bf x } = \begin {bmatrix} x_1 \\ x_2\\ \vdots \\ x_n\end{bmatrix}x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤ 的导数记作
∂y∂x=[∂y1∂x1∂y1∂x2⋯∂y1∂xn∂y2∂x1∂y2∂x2⋯∂y2∂xn⋮⋮⋱⋮∂yn∂x1∂yn∂x2⋯∂yn∂xn](6)\frac {\partial \bf y}{\partial \bf x} = \begin {bmatrix} \frac{\partial y_{1} }{\partial x_{1} } & \frac{\partial y_{1} }{\partial x_{2} }& \cdots & \frac{\partial y_{1} }{\partial x_{n} } \\ \frac{\partial y_{2}}{\partial x_{1} } & \frac{\partial y_{2}}{\partial x_{2} } & \cdots & \frac{\partial y_{2}}{\partial x_{n} } \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_{n} }{\partial x_{1} } & \frac{\partial y_{n} }{\partial x_{2} } & \cdots & \frac{\partial y_{n}}{\partial x_{n} } \end{bmatrix}\tag{6} ∂x∂y=⎣⎢⎢⎢⎢⎡∂x1∂y1∂x1∂y2⋮∂x1∂yn∂x2∂y1∂x2∂y2⋮∂x2∂yn⋯⋯⋱⋯∂xn∂y1∂xn∂y2⋮∂xn∂yn⎦⎥⎥⎥⎥⎤(6)
此时获得的矩阵∂y∂x\frac {\partial \bf y}{\partial \bf x}∂x∂y 叫做Jacobian 矩阵。
2.3 矩阵关于向量 x\bf xx 的导数
矩阵 Y=[y11y12⋯y1ny21y22⋯y2n⋮⋮⋱⋮yn1yn2⋯ynn]{\bf Y} = \begin {bmatrix} y_{11} & y_{12} & \cdots & y_{1n} \\ y_{21} & y_{22} & \cdots & y_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ y_{n1} & y_{n2} & \cdots & y_{nn} \end{bmatrix}Y=⎣⎢⎢⎢⎡y11y21⋮yn1y12y22⋮yn2⋯⋯⋱⋯y1ny2n⋮ynn⎦⎥⎥⎥⎤ 对向量x=[x1x2⋮xn]{\bf x } = \begin {bmatrix} x_1 \\ x_2\\ \vdots \\ x_n\end{bmatrix}x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤ 的导数是推导中最复杂的一种,我们可以表示为
∂Y∂x=[∂y11∂x1∂y1n∂x2⋯∂y1n∂xn∂y21∂x1∂y22∂x2⋯∂y2n∂xn⋮⋮⋱⋮∂yn1∂x1∂yn2∂x2⋯∂ynn∂xn](7)\frac {\partial \bf Y}{\partial \bf x} = \begin {bmatrix} \frac{\partial y_{11} }{\partial x_{1} } & \frac{\partial y_{1n} }{\partial x_{2} }& \cdots & \frac{\partial y_{1n} }{\partial x_{n} } \\ \frac{\partial y_{21}}{\partial x_{1} } & \frac{\partial y_{22}}{\partial x_{2} } & \cdots & \frac{\partial y_{2n}}{\partial x_{n} } \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_{n1} }{\partial x_{1} } & \frac{\partial y_{n2} }{\partial x_{2} } & \cdots & \frac{\partial y_{nn}}{\partial x_{n} } \end{bmatrix}\tag{7} ∂x∂Y=⎣⎢⎢⎢⎢⎡∂x1∂y11∂x1∂y21⋮∂x1∂yn1∂x2∂y1n∂x2∂y22⋮∂x2∂yn2⋯⋯⋱⋯∂xn∂y1n∂xn∂y2n⋮∂xn∂ynn⎦⎥⎥⎥⎥⎤(7)
3 关于矩阵的导数
我们一般只考虑标量关于矩阵的导数(因为矩阵对向量和矩阵的导数与前面2.3节的内容一致或相似),即标量yyy 对矩阵 X\bf XX 的导数为 ∂y∂X\frac {\partial y}{\partial \bf X}∂X∂y ,此时的导数是梯度矩阵,可以表示为下式:
∂y∂X=[∂y∂x11∂y∂x21⋯∂y∂xn1∂y∂x12∂y∂x22⋯∂y∂xn2⋮⋮⋱⋮∂y∂x1n∂y∂x2n⋯∂y∂xnn](8)\frac {\partial y}{\partial \bf X} =\begin {bmatrix} \frac{\partial y }{\partial x_{11} } & \frac{\partial y }{\partial x_{21} }& \cdots & \frac{\partial y }{\partial x_{n1} } \\ \frac{\partial y}{\partial x_{12} } & \frac{\partial y}{\partial x_{22} } & \cdots & \frac{\partial y}{\partial x_{n2} } \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y }{\partial x_{1n} } & \frac{\partial y }{\partial x_{2n} } & \cdots & \frac{\partial y}{\partial x_{nn} } \end{bmatrix}\tag{8} ∂X∂y=⎣⎢⎢⎢⎢⎡∂x11∂y∂x12∂y⋮∂x1n∂y∂x21∂y∂x22∂y⋮∂x2n∂y⋯⋯⋱⋯∂xn1∂y∂xn2∂y⋮∂xnn∂y⎦⎥⎥⎥⎥⎤(8)
4 维度分析
当我们对一些复杂的矩阵乘积求偏导的时候,直接求很难直接求出,这时候我们可以通过分析矩阵的维度来得到结果。例如:
考虑以下导数 ∂Au∂x\frac {\partial \bf Au}{\partial \bf x}∂x∂Au ,其中 A\bf AA 与x\bf xx 无关 且有 A∈Rm×n{\bf A} \in {\Bbb R}^ {m \times n}A∈Rm×n, u∈BbbRn×1{\bf u } \in {Bbb R}^{n \times 1}u∈BbbRn×1 ,x∈Rp×1{\bf x} \in {\Bbb R}^{p \times 1}x∈Rp×1,我们知道结果肯定和∂u∂x\frac {\partial \bf u}{\partial \bf x}∂x∂u 有关,于是先把 A\bf AA 提出求导式,至于到了哪暂时不知道,接着我们知道 ∂u∂x∈Rp×n\frac {\partial \bf u}{\partial \bf x} \in {\Bbb R}^ {p \times n}∂x∂u∈Rp×n,于是 A\bf AA 只能转置后添加到后面。因此有
∂Au∂x=∂u∂xA⊤(9)\frac {\partial \bf Au}{\partial \bf x} = \frac {\partial \bf u}{\partial \bf x} {\bf A}^ \top \tag{9}∂x∂Au=∂x∂uA⊤(9)
再考虑问题 ∂x⊤Ax∂x\frac {\partial \bf x^\top A x}{\partial \bf x}∂x∂x⊤Ax ,其中 A∈Rn×n{\bf A} \in {\Bbb R}^ {n \times n}A∈Rn×n, x∈Rn×n{\bf x } \in {\Bbb R}^{n \times n}x∈Rn×n ,
为了分析这个问题我们考虑一个更一半的问题
∂x⊤Ax∂x(10)\frac {\partial \bf x^\top A x}{\partial \bf x}\tag{10} ∂x∂x⊤Ax(10)
其中 ${\bf A} \in {\Bbb R}^ {n \times n} $, ${\bf x } \in {Bbb R}^{n \times n} $,且 A\bf AA 与x\bf xx 和 y\bf yy 无关 。于是我们利用维度分析,采用非精确的乘积法则,可以将它分为两个部分
∂(x⊤A)y∂x(11)\frac {\partial \bf (x^\top A) y}{\partial \bf x} \tag{11} ∂x∂(x⊤A)y(11)
于是结果与两部分相关,一个是
∂y∂x∈Rm×n(12)\frac {\partial \bf y}{\partial \bf x} \in {\Bbb R}^ {m \times n} \tag{12} ∂x∂y∈Rm×n(12)
另一个是
∂x⊤A∂x=A∈Rm×n(13)\frac {\partial \bf x^\top A}{\partial \bf x} = {\bf A} \in {\Bbb R}^ {m \times n} \tag{13} ∂x∂x⊤A=A∈Rm×n(13)
同样通过维度分析,我们可以得到
∂(x⊤A)y∂x=∂y∂xA⊤x+Ay(14)\frac {\partial \bf (x^\top A) y}{\partial \bf x} = \frac {\partial \bf y}{\partial \bf x} \bf A^\top \bf x + \bf A \bf y \tag{14} ∂x∂(x⊤A)y=∂x∂yA⊤x+Ay(14)
因此经过维度的比较我们可以得到
∂x⊤Ax∂x=(A⊤+A)x(14)\frac {\partial \bf x^\top A x}{\partial \bf x} = (\bf A^\top + A)x\tag{14} ∂x∂x⊤Ax=(A⊤+A)x(14)
通过以上两个示例的学习,我们可以知道在求解复杂矩阵的求导问题时,通过维度来判断矩阵的导数形式很简便同时也不容易出错。下图是机器学习中常见的矩阵求导形式,可供参考:
5 总结
在本文中,我们针对机器学习推导中的矩阵求导问题做了一个全面的分析,同时结合前文 深度学习系列(二)——机器学习中的线性代数知识 介绍的机器学习中线性代数的基础知识,我们对线性代数部分做了详细的了解。下一章我们介绍机器学习中涉及到的概率知识。
机器学习中的线性代数之矩阵求导相关推荐
- 线性代数之 矩阵求导(4)矩阵微分,迹与求导
线性代数之 矩阵求导(4)迹与矩阵求导 前言 矩阵微分定义 矩阵微分计算法则 常矩阵 线性 乘积 转置 迹 通过矩阵微分进行求导 常用的矩阵微分 后记 前言 本次将记录如何进行矩阵求导(标量对矩阵). ...
- 线性代数之 矩阵求导(2)标量函数求导基本法则与公式
线性代数之 矩阵求导(2)基本法则与公式 前言 基本约定 标量对向量求导 基本法则 公式 标量对矩阵求导 基本法则 公式 后记 前言 上篇矩阵求导(1)解决了求导时的布局问题,也是矩阵求导最基础的求导 ...
- 线性代数之 矩阵求导(3)标量、向量求导的快速记忆
线性代数之 矩阵求导(3)标量.向量求导的快速记忆 前言 基本约定 引例 标量对标量求导 标量对向量求导 向量对向量求导 包含两个变量的求导 总结 扩展 前言 上一次记录了矩阵求导的基本法则和公式,并 ...
- 机器学习BP算法及矩阵求导
除了基本导数公式,本文介绍的矩阵求导方法不涉及任何公式的套用. 本文以neural network中最常见的一种计算单元为例,详细介绍了BP算法中涉及到的矩阵求导过程.刚接触机器学习时,曾被BP算法中 ...
- 矩阵论(八):矩阵微分与矩阵求导
矩阵论专栏:专栏(文章按照顺序排序) 做机器学习的几乎避免不了矩阵求导,尤其是神经网络方面的,反向传播算法说白了就是在做矩阵求导,拿到代价函数对模型中每个参数矩阵的导数,才能找到一个下降方向,进而更新 ...
- 【机器学习】线性回归之Normal Equation(矩阵求导与线性代数视角)
Normal Equation 之前我们用梯度下降来求解线性回归问题的最优参数,除此之外我们还可以用正规方程法(Normal Equation)来求解其最优参数. Normal Equation方法的 ...
- 机器学习中的矩阵求导的一点总结(三种方法求线性回归最佳参数)
机器学习中的矩阵求导的一点总结(三种方法求线性回归最佳参数) 转载于:https://blog.csdn.net/promisejia/article/details/80159619?ops_req ...
- 向量转置的怎么求导_机器学习中的向量求导和矩阵求导
在机器学习的各种关于向量或者矩阵的求导中,经常会出现各种需要转置或者不需要转置的地方,经常会看得人晕头转向.今天我对机器学习中关于这部分的常识性处理方法进行整理并记录下来方便大家参考. 一些约定 首先 ...
- 【机器学习中的矩阵求导】(七)矩阵向量化复习
学习总结 (1)矩阵乘法. Vec(ABC)=(C⊤⊗A)Vec(B)\operatorname{Vec}(\operatorname{ABC})=\left(\mathbf{C}^{\top} ...
最新文章
- 态势“知”多少,点开就知道
- c语言指针的相关运算,C语言指针的运算
- python 编译函数_在Python的Django框架中编写编译函数
- C++继承的基本语法
- swift 怎样查看xcode 版本对应的swift版本和 iOS 等其他系统版本
- Pytorch——用nn.Sequential搭建简单的神经网络
- NetCore Get Parameter
- 深度学习文本分类|模型代码技巧
- 【图像处理】基于matlab分形插值算法调换图片【含Matlab源码 197期】
- greendao的简单使用
- 互联网广告需一键关闭 被广告关闭键坑到无语
- 【实用技巧】 修改度娘的提取码
- 进程之joinableQueue
- ml-agents_使用ML-Agents的自玩功能来训练智能对手
- matlab 雷电,利用MATLAB实现对雷电监测数据的分析和绘图
- 2、mysql基本操作中
- deepfakes怎么用_手把手教你使用 Deepfakes 换脸
- php断言什么意思,一起学习PHP中断言函数的使用
- Blast中文手册(3)
- 播放FLV文件的方法
热门文章
- python中标点符号大全及名字_标点符号大全及名字0919.史上最全标点符号英语读法...
- 计算机科学与探索、计算机工程与应用投稿经验分享
- 计算机操作系统——银行家算法
- Mysql主从复制+读写分离
- ROS-control-gazebo-moveit-grasp(一、场景搭建)
- Python操作表格
- Asp.Net Web Api 部署------在云服务器IIS上部署Web Api程序
- 释放自我。回归本性。要成功。
- 使用负载均衡技术建设高负载的网络站点(经典文章)
- 【CUDA 基础】3.1 CUDA执行模型概述