在神经网络完全训练后(假设是一个正常的前馈网络),是否有办法计算一个输入相对于最终输出的权重?请注意,我不是在谈论输入相对于一个神经元的权重(该值应在训练过程中由 NN 计算和调整)。
例如,如果我有 3 个输入 x1、x2 和 x3,并且我有一个输出 y。网络训练好后,我能知道 x1 对 y 的影响有多大吗?我想它应该通过 y 对 x1 的偏导数来计算。但是我怎么知道网络所代表的非线性函数呢?这可能吗?
谢谢!
在神经网络完全训练后(假设是一个正常的前馈网络),是否有办法计算一个输入相对于最终输出的权重?请注意,我不是在谈论输入相对于一个神经元的权重(该值应在训练过程中由 NN 计算和调整)。
例如,如果我有 3 个输入 x1、x2 和 x3,并且我有一个输出 y。网络训练好后,我能知道 x1 对 y 的影响有多大吗?我想它应该通过 y 对 x1 的偏导数来计算。但是我怎么知道网络所代表的非线性函数呢?这可能吗?
谢谢!
好问题...
有两种方法浮现在脑海。一种是使用“Hinton 图”进行目视检查(通过谷歌查看)。然而,另一种简单的方法是为单个输入输入一个较大的值,为其他输入输入一个较小的值(零?),然后查看它对每个输出值的作用。
还有其他更高级的方法,但这些是一个很好的开始方式。
祝你好运!如果您发现任何有趣的事情以及最适合您的计算,请告诉我们。
我找到了一个很好的工作:
“如何衡量输入的重要性”,由美国北卡罗来纳州卡里市 SAS Institute Inc. 的 Warren S. Sarle 撰写 ftp://ftp.sas.com/pub/neural/importance.html
简要地:
现在简要介绍一下我更喜欢使用的最后一种方法:
对于输出函数Y = f( X1, X2, X3),您可以计算:
D1 = f( X1+h, X2, X3) - f( X1, X2, X3)
D2 = f( X1, X2+h, X3) - f( X1, X2, X3)
D3 = f( X1, X2, X3+h) - f( X1, X2, X3)
所有输入值对上的这些绝对差的平均值可以很好地估计每个输入的重要性。
这就是我在 Lua Torch 中的做法
注 1:我采用平方差而不是绝对值。
注 2:我的输入矩阵是标准化的,这就是为什么我可以选择 h 的值作为 [-1..1]。
local samples_count = inputs:size(1)
local inputs_count = inputs:size(2)
local outputs = model:forward(inputs):clone()
local importance = torch.zeros(inputs_count)
print("Processing inputs 1 to "..tostring(inputs_count)); io.flush()
for i = 1, inputs_count do
io.write("\rProcessing "..tostring(i)); io.flush()
for h = -1, 1, 0.2 do
local inputs_h = inputs:clone()
if h ~= 0 then inputs_h[{{},{i,i}}]:add(h) end
local outputs_h = model:forward(inputs_h)
importance[i] = importance[i] + torch.add(outputs_h, -1, outputs):pow(2):sum()
end -- for h
end -- for inputs_count
importance:div(samples_count)
print("\nimportance:\n", importance)