3

除了数值计算之外,有没有一种快速的方法来获得(网络激活的)协方差矩阵的导数?如何计算协方差的导数/梯度?

我试图在深度神经网络中将它用作成本函数中的惩罚项,但为了通过我的图层向后传播错误,我需要获得衍生物。

在Matlab

,如果 'A' 是层的激活矩阵(神经元*样品)i和 'DA' 是激活函数的导数:

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

我到目前为止已经试过:

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

但奇怪的是我有更接近数值计算梯度时,我得出仿佛一个”实际上是一个 A = A^2(没有任何意义,但改善的东西位):

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

但是没有一个是正确的。任何想法如何接近协方差的导数?

编辑:我不使用协方差矩阵本身作为一个惩罚项,我把它的所有元素的平均值,并将该数字添加到成本函数。我使用这种方法是因为我试图想出一个惩罚项,当信号之间总体上存在更多的协方差时会更大。注:我的目标是尽量减少训练期间信号之间的相似性(我也尝试惩罚成对的互信息,但无法找到计算其衍生的方法)。编辑2:我终于使用了接受答案提供的相同衍生物,但我已将成本项更改为平均值(sqrt(x。^ 2))。这种方式负面和正面的协方差会增加罚款和派生是相同的。

回答

2

编辑:

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

有关数据点x(每个维度的值相同)的术语变为((a1+a2+a3)^2+(b1+b2+b3)^2+...)/(3*3)以及导数为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

+0

你说得对@dontloo谢谢。我忘了补充一点,我只是将我的成本损失计算在协方差矩阵上,然后在成本函数中使用它的平均值,因此实际的映射函数是矩阵 - >标量(请参阅我的编辑)。 – anything

+0

@giber嗨我补充了一些有关平均值的衍生物的更新,但关于如何定义一个合理的损失函数可能是另一个我不太了解的问题,欢呼。 – dontloo

+0

Thanks @dontloo我试着根据你的逻辑:covarDelta = 2 * repmat(sum(a,1)/(size(a,1)^ 2),size(a,1),1);它的工作。但是,如果我现在简单地将此成本罚分与一个恒定的“betaCovar”相乘来调整其权重,那么我认为该衍生词也会被相同的常数多重化,但情况并非如此,梯度不匹配一次我添加了除1之外的乘法因子。我错了吗?至于平均取消位置。和否定。协方差,伟大的一点,也许我应该采取平均值(sqrt(sqr(covar)))而不是平均值(covar),这种情况下的派生值是多少? – anything