Derivatives, Backpropagation, and Vectorization 是李飞飞大牛学生Justin Johnson(注意断句),点击可以看他的个人主页发表的论文涉及了多个领域,博士期间在CVPR/ICCV/ECCV顶会上发表多达13篇论文。本文是他为cs231n课程撰写关于 Derivatives, Backpropagation, and Vectorization的notes。
1 Derivatives
1.1 Scalar Case
对于标量的导数我们已经很熟悉。给定一个函数 ,导数定义为:
导数是一种衡量变化的数。当输入x的变化时,函数f随着x变化的增量表示为
对于每一个符号表示,我们使用 表示y对于x的偏微分,同时也表示变化的速率在变量x和y之间:
链式法则告诉我们如何计算函数的导数。这里我们也能通过下列计算图表示出来:
这里的链式法则是:
这个等式使得下列的导数成立:
1.2 Gradient:Vector in,scalar out
对于f的导数,我们现在称之为梯度gradient,定义为:
现在梯度是一个向量,如果我们设置y=f(x),然后我们有关系:
与
乘积为点乘,即使把两个向量相乘得到一个标量。
接下来我们定义梯度作为偏微分的向量形式:
1.3 Jacobian: Vector in, Vector out
假设函数给定一个输入,产生一个输出向量,那么f对于x的导数叫做
,也是
大小的偏微分矩阵,写作:
像之前的增量,同样告诉我们这样的增量表示:
链式法则也与之前的导数相同:
尽管每个式子都是一个矩阵,但是等式两边结果的矩阵大小都是相同的。
1.4 Generalized Jacobian: Tensor in, Tensor out
正如矢量是一维的数字列表,矩阵是二维的数字网格,张量是d维的数字网格。深度学习中的许多运算都接受张量作为输入,并产生张量作为输出。例如,图像通常表示为数字的三维网格,其中三维对应于图像的高度、宽度和颜色通道(红、绿、蓝)。因此,我们必须开发出一种与一般张量上的函数相容的导数。
假设,输入一个D维的张量,大小是
,输出f也是一个D维的张量,大小是
,这里的
称为
:
通过这种分组,我们可以将广义雅可比矩阵看作是一个矩阵的推广,其中每一行“与y的形状相同,每一列”的形状与x的形状相同。同样对其求偏导:
增量表示:
对于张量值函数,链式法则看起来也是一样的。假设y = f(x)和z = g(y),x和y上面的形状一样,z形状。链式法则和之前一样:
与上面定义的广义矩阵-向量乘法一样,广义矩阵-矩阵乘法遵循与传统矩阵-矩阵乘法相同的代数规则:
2 Backpropagation with Tensors
在神经网络环境中,层f通常是(张量)输入x和权值w的函数;该层的(张量)输出为y = f(x;w)。层f通常嵌入在具有标量损耗的大型神经网络中,通过链式规则有:
根据上一章Backpropagation的内容,我们继续使用实例验证:
在反向传播中,我们继续用L对y求微分:
现在我们的目标变成了如何得到L对x中每一个元素的微分:
根据链式法则,我们对其展开:
通过观察,两边的矩阵大小一致,所以我们继续对等式右边y对x中的每一个元素微分进行计算:
再结合以上两个式子:
最终得到L对x的微分:
即使我们的最终结果,这让我们更搞笑计算L对x的微分,而不需要单独计算出y对x的雅可比矩阵。