c++向量和数组的区别_向量,矩阵和张量的导数 | 简单的数学
![](/assets/blank.gif)
前段时间看过一些矩阵求导的教程,在看过的资料中,尤其喜欢斯坦福大学CS231n卷积神经网络课程中提到的Erik这篇文章。循着他的思路,可以逐步将复杂的求导过程简化、再简化,直到发现其中有规律的部分。话不多说,一起来看看吧。
撰文 | Erik Learned-Miller
翻译 | 写代码的橘子
来源 | 橘子AI笔记(ID:datawitch)
本文旨在帮助您学习向量、矩阵和高阶张量(三维或三维以上的数组)的求导方法,以及如何求对向量、矩阵和高阶张量的导数。
01. 简化,简化,再简化
在求关于数组的导数时,大部分困惑都源自于我们想要一次同时做好几件事。这“几件事”包括同时对多个元素求导、在求和符号下求导以及应用链式法则。至少在我们积累丰富的经验之前,想要同时做这么多件事情是很容易犯错的。
1.1 写出矩阵中单个元素的表达式
为了简化给定的计算,有一种方法是:写出输出中单个标量元素的表达式,这个表达式只包含标量变量。一旦写出了输出中单个标量元素与其他标量值的表达式,就可以使用标量的微积分求导方法,这比同时进行矩阵的求和、求导要容易得多。
例子 假设我们有一个长度为C的列向量
![](/assets/blank.gif)
假设我们想求
让我们先从计算其中一个元素开始,比如,
![](/assets/blank.gif)
也就是一个标量对另一个标量求导。
在求导之前,我们要先写出
![](/assets/blank.gif)
此时,我们已经将原始矩阵方程式(1)简化为了一个标量方程,从而更容易计算所需的导数。
1.2 去掉求和符号
虽然我们可以尝试直接求式(2)的导数,但包含求和符号(
![](/assets/blank.gif)
当然,这个表达式中包括了含有
![](/assets/blank.gif)
通过把关注点放在y中的一个元素对x中的一个元素的求导过程,我们尽可能地简化了计算。以后当你在矩阵求导计算中产生困惑时,也可以试着将问题简化到这个最基本的程度,这样便于看清哪里出了问题。
1.2.1 完成求导:雅可比矩阵
别忘了,我们的终极目标是计算
![](/assets/blank.gif)
在这种特殊情况下,它被称为雅可比矩阵(Jacobian maxtirx),但这个术语对理解我们的目的而言并不那么重要。
注意,对于公式
![](/assets/blank.gif)
![](/assets/blank.gif)
也就是说,偏导数的矩阵可以表示为
![](/assets/blank.gif)
现在可以看出,这个矩阵当然就是矩阵
因此,推导了这么半天,我们终于能得出,对
![](/assets/blank.gif)
求
![](/assets/blank.gif)
2. 如果是行向量该怎么算
在使用不同的神经网络库时,留意权重矩阵、数据矩阵等矩阵的具体表达形式是非常重要的。例如,如果一个数据矩阵
在第一部分的例子中,我们计算的向量
2.1 第二个例子
假设
![](/assets/blank.gif)
虽然
转置(transpose)。尤其是因为我们现在是矩阵
在这个例子中,写出
![](/assets/blank.gif)
会得到
![](/assets/blank.gif)
注意这个例子中的元素序号与第一个例子中相反。如果写出完整的雅可比矩阵,我们仍然可以得出
![](/assets/blank.gif)
3. 超过二维的情形该怎么算
现在假设一个与前两部分密切相关的情形,如下式
![](/assets/blank.gif)
在这个情况下,
三维数组。在这里,我们避免使用“三维矩阵”这样的术语,因为尚不清楚矩阵乘法和其他矩阵运算在三维数组中是如何定义的。
在处理三维数组的时候,尝试去找出展示它们的方法可能会带来不必要的麻烦。相反,我们应该简单地用表达式写出结果,用这些表达式可以计算出所需三维数组中的任何元素。
让我们继续以标量导数的计算开始,比如y中的一个元素
然而,我们发现
![](/assets/blank.gif)
也就是说
![](/assets/blank.gif)
不过,
![](/assets/blank.gif)
其实仔细看式(8)就很容易发现这一点。
一般情况下,当
除此以外,三维数组中的其他元素都是0。如果用
![](/assets/blank.gif)
其中
![](/assets/blank.gif)
但是
最终,如果我们定义一个新的二维数组
![](/assets/blank.gif)
就可以看出,我们需要的所有关于
以紧凑的形式表示导数数组对于神经网络的高效实现而言至关重要。
4. 有多条数据该怎么算
前面的例子已经是很好的求导练习了,但如果需要用到多条数据,也就是多个向量
![](/assets/blank.gif)
它是一个
按照我们写出给定元素表达式的方法,可以写出
![](/assets/blank.gif)
我们马上就能从这个式子中看出,对于偏导数
![](/assets/blank.gif)
只有
我们可以进一步发现
![](/assets/blank.gif)
完全不依赖于我们比较的是
事实上,矩阵
如果用
![](/assets/blank.gif)
正是对之前式(7)的一个简单的普遍化形式。
5. 向量和矩阵中的链式法则
我们已经通过几个例子学会了一些基本形式的计算,现在通过链式法则把这些例子结合在一起。再次假设
![](/assets/blank.gif)
尝试计算
![](/assets/blank.gif)
然而,我们想通过链式法则来定义中间结果,以观察在非标量求导过程中是如何应用链式法则的。
我们把中间结果定义为
![](/assets/blank.gif)
于是有
![](/assets/blank.gif)
然后我们可以运用链式法则写出
![](/assets/blank.gif)
为了确保我们确切地知道该式的含义,再次采用每次分析一个元素的老办法,从
![](/assets/blank.gif)
右边的乘积该怎么解释呢?链式法则的思想是将
每个标量中间变量的导数与中间变量对
相乘。特别地,如果
![](/assets/blank.gif)
回忆之前关于向量对向量求导的计算方法,发现
![](/assets/blank.gif)
其实是
![](/assets/blank.gif)
其实是
![](/assets/blank.gif)
这就是用
综上所述,我们可以用链式法则来表示向量和矩阵的导数,只需要注意:
- 清楚说明中间结果和表示中间结果的变量,
- 表示出最终导数中各个元素的链式法则,
- 对链式法则表达式中的中间结果适当求和。
参考资料:http://cs231n.stanford.edu/vecDerivs.pdf
c++向量和数组的区别_向量,矩阵和张量的导数 | 简单的数学相关推荐
- c++向量和数组的区别_数学学习如此容易:用Python计算特征值和特征向量
什么是NumPy? NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. NumPy 的前身 ...
- c++向量和数组的区别_Spark机器学习-Java版(一)-向量和矩阵
1.概述 Spark早期版本时,MLlib是基于RDD来进行分析的,其使用的是 spark. mllib包.而言2.0版本后,由RDD这种抽象数据结构转换到了基于 dataframe上,其相关API也 ...
- 一维数组和二维数组的区别_数组指针和指针数组的区别
数组指针和指针数组的区别 - hongcha_717 - 博客园www.cnblogs.com 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整 ...
- c++向量和数组的区别_Matlab入门基础知识(5)对数组的操作
上篇推文,数模君简单介绍了对数组中元素操作的方法.那么对于数组这个整体,我们在MATLAB中可以怎么对其进行操作呢?今天数模君向大家介绍一下,MATLAB中对数组进行操作的常用函数:size函数.le ...
- java数组列表和数组的区别_数组,集合,列表的使用与区别
在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...
- 向量叉乘矩阵表示_向量点乘叉乘、矩阵、OpenGL变化
向量:向量就是在3D笛卡尔坐标中的一个顶点.单位向量就是长度为1的向量. 标量:标量是一个只有数值大小 没有方向,部分有征服之分.通俗来说标量只有大小没有方向的量. 向量和标量的区别就是 向量是有方向 ...
- 向量 矩阵 张量_张量,矩阵和向量有什么区别?
向量 矩阵 张量 机器学习代数 (MACHINE LEARNING ALGEBRA) Algebra is an important element of mathematics and has a ...
- MATLAB中矩阵与数组的区别,点运算符的运用
转自http://blog.csdn.net/peterkang202/article/details/26623219 正如matlab(矩阵实验室)这个名字一样,matlab的数据结构只有矩阵(a ...
- c++矩阵转置_线性代数中的向量矩阵
目录 前言 符号约定 向量的基本性质 [定义,基向量,线性相关/无关*,向量点积] 矩阵的基本性质 [转置,广播,线性变换] 矩阵基本运算 [矩阵相乘,矩阵点积] 行列式 [概念,性质,右手法则,行列 ...
最新文章
- UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法
- 【基础】哥德巴赫猜想
- 本地开发环境与生产环境布局有偏差问题
- cas-client 使用(6)
- C#中面向对象编程中的函数式编程
- jvm3---垃圾回收器算法
- Javascript学习
- 腾讯云部署node mysql_【腾讯云】配置安装node
- 免费的国内代理服务器、国内代理IP地址
- cv python 读取灰度图
- linux mkdir命令用法,常用Linux运维命令 - mkdir命令用法详解
- paly 框架Cannot load this JVM TI agent twice, check your java command line for duplicate jdwp options.
- 【2021】朱伟(恋练有词)
- Chisel 手册(中文part1)
- 杨氏不等式(控制中的应用)
- 关于nose的简单用法
- 需要用计算机权限才能删除,您需要计算机管理员提供的权限才能对此文件进行更改,删不掉文件怎么处理...
- A Java Runtime Environment (JRE) or Java Development Kit (JDK)...
- 这些SQL调优小技巧,你学废了吗?
- 安装语言包(LANGUAGE PACKAGE)
热门文章
- android 适合mvp模式,Android中的MVP:如何使Presenter层系统化?
- 计算机位数与内存相关,弄懂电脑的各种位数、内存、存储
- linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
- java 删除二进制内容_二进制搜索树节点删除
- 光子 量子 DNA计算机的发展情况,科研萌新关于非冯诺依曼结构计算机的一些知识mewo~~...
- pic1路AD转换c语言,pic单片机的ad转换(实例解析)
- mysql入门简历_MySQL(一)简介与入门
- java Date days_Java中的LocalDate plusDays()方法
- 2011.10.17百度面试题
- vue中展示列表,类似formatter方法及在vue中点击页面信息事件