前段时间看过一些矩阵求导的教程,在看过的资料中,尤其喜欢斯坦福大学CS231n卷积神经网络课程中提到的Erik这篇文章。循着他的思路,可以逐步将复杂的求导过程简化、再简化,直到发现其中有规律的部分。话不多说,一起来看看吧。

撰文 | Erik Learned-Miller

翻译 | 写代码的橘子

来源 | 橘子AI笔记(ID:datawitch)

本文旨在帮助您学习向量、矩阵和高阶张量(三维或三维以上的数组)的求导方法,以及如何求对向量、矩阵和高阶张量的导数。

01. 简化,简化,再简化

在求关于数组的导数时,大部分困惑都源自于我们想要一次同时做好几件事。这“几件事”包括同时对多个元素求导、在求和符号下求导以及应用链式法则。至少在我们积累丰富的经验之前,想要同时做这么多件事情是很容易犯错的。

1.1 写出矩阵中单个元素的表达式

为了简化给定的计算,有一种方法是:写出输出中单个标量元素的表达式,这个表达式只包含标量变量。一旦写出了输出中单个标量元素与其他标量值的表达式,就可以使用标量的微积分求导方法,这比同时进行矩阵的求和、求导要容易得多。

例子 假设我们有一个长度为C的列向量

,它是由
列的矩阵
与长度为
的向量
计算得到的:
式(1)

假设我们想求

的导数。完整的求导过程需要计算
中的每一个元素对
中的每一个元素的(偏)导数,在这种情况下,我们会算出
个元素,因为
中有
个元素而
中有
个元素。

让我们先从计算其中一个元素开始,比如,

中的第3个元素对
中的第7个元素求导。也就是说,我们要计算

也就是一个标量对另一个标量求导。

在求导之前,我们要先写出

的表达式。根据矩阵-向量乘法的定义,矩阵
的第3行与向量
的点积就是
的值。
式(2)

此时,我们已经将原始矩阵方程式(1)简化为了一个标量方程,从而更容易计算所需的导数。

1.2 去掉求和符号

虽然我们可以尝试直接求式(2)的导数,但包含求和符号(

)或连乘符号(
)的表达式在求导时很容易出错。为了确保万无一失,在刚开始的时候最好去掉求和符号,把各项相加的表达式写出来。我们可以写出以下表达式,下标由“1”开始

当然,这个表达式中包括了含有

的项,这一项正是我们求导需要的项。现在不难看出,在求
的偏导数时,我们只关心这个表达式中的一项,
。由于其他项都不包括
,他们对
的导数都是0。由此,我们写出
式(3)-式(6)

通过把关注点放在y中的一个元素对x中的一个元素的求导过程,我们尽可能地简化了计算。以后当你在矩阵求导计算中产生困惑时,也可以试着将问题简化到这个最基本的程度,这样便于看清哪里出了问题。

1.2.1 完成求导:雅可比矩阵

别忘了,我们的终极目标是计算

中每个元素对
中每个元素的导数,这些导数总共有
个。以下矩阵可以表示所有这些导数:

在这种特殊情况下,它被称为雅可比矩阵(Jacobian maxtirx),但这个术语对理解我们的目的而言并不那么重要。

注意,对于公式

的偏导数可以简单地用
来表示。如果挨个儿检查整个矩阵中的所有元素,就不难发现,对所有的
来说,都有

也就是说,偏导数的矩阵可以表示为

现在可以看出,这个矩阵当然就是矩阵

本身。

因此,推导了这么半天,我们终于能得出,对

的导数相当于

2. 如果是行向量该怎么算

在使用不同的神经网络库时,留意权重矩阵、数据矩阵等矩阵的具体表达形式是非常重要的。例如,如果一个数据矩阵

包含许多不同的向量,那么,在这个矩阵中,是一个行向量表示数据集中的一个样本,还是一个列向量表示一个样本?

在第一部分的例子中,我们计算的向量

是一个列向量。然而,当
是行向量的时候你也得明白该怎么算。

2.1 第二个例子

假设

是含有
个元素的行向量,它是由含有
个元素的行向量
列的矩阵
计算得到的:

虽然

中的元素数量都和之前一样,但矩阵
的形状相当于我们在第一个例子中使用的矩阵

转置(transpose)。尤其是因为我们现在是矩阵

