我从两个独立的机器/深度学习框架中提取两个特征响应。我现在有两个具有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)
答案 0 :(得分:1)
有人这样做过吗?还有其他人有更好的建议吗?我的代码示例如下。
说实话,这没有任何意义。为什么?因为在深网这样的东西中没有特征排序。因此,您所做的比较不能用于得出任何合理的结论。您的矩阵N x F
可能是您第一层的权重矩阵。因此,这些矩阵的每个(列)向量代表单个神经元。诀窍是 - 一个网络中的i
神经元(用一个框架训练)可能与另一个神经元中的i
神经元无关,而它可能与j
相同。例如,考虑使用F=3
训练图像的网络,您可能会发现这些神经元学会检测水平(神经元1),垂直(神经元2)线和可能是圆(神经元3)。现在你再次训练,或者使用不同的框架,或者甚至使用相同但随机种子不同的训练。现在,即使这第二个网络学到完全相同的东西 - 检测水平线,垂直线和圆形 - 但只是在不同的神经元(如水平-2,垂直-3,圆-1),你的方法将声称这些是完全的不同的型号,显然是假的。 “具有相似表征”的问题本身就是一个研究方向。
在应用您提出的基本分析之前,您必须做的最小事情是在两个网络中的神经元之间找到最佳匹配。你可以通过强制执行(F ^ 2可能的映射,只需要声称最大的相似性)或使用类似匈牙利算法的东西来找到完美匹配。
最重要的是保持参考比较,以避免上述问题,因此不是每个框架训练一个模型,而是每个框架训练至少2个 。而现在不是声称“方法A和B产生(dis)相似的表示,因为由A和B的单个实验产生的表示是(dis)相似的”你应该检查两个之间的(dis)相似性之间是否存在统计上的显着差异运行(使用不同的种子)相同的算法和单个运行两种不同的算法,换句话说:
为了说明为什么考虑的指标是错误的,让我们使用它:
>>> 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%的数据是完全不同的 - 您仍然会报告最大相似度。