比较两个深度学习框架的特征响应
Comparing Feature Responses from Two Deep-Learning Frameworks
我正在从两个单独的 machine/deep-learning 框架中提取两个特征响应。我现在有两个具有 NxF 维度的矩阵,其中 N 是样本数,F 是特征数。我想比较学习到的特征的相似程度。我尝试了几件事,但主要想法是使用相关性(尝试过 Pearson 和 Spearman)将特征响应关联到 FxF 矩阵中。然后我取绝对值,单个轴上的最大值,然后计算这些最大值的平均值。我实际上有几个框架想要比较,但我得到的结果非常相似。有没有人这样做过?还有其他人有更好的建议吗?我的代码示例如下。
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)。现在你再次训练,要么使用不同的框架,要么甚至使用相同的框架但随机种子不同。现在,即使第二个网络学习完全相同的东西——检测水平线、垂直线和圆——但只是在不同的神经元(如 horizontal-2、vertical-3、circle-1)中,你的方法会声称这些完全不同的模型,这显然是错误的。 "having similar representations"的问题本身就是一个研究方向。
您至少需要在两个网络的神经元之间找到最佳匹配,然后再应用您提出的基本分析。您可以通过暴力破解(F^2 种可能的映射,只取声称相似性最大的映射)或使用匈牙利算法之类的方法来找到完美匹配。
最重要的是保持参考比较,以避免出现上述问题,所以不要为每个框架训练一个模型,至少要训练每个框架 2。现在,而不是声称 "method A and B produce (dis)similar representations because representations generated by a single experiment with A and B are (dis)similar" 你应该检查同一算法的两次运行(具有不同种子)与两种不同算法的单次运行之间的(dis)相似性之间是否存在统计上的显着差异,换句话说:
- 你有 2 个算法 A、B(框架)
- 您创建表示 A1、A2、B1、B2
- 你测试是否 mean(sim(A1, A2), sim(B1, B2)) != mean(sim(A1, B1), sim(A2, B2)) (而之前你只是检查是否sim(A1, B1) 是 "big")
更新
只是为了说明为什么所考虑的指标是错误的,让我们在以下方面使用它:
>>> 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% 的数据完全不同 - 你仍然报告最大相似性。
我正在从两个单独的 machine/deep-learning 框架中提取两个特征响应。我现在有两个具有 NxF 维度的矩阵,其中 N 是样本数,F 是特征数。我想比较学习到的特征的相似程度。我尝试了几件事,但主要想法是使用相关性(尝试过 Pearson 和 Spearman)将特征响应关联到 FxF 矩阵中。然后我取绝对值,单个轴上的最大值,然后计算这些最大值的平均值。我实际上有几个框架想要比较,但我得到的结果非常相似。有没有人这样做过?还有其他人有更好的建议吗?我的代码示例如下。
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)。现在你再次训练,要么使用不同的框架,要么甚至使用相同的框架但随机种子不同。现在,即使第二个网络学习完全相同的东西——检测水平线、垂直线和圆——但只是在不同的神经元(如 horizontal-2、vertical-3、circle-1)中,你的方法会声称这些完全不同的模型,这显然是错误的。 "having similar representations"的问题本身就是一个研究方向。
您至少需要在两个网络的神经元之间找到最佳匹配,然后再应用您提出的基本分析。您可以通过暴力破解(F^2 种可能的映射,只取声称相似性最大的映射)或使用匈牙利算法之类的方法来找到完美匹配。
最重要的是保持参考比较,以避免出现上述问题,所以不要为每个框架训练一个模型,至少要训练每个框架 2。现在,而不是声称 "method A and B produce (dis)similar representations because representations generated by a single experiment with A and B are (dis)similar" 你应该检查同一算法的两次运行(具有不同种子)与两种不同算法的单次运行之间的(dis)相似性之间是否存在统计上的显着差异,换句话说:
- 你有 2 个算法 A、B(框架)
- 您创建表示 A1、A2、B1、B2
- 你测试是否 mean(sim(A1, A2), sim(B1, B2)) != mean(sim(A1, B1), sim(A2, B2)) (而之前你只是检查是否sim(A1, B1) 是 "big")
更新
只是为了说明为什么所考虑的指标是错误的,让我们在以下方面使用它:
>>> 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% 的数据完全不同 - 你仍然报告最大相似性。