左乘
,而不是之前的右乘,现在的矩阵
必须是第一个例子中矩阵
的转置。

在这个例子中,写出

的表达式

会得到

注意这个例子中的元素序号与第一个例子中相反。如果写出完整的雅可比矩阵,我们仍然可以得出

式(7)

3. 超过二维的情形该怎么算

现在假设一个与前两部分密切相关的情形,如下式

在这个情况下,

沿一个坐标轴变化,而
沿两个坐标轴变化。因此,整个导数自然会是一个

三维数组。在这里,我们避免使用“三维矩阵”这样的术语,因为尚不清楚矩阵乘法和其他矩阵运算在三维数组中是如何定义的。

在处理三维数组的时候,尝试去找出展示它们的方法可能会带来不必要的麻烦。相反,我们应该简单地用表达式写出结果,用这些表达式可以计算出所需三维数组中的任何元素。

让我们继续以标量导数的计算开始,比如y中的一个元素

中的一个元素
。我们先用其他标量写出
的表达式,这个表达式还要体现出
在其计算中所起的作用。

然而,我们发现

的计算中没有起到任何作用,因为
式(8)

也就是说

不过,

中第3列元素求导的结果一定是非零的。例如
的偏导数为
式(9)

其实仔细看式(8)就很容易发现这一点。

一般情况下,当

中元素的下标等于
中元素的第二个下标时,这个偏导数就是非零的,反之则为零。我们由此写出:

除此以外,三维数组中的其他元素都是0。如果用

表示
求导得出的三维数组

其中

但是

中的其他项都为0。

最终,如果我们定义一个新的二维数组

就可以看出,我们需要的所有关于

的信息实际上都可以用
来储存,也就是说,
的非零部分其实是二维的,而不是三维的。

以紧凑的形式表示导数数组对于神经网络的高效实现而言至关重要。

4. 有多条数据该怎么算

前面的例子已经是很好的求导练习了,但如果需要用到多条数据,也就是多个向量

堆叠在一起构成矩阵
时,又该如何计算呢?我们假设每个单独的
都是一个长度为
的行向量,矩阵
是一个
列的二维数组。而矩阵
,和之前的例子一样,是一个
列的矩阵。
的定义如下

它是一个

列的矩阵。因此,
的每一行将给出一个与输入
的相应行相关的行向量。

按照我们写出给定元素表达式的方法,可以写出

我们马上就能从这个式子中看出,对于偏导数

只有

的时候计算结果才不为零。也就是说,因为
中的每一个元素都只对
中相应的那一行求导,
的不同行之间的偏导数都为0。

我们可以进一步发现

式(10)

完全不依赖于我们比较的是

的哪一行。

事实上,矩阵

完整包含了所有的偏导数——我们只需要根据式(10)和下标来找到我们想要的特定偏导数。

如果用

表示
中的第
行,用
表示
中的第
行,可以发现

正是对之前式(7)的一个简单的普遍化形式。

5. 向量和矩阵中的链式法则

我们已经通过几个例子学会了一些基本形式的计算,现在通过链式法则把这些例子结合在一起。再次假设

是两个列向量,让我们从下式开始

尝试计算

的导数。我们可以简单地观察到两个矩阵
的乘积就是另一个矩阵
,因此可以写出

然而,我们想通过链式法则来定义中间结果,以观察在非标量求导过程中是如何应用链式法则的。

我们把中间结果定义为

于是有

然后我们可以运用链式法则写出

为了确保我们确切地知道该式的含义,再次采用每次分析一个元素的老办法,从

中的一个元素和
中的一个元素开始:

右边的乘积该怎么解释呢?链式法则的思想是将

每个标量中间变量的导数与中间变量对

的导数

相乘。特别地,如果

个元素,那么可以写出

回忆之前关于向量对向量求导的计算方法,发现

其实是

,而

其实是

。所以可以写出

这就是用

中的元素写出的求导表达式,至此我们得出了答案。

综上所述,我们可以用链式法则来表示向量和矩阵的导数,只需要注意:

  • 清楚说明中间结果和表示中间结果的变量,
  • 表示出最终导数中各个元素的链式法则,
  • 对链式法则表达式中的中间结果适当求和。

参考资料:http://cs231n.stanford.edu/vecDerivs.pdf

