【发布时间】: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