gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:36:32 26 4
gpt4 key购买 nike

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

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

在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:我最终使用了已接受答案提供的相同导数,但我已将成本项更改为mean(sqrt(x.^2))。这样负协方差和正协方差都会增加惩罚,并且导数是相同的。

最佳答案

编辑:

假设我们只有一个三维数据点a = [a1 a2 a3]',因为外积矩阵中所有元素的总和a*a' code>相当于(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了解逐个矩阵微分的详细信息。

关于machine-learning - 如何计算协方差的导数/梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35084254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com