英文原文:Vector, Matrix, and Tensor Derivatives.
在看RNN处理语言序列时发现其矩阵在计算时处理的很好,包括如何存储,所以学习了一下。。
这篇文章的目的是教会你对向量,矩阵,张量(三维或者更高维)求导。大多数人对数组求导的困惑源于(stems from)一开始就想做太多事情,这些事情包括,同时对过多的组成进行求导,存在求和符号(summation notation)的时候进行求导,以及应用链式法则(还有全导数公式)。如果我们同时做这么多事情很可能出错,所以最好等到我们至少有些经验的时候。为了简化计算,写出输出的每一个组成元素详细的公式非常有用,一旦做了这些,你就可以像你还是萌新的时候一样(现在也不是大佬啊。。。)计算微积分了,这可比你直接用矩阵计算,对所有元素求和,求导容易得多。
举例: 假设我们有一列长度为C的向量 y⃗ ,用W (C行D列)乘以一个向量X (长度D)得到。
之后最好将求和展开来写确保everything is right
通过集中在y的一个组成和x的一个组成上,我们已经尽可能的对计算进行了简化,在之后的学习中,当你感到困惑的时候,它能够通过到这种最基本的公式中去看哪里出了错,帮助你快速解决一个问题。
回忆我们最初的目标是为了计算y的每一个组成的导数根据每一个x的组成,并且我们注意到,这会有C*D个组合,他们可以被写成
让我们考虑另一个相关的问题,计算
∂y⃗ ∂W
在这种情况下,y沿着一个坐标方向变化,而W沿两个坐标方向变化。 因此整个导数很自然地包含在三维阵列中。 由于不清楚矩阵乘法和矩阵操作在三维阵列上是如何定义的,定义在三维阵列上,所以我们避免 “三维矩阵”这个词
处理三维阵列时,尝试找到一种显示它的方式可能比它的价值更麻烦。相反,我们应该简单地将我们的结果定义为一个可以用于计算所需三维的任何元素的数组。
举例子,对于行向量的形式
y3→=x1→W1,3+x2→W2,3+...+x7→W7,3+...+xD→WD,3
然而,我们可以到, W7,8 在 y3 的计算中没有任何作用
换句话说
∂y3→∂W7,8=0
然而,y3关于W第三列的部分导数是非零的,如
∂y3→∂W2,3=x2→
通常,当y的索引等于w第二个索引分量时候,导数就是非零的,否则为0,我们可以写成:
∂yj→∂Wi,j=xi→
但是第三列的元素可以为0,如果我们让F代表y对W的导数
Fi,j,k=∂yj→∂Wj,k
然后
Fi,j,k=xj→
然后其他的元素全是0,
最后我们定义一个新的二维矩阵,G
Gi,j=Fi,j,i
所有F的信息都包含在了G当中,没有冗余位子的F矩阵就是个二维的,不是个三维的。通过一种紧凑的方式代表微分数据的重要信息对于神经网络的实施很关键。
重复一些之前的例子是一个好习惯,让我们还是以行向量为例,假设,X的每一个个体都是一个长度为D的行向量,并且X是一个N行D列的二维矩阵,W将是一个D行C列的矩阵(跟之前一样)Y,可以表示为:
让我们用之前的方法一次分析一个,对于y的一个组成和x的一个组成,有:
∂yi→∂xj→=∂yi→∂m⃗ ∂m⃗ ∂xj→
但是我们如何想i想的描述等式右侧的乘积,链式法则的想法是,将y对每一个中间变量的导数乘以每一个中间变量对x的导数,我们假设中间变量m有M个组成,则可以写出:
∂yi→∂xj→=∑k=1M∂yi→∂mk→∂mk→∂xj→
回忆我们之前一个向量对另一个向量求导的结果
∂yi→∂mk→ 是 Vi,k
∂mk→∂xj→ 是 Wk,j
所以我们可以写
∂yi→∂xj→=∑k=1MVi,kWk,j