3

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

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

谢谢!

4

2 回答 2

1

好问题...

有两种方法浮现在脑海。一种是使用“Hinton 图”进行目视检查(通过谷歌查看)。然而,另一种简单的方法是为单个输入输入一个较大的值,为其他输入输入一个较小的值(零?),然后查看它对每个输出值的作用。

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

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

于 2012-11-30T04:52:51.450 回答
1

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

“如何衡量输入的重要性”,由美国北卡罗来纳州卡里市 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)
于 2016-09-26T13:06:24.957 回答