c++向量和数组的区别_向量,矩阵和张量的导数 | 简单的数学相关推荐

  1. c++向量和数组的区别_数学学习如此容易:用Python计算特征值和特征向量

    什么是NumPy? NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. NumPy 的前身 ...

  2. c++向量和数组的区别_Spark机器学习-Java版(一)-向量和矩阵

    1.概述 Spark早期版本时,MLlib是基于RDD来进行分析的,其使用的是 spark. mllib包.而言2.0版本后,由RDD这种抽象数据结构转换到了基于 dataframe上,其相关API也 ...

  3. 一维数组和二维数组的区别_数组指针和指针数组的区别

    数组指针和指针数组的区别 - hongcha_717 - 博客园​www.cnblogs.com 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整 ...

  4. c++向量和数组的区别_Matlab入门基础知识(5)对数组的操作

    上篇推文,数模君简单介绍了对数组中元素操作的方法.那么对于数组这个整体,我们在MATLAB中可以怎么对其进行操作呢?今天数模君向大家介绍一下,MATLAB中对数组进行操作的常用函数:size函数.le ...

  5. java数组列表和数组的区别_数组,集合,列表的使用与区别

    在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...

  6. 向量叉乘矩阵表示_向量点乘叉乘、矩阵、OpenGL变化

    向量:向量就是在3D笛卡尔坐标中的一个顶点.单位向量就是长度为1的向量. 标量:标量是一个只有数值大小 没有方向,部分有征服之分.通俗来说标量只有大小没有方向的量. 向量和标量的区别就是 向量是有方向 ...

  7. 向量 矩阵 张量_张量,矩阵和向量有什么区别?

    向量 矩阵 张量 机器学习代数 (MACHINE LEARNING ALGEBRA) Algebra is an important element of mathematics and has a ...

  8. MATLAB中矩阵与数组的区别,点运算符的运用

    转自http://blog.csdn.net/peterkang202/article/details/26623219 正如matlab(矩阵实验室)这个名字一样,matlab的数据结构只有矩阵(a ...

  9. c++矩阵转置_线性代数中的向量矩阵

    目录 前言 符号约定 向量的基本性质 [定义,基向量,线性相关/无关*,向量点积] 矩阵的基本性质 [转置,广播,线性变换] 矩阵基本运算 [矩阵相乘,矩阵点积] 行列式 [概念,性质,右手法则,行列 ...

最新文章

  1. UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法
  2. 【基础】哥德巴赫猜想
  3. 本地开发环境与生产环境布局有偏差问题
  4. cas-client 使用(6)
  5. C#中面向对象编程中的函数式编程
  6. jvm3---垃圾回收器算法
  7. Javascript学习
  8. 腾讯云部署node mysql_【腾讯云】配置安装node
  9. 免费的国内代理服务器、国内代理IP地址
  10. cv python 读取灰度图
  11. linux mkdir命令用法,常用Linux运维命令 - mkdir命令用法详解
  12. paly 框架Cannot load this JVM TI agent twice, check your java command line for duplicate jdwp options.
  13. 【2021】朱伟(恋练有词)
  14. Chisel 手册(中文part1)
  15. 杨氏不等式(控制中的应用)
  16. 关于nose的简单用法
  17. 需要用计算机权限才能删除,您需要计算机管理员提供的权限才能对此文件进行更改,删不掉文件怎么处理...
  18. A Java Runtime Environment (JRE) or Java Development Kit (JDK)...
  19. 这些SQL调优小技巧,你学废了吗?
  20. 安装语言包(LANGUAGE PACKAGE)

热门文章

  1. android 适合mvp模式,Android中的MVP:如何使Presenter层系统化?
  2. 计算机位数与内存相关,弄懂电脑的各种位数、内存、存储
  3. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
  4. java 删除二进制内容_二进制搜索树节点删除
  5. 光子 量子 DNA计算机的发展情况,科研萌新关于非冯诺依曼结构计算机的一些知识mewo~~...
  6. pic1路AD转换c语言,pic单片机的ad转换(实例解析)
  7. mysql入门简历_MySQL(一)简介与入门
  8. java Date days_Java中的LocalDate plusDays()方法
  9. 2011.10.17百度面试题
  10. vue中展示列表,类似formatter方法及在vue中点击页面信息事件