如何计算协方差的导数/梯度?

How do I calculate the derivative / gradient of covariance?

除了数值计算之外,有没有快速获得协方差矩阵(我的网络激活)的导数的方法?

我正在尝试将它用作深度神经网络成本函数中的惩罚项,但为了通过我的层反向传播误差,我需要获得导数。

在Matlab中,如果'a'是第i层的激活矩阵(neurons*samples),'da'是激活函数的导数:

covariance = a * a' / (size(a,2)-1);

到目前为止我已经尝试过:

covarDelta = (da*a' + a*da' ) / (size(a,2)-1);

但奇怪的是,当我推导出 aa' 实际上是 aa=a.^2(不是有道理,但它改善了一些事情):

covarDelta = 2*a/size(a,1); 

但其中 none 是正确的。知道如何近似协方差的导数吗?

编辑:我不使用协方差矩阵本身作为惩罚项,我取其所有元素的平均值并将该数字添加到成本函数中。我使用这种方法是因为我试图想出一个惩罚项,当信号之间的总体协方差更大时,该惩罚项会更大。

注意:我的目标是在训练期间尽量减少信号之间的相似性(我也尝试过惩罚成对互信息,但也找不到计算其导数的方法)。

编辑 2:我终于使用了已接受答案提供的相同导数,但我将成本术语更改为均值 (sqrt(x.^2))。这样负协方差和正协方差都会增加惩罚,导数相同。

编辑:

假设我们只有一个数据点,三个维度a = [a1 a2 a3]',因为外积矩阵a*a'所有元素之和相当于(a1+a2+a3)^2的展开,矩阵的平均值为 (a1+a2+a3)^2/(3*3)。所以在这种情况下,每个维度的导数都具有相同的值 2*(a1+a2+a3)/(3*3)

对于更多数据点,该项变为 ((a1+a2+a3)^2+(b1+b2+b3)^2+...)/(3*3),数据点 x 的导数为 2*(x1+x2+x3)/(3*3)(每个维度的值相同)。

简单取均值可能不适合您的需要,因为它会抵消协方差矩阵中的正值和负值。

目前我没有环境可以验证我的回答,不对的地方请指正

原文Post:

通常人们会使用标量值作为成本,而不是(协方差)矩阵。

如果我们将协方差表示为一个函数 cov(x),它将一个矩阵作为输入并输出一个矩阵。

所以精确导数不是单矩阵,因为它对输入矩阵的每一个元素的偏导数都是一个矩阵。

假设输入矩阵A的维度为m*n,则输出矩阵C的维度为m*m。导数dA/dC应该是一个m*m*m*n的矩阵。有关逐矩阵微分的详细信息,请参阅 http://mplab.ucsd.edu/tutorials/MatrixRecipes.pdf