新方法的算法证明
1.m熵的证明
之前我们选择 loss=MSEloss-λ|m|²
,用新的散m方法后选择 loss=MSEloss-λH(m)
,其中H(m)
是m值的点向周围分散的熵。
选择熵,是因为现在m的物理意义是分散程度的强弱,构造一个分布,熵体现分布的分散程度。而对于整个m矩阵,应该用联合熵,但由于m之间互不影响,则求和。
首先证明,对单个m,其分布的熵正比于 log(m):
该证明来自deskmel。
这是对m连续分布的求熵,也可以用离散化的进行更精确证明。但从比例关系来看,应该也是正比于 log(m)的。和之前的loss类似,前一项目的让m变小,后一项目的让m变大,通过系数λ使两项对抗。
2.反向传播求导
如上图,一个float m
的点,对应原响度为fft
,则可以对同一时间帧上频率维度前后 ⌊m⌋
个点产生影响,分别加上分散值,比例为m:(m-1):...:(m-⌊m⌋)
,再做归一化即可。而该点则减去fft*(1-m)/m²
的值。
对[K T]维的矩阵fft
和m
,用一个[K T K]维矩阵Z_ADD
储存造成的影响。比如坐标为(i,j)的点,对整个j时间帧上的K个点造成的影响(也就是加多少),储存在Z_ADD(i,j)
这个K维vector中。
Z_ADD
矩阵中也是包含负值的,就是对自己点造成的影响(减去一部分)。因此newfft(i,j)=fft(i,j)+∑Z_ADD(p,j,i), for p in [K]
。
同理,也储存一个梯度矩阵Z_GRAD
,比如Z_GRAD(p,j,i)
就代表newfft(i,j)
对m(p,j)
的梯度。
理论上求导时,[K T]矩阵newfft
对[K T]矩阵m
求导的结果,是[K T T K]维的张量G
,其中G(i,j)
代表newfft(i,j)
对m
的梯度。但实际上newfft(i,j)
只与m
的第j个时间帧有关,其余为0。