【问题标题】:How do I calculate the derivative / gradient of covariance?如何计算协方差的导数/梯度?
【发布时间】:2016-01-29 12:09:35
【问题描述】:

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

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

在Matlab中,如果'a'是第i层的激活矩阵(神经元*样本),'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); 

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    编辑:

    假设我们只有一个三个维度的数据点a = [a1 a2 a3]',因为外积矩阵a*a'中所有元素的总和相当于(a1+a2+a3)^2的展开,矩阵的均值是@987654325 @。所以在这种情况下,每个维度的导数都具有相同的值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

    【讨论】:

    • 你是对的@dontloo 谢谢。我忘了补充一点,我只是将成本惩罚基于协方差矩阵,然后我在成本函数中使用它的平均值,因此实际的映射函数是矩阵->标量(请参阅我的编辑)。
    • @giber 您好,我添加了一些关于均值导数的更新,但是关于如何定义合理的损失函数可能是另一个我不太了解的问题,干杯。
    • 谢谢@dontloo 我已经根据你的逻辑尝试过:covarDelta = 2*repmat(sum(a,1) / (size(a,1)^2),size(a,1) ,1);它奏效了。但是,如果我现在简单地将这个成本惩罚乘以一个常数“betaCovar”来调整它的权重,我希望导数也将乘以相同的常数,但事实并非如此,梯度不匹配一次我添加了一个除 1 以外的乘法因子。我错了吗?至于消除 pos 的平均值。和否定。协方差,很好,也许我应该取平均值(sqrt(sqr(covar)))而不是平均值(covar),在这种情况下导数是什么?
    猜你喜欢
    • 2016-04-23
    • 2017-06-06
    • 2018-11-17
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多