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

时间:2016-01-29 12:09:35

标签: machine-learning neural-network gradient covariance derivative

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

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

在Matlab中,如果'a'是层i的激活矩阵(神经元*样本),'da'是激活函数的衍生物:

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

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

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

但奇怪的是,当我得出时,我已经更接近于数值计算的梯度,好像 a'实际上是 a = a。^ 2(没有意义,但它有所改进事情有点):

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

但是没有一个是正确的。知道如何近似协方差的导数吗?

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

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

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

1 个答案:

答案 0 :(得分: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)(每个维度的值相同)。

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

目前我没有环境来验证我的答案,请在我错误的地方纠正我。

原帖:

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

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

因此精确导数不是单个矩阵,因为它相对于输入矩阵的每个元素的偏导数是矩阵。

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