如何计算神经网络中输入的权重

时间:2012-11-26 21:11:05

标签: neural-network

神经网络经过全面训练后(假设是正常的前馈网络),是否有办法计算一个输入相对于最终输出的重量?请注意,我不是在谈论关于一个神经元的输入权重(该值应该在训练过程中由NN计算和调整)。

例如,如果我有3个输入x1,x2和x3,并且我有一个输出y。网络训练完毕后,我能知道x1对y有多大影响吗?我想它应该通过y相对于x1的偏导数来计算。但是,我如何知道网络代表的非线性函数?这有可能吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

很棒的问题......

有两种方法可以想到。一种是使用“Hinton图”进行目视检查(通过Google查看)。但是,另一个简单的方法是为单个输入输入一个较大的值,为其他输入输入一个较小的值(零?),并查看它对每个输出值的作用。

还有其他更先进的方法,但这些都是一个很好的开始方式。

祝你好运!如果您发现任何有趣的内容以及哪些计算最适合您,请告诉我们。

答案 1 :(得分:0)

我找到了一个很好的工作:

  

"如何衡量投入的重要性"美国北卡罗来纳州卡里市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)