对向量,矩阵,张量求导

对向量,矩阵,张量求导

  • 对向量矩阵张量求导
    • 展开公式到更详细的求和等式
    • 移除求和符号
    • 处理两维与更高维度
    • X为矩阵时

英文原文:Vector, Matrix, and Tensor Derivatives.
在看RNN处理语言序列时发现其矩阵在计算时处理的很好,包括如何存储,所以学习了一下。。

展开公式到更详细的求和等式

这篇文章的目的是教会你对向量,矩阵,张量(三维或者更高维)求导。大多数人对数组求导的困惑源于(stems from)一开始就想做太多事情,这些事情包括,同时对过多的组成进行求导,存在求和符号(summation notation)的时候进行求导,以及应用链式法则(还有全导数公式)。如果我们同时做这么多事情很可能出错,所以最好等到我们至少有些经验的时候。为了简化计算,写出输出的每一个组成元素详细的公式非常有用,一旦做了这些,你就可以像你还是萌新的时候一样(现在也不是大佬啊。。。)计算微积分了,这可比你直接用矩阵计算,对所有元素求和,求导容易得多。
举例: 假设我们有一列长度为C的向量 y⃗  ,用W (C行D列)乘以一个向量X (长度D)得到。

y⃗ =Wx⃗ 

假设我们想要计算Y对X的导数,由于y有C个组成,x有D个组成,我们将会得到C*D个计算值,我们开始计算其中的一个,我们将y3对x7求导
y3x7

可以看到这就是一元对一元的求导。之后要做的是写下计算 y3 的公式,从矩阵向量乘积的定义中我们可知。,
y⃗ 3=j=1DW3,jx⃗ j

这里我们已经计算了最初的计算等式,这使得计算期望的梯度更简单。

移除求和符号

之后最好将求和展开来写确保everything is right

y⃗ 3=W3,1x⃗ 1+W3,2x⃗ 2+...+W3,7x⃗ 7+...+W3,Dx⃗ D

当然,根据前面要求 x7 的导数我们已经特殊的写了一下 x⃗ 7 的部分,因为那是我们微分的根据,此刻,我们可以看到 y⃗ 3 只通过一项 W3,7x⃗ 7 依赖于 x⃗ 7 ,因为在求和表达式当中其他的项没有包含 x⃗ 7 ,他们对于 x⃗ 7 的导数都是0,因此,我们有
y⃗ 3x⃗ 7=x⃗ 7[W3,1x⃗ 1+W3,2x⃗ 2+...+W3,7x⃗ 7+...+W3,Dx⃗ D]      =0+0+...+x⃗ 7[W3,7x⃗ 7]+...+0      =x⃗ 7[W3,7x⃗ 7]  =W3,7

通过集中在y的一个组成和x的一个组成上,我们已经尽可能的对计算进行了简化,在之后的学习中,当你感到困惑的时候,它能够通过到这种最基本的公式中去看哪里出了错,帮助你快速解决一个问题。
回忆我们最初的目标是为了计算y的每一个组成的导数根据每一个x的组成,并且我们注意到,这会有C*D个组合,他们可以被写成

y⃗ 1x⃗ 1y⃗ 2x⃗ 1...y⃗ Cx⃗ 1y⃗ 1x⃗ 2y⃗ 2x⃗ 2...y⃗ Cx⃗ 2y⃗ 1x⃗ 3y⃗ 2x⃗ 3...y⃗ Cx⃗ 3.........y⃗ 1x⃗ Dy⃗ 2x⃗ Dy⃗ Cx⃗ D

其叫做jacobian矩阵,但是这个术语对我们的目的来说不重要,注意到
y⃗ =Wx⃗ 
y3 对于 x7 的偏微分简单的表示为 W3,7 ,如果你为其他的组成执行相同的过程,你会发现对于所有的 i和j,都有
yixj=Wi,j
这意味着偏微分矩阵是:
y⃗ 1x⃗ 1y⃗ 2x⃗ 1...y⃗ Cx⃗ 1y⃗ 1x⃗ 2y⃗ 2x⃗ 2...y⃗ Cx⃗ 2y⃗ 1x⃗ 3y⃗ 2x⃗ 3...y⃗ Cx⃗ 3.........y⃗ 1x⃗ Dy⃗ 2x⃗ Dy⃗ Cx⃗ D=W1,1W2,1...WC,1W1,2W2,2...WC,2W1,3W2,3...WC,3.........W1,DW2,DWC,D

