我从两个不同的机器学习/深度学习框架中提取了两种特征响应。现在我有两个维度为 NxF 的矩阵,其中 N 是样本数量,F 是特征数量。我想比较这些学习到的特征的相似性。我尝试了几种方法,但主要思路是使用相关性(尝试了皮尔森和斯皮尔曼)来将特征响应相关成一个 FxF 矩阵。然后我取绝对值,在单个轴上取最大值,最后计算这些最大值的平均值。实际上我想比较几个框架,但我得到的结果非常相似。有人做过这个吗?其他人有什么更好的建议吗?我的代码样例如下。
from scipy.stats import spearmanrimport numpy as npdef 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)
回答:
有人做过这个吗?其他人有什么更好的建议吗?我的代码样例如下。
说实话,这没有意义。为什么?因为在深度网络等事物中,特征之间没有顺序。因此,你所做的比较不能得出任何合理的结论。你的矩阵 N x F
可能是你第一层的权重矩阵。因此,这些矩阵的每一列向量代表 一个神经元。关键是 – 在一个网络(用一个框架训练)中的第 i
个神经元可能与另一个网络中的第 i
个神经元毫无关系,而可能与第 j
个神经元完全相同。例如,考虑一个在具有 F=3
的图像上训练的网络,你可能会发现这些神经元学会了检测水平线(神经元1)、垂直线(神经元2)和可能是一个圆(神经元3)。现在你再次训练,无论是用不同的框架,还是用相同的框架但不同的随机种子。现在即使第二个网络学会了完全相同的东西 – 检测水平线、垂直线和一个圆 – 但只是在不同的神经元中(如水平-2、垂直-3、圆-1),你的方法会声称这些是完全不同的模型,这显然是错误的。“具有相似表示”的问题本身就是一个研究方向。
你必须做的最低要求是在应用你提出的基本分析之前,找到两个网络中神经元之间的 最佳匹配。你可以通过暴力搜索(F^2 种可能的映射,只选择声称最大相似性的那个)或使用像匈牙利算法这样的方法来找到完美匹配。
最重要的是要保持 参考比较,以避免上述问题,因此不要每个框架只训练一个模型,每个框架至少训练 两个 模型。现在不要声称“方法 A 和 B 产生(不)相似的表示,因为 A 和 B 的单次实验生成的表示是(不)相似的”,你应该检查同一算法的两次运行(使用不同的种子)之间的(不)相似性与两个不同算法的单次运行之间的(不)相似性是否有统计上的显著差异,换句话说:
- 你有两个算法 A、B(框架)
- 你创建表示 A1、A2、B1、B2
- 你测试是否 mean(sim(A1, A2), sim(B1, B2)) != mean(sim(A1, B1), sim(A2, B2))(而之前你只是检查 sim(A1, B1) 是否“大”)
更新
为了展示为什么所考虑的度量是错误的,让我们用它来处理以下情况:
>>> xarray([[0, 3, 6], [1, 4, 7], [2, 5, 8]])>>> yarray([[ 6, 0, 0], [ 7, -1, -123], [ 8, 0, 1000]])>>> similarity(x,y)1.0
你最终只得到 一个 匹配,你不关心90%的数据完全不同 – 你仍然报告最大相似性。