我正在从两个独立的机器/深度学习框架中提取两个特征响应。我现在有两个具有 NxF 维度的矩阵,其中 N 是样本数,F 是特征数。我想比较一下学习到的特征的相似程度。我已经尝试了几件事,但主要思想是使用相关性(尝试过 Pearson 和 Spearman)将特征响应关联到 FxF 矩阵。然后,我取单轴上的绝对值 max,然后计算这些最大值的平均值。实际上我有几个想要比较的框架,但我得到的结果非常相似。有人做过这个吗?还有其他人有更好的建议吗?我的代码示例如下。
from scipy.stats import spearmanr
import numpy as np
def similarity(resp1, resp2):
rho, p = spearmanr(resp1,resp2)
corr = rho[:resp1.shape[1],resp1.shape[1]:]
sim_mtrx = np.abs(corr)
feature_match = np.max(sim_mtrx,axis=1)
return np.mean(feature_match)
最佳答案
Has anybody done this? Does anyone else have any better suggestions? My code sample is below.
说实话,这毫无意义。为什么?因为在像深网这样的东西中,特征没有顺序。因此,您所做的比较不能用来得出任何合理的结论。您的矩阵 N x F
可能是第一层的权重矩阵。因此,这些矩阵的每个(列)向量代表单个神经元。诀窍是 - 一个网络中的第 i 个神经元(使用一个框架训练)可以与另一个网络中的第 i 个神经元无关,但它可能与第 j 个。例如,考虑一个在 F=3
图像上训练的网络,您可能会发现这些神经元学会了检测水平(神经元 1)、垂直(神经元 2)线,也许还有一个圆圈(神经元 3)。现在你再次训练,要么使用不同的框架,要么使用相同的框架但不同的随机种子。现在,即使第二个网络学习完全相同的东西 - 检测水平线、垂直线和圆 - 但只是在不同的神经元中(例如水平 2、垂直 3、圆 1),您的方法将声称这些完全是不同型号,这显然是错误的。 “具有相似的表征”问题本身就是一个研究方向。
在应用您建议的基本分析之前,您至少需要找到两个网络中神经元之间的最佳匹配。您可以通过暴力破解(F^2 可能的映射,仅采用声称最大相似性的映射)或使用匈牙利算法之类的方法来找到完美匹配。
最重要的是保持引用比较,以避免出现上述问题,因此不要每个框架训练一个模型,而是每个框架训练至少2个 。现在,您不应声称“方法 A 和 B 产生(不)相似的表示,因为 A 和 B 的单个实验生成的表示是(不)相似的”,您应该检查两个方法之间的(不)相似性之间是否存在统计上的显着差异。相同算法的运行(使用不同的种子)和两种不同算法的单次运行,换句话说:
- 您有 2 个算法 A、B(框架)
- 您创建表示 A1、A2、B1、B2
- 您测试是否mean(sim(A1, A2), sim(B1, B2)) !=mean(sim(A1, B1), sim(A2, B2))(而之前您只是检查是否 sim( A1, B1) 是“大”)
更新
只是为了说明为什么所考虑的指标是错误的,让我们将其用于:
>>> x
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
>>> y
array([[ 6, 0, 0],
[ 7, -1, -123],
[ 8, 0, 1000]])
>>> similarity(x,y)
1.0
您最终只会得到单个匹配项,您并不关心 90% 的数据完全不同 - 您仍然报告最大的相似性。
关于python - 比较两个深度学习框架的特征响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40185403/