当然这就是W本身
因此,在这个例子之后,我们总结
y⃗ =Wx⃗ 
y⃗ x⃗ =W

处理两维与更高维度

让我们考虑另一个相关的问题,计算
y⃗ W
在这种情况下,y沿着一个坐标方向变化,而W沿两个坐标方向变化。 因此整个导数很自然地包含在三维阵列中。 由于不清楚矩阵乘法和矩阵操作在三维阵列上是如何定义的,定义在三维阵列上,所以我们避免 “三维矩阵”这个词
处理三维阵列时,尝试找到一种显示它的方式可能比它的价值更麻烦。相反,我们应该简单地将我们的结果定义为一个可以用于计算所需三维的任何元素的数组。
举例子,对于行向量的形式

y⃗ =x⃗ W
对于y的一个分量 y3 ,W的一个分量 W7,8
让我们写下一个等式,来表达y3是怎么来的,

y3=x1W1,3+x2W2,3+...+x7W7,3+...+xDWD,3
然而,我们可以到, W7,8 y3 的计算中没有任何作用
换句话说
y3W7,8=0
然而,y3关于W第三列的部分导数是非零的,如
y3W2,3=x2
通常,当y的索引等于w第二个索引分量时候,导数就是非零的,否则为0,我们可以写成:
yjWi,j=xi
但是第三列的元素可以为0,如果我们让F代表y对W的导数
Fi,j,k=yjWj,k
然后
Fi,j,k=xj
然后其他的元素全是0,
最后我们定义一个新的二维矩阵,G
Gi,j=Fi,j,i
所有F的信息都包含在了G当中,没有冗余位子的F矩阵就是个二维的,不是个三维的。通过一种紧凑的方式代表微分数据的重要信息对于神经网络的实施很关键。

X为矩阵时

重复一些之前的例子是一个好习惯,让我们还是以行向量为例,假设,X的每一个个体都是一个长度为D的行向量,并且X是一个N行D列的二维矩阵,W将是一个D行C列的矩阵(跟之前一样)Y,可以表示为:

Y=XW

可以看到Y也是个矩阵,N行,C列,因此,每一行Y都与X的一行相关.我们可以写出:
Y⃗ i,j=k=1DX⃗ i,kWk,j
我们可以看到,
Ya,bXc,d
除非a=c,其他都为0(导数是一个四维的。。。。)因为,y只由相应行的x所计算。
不同行的Y与X的组合之间的微分都是0
进一步,我们可以看到
Yi,jXi,k=Wk,j
实际上,矩阵W保存了这些部分作为他自己,我们只需要记住索引就能获得对应位置导数
Yi,:Xi,:=W
5链式法则结合矩阵向量
现在让我们看一个链式法则的例子,假设,x和y都是列向量
y⃗ =VWx⃗ 
试着计算y对x的导数,我们可以简单的观察到V和W的乘积就是另外一个矩阵,我们叫他U,因此
y⃗ x⃗ =VW=U 。然而,我们想要通过链式法则的方法定义中间结果,帮助我们看看非标量情况下链式法则的应用。
让我们定义中间结果:
m⃗ =Wx⃗ 
然后
y⃗ =Vm⃗ 
然后我们可以写出:
y⃗ x⃗ =y⃗ m⃗ m⃗ x⃗ 

让我们用之前的方法一次分析一个,对于y的一个组成和x的一个组成,有:

yixj=yim⃗ m⃗ xj
但是我们如何想i想的描述等式右侧的乘积,链式法则的想法是,将y对每一个中间变量的导数乘以每一个中间变量对x的导数,我们假设中间变量m有M个组成,则可以写出:
yixj=k=1Myimkmkxj
回忆我们之前一个向量对另一个向量求导的结果

yimk Vi,k
mkxj Wk,j
所以我们可以写
yixj=k=1MVi,kWk,j

你可能感兴趣的:(学习笔记)