【问题标题】:How to calculate the weight of a input in neural network [closed]如何计算神经网络中输入的权重[关闭]
【发布时间】:2012-11-14 10:10:45
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • “我怎么知道网络所代表的非线性函数”是什么意思?毕竟是你训练的,所以你应该知道超参数、激活函数等等。或者你在使用一些黑盒库实现?
  • @larsmans 请原谅我的无知,因为我是神经网络的新手。我不知道“超参数”是什么意思。我只是想找到一个表示 x1 和 y 之间关系的函数(在上面的例子中)。虽然我知道权重和活动函数,但我仍然不知道如何“组装”这些值以形成单个函数。
  • 对于两层网络,前馈 ANN 计算的函数通常是 Y = f(σ(X × W1.T + b1) × W2.T + b2)f 是特定于任务的并且 σ = tanh。任何教科书都解释了任何输入特征的 Y 导数,例如Rojas.
  • @larsmans 非常感谢您提供的信息。我会读教科书。

标签: neural-network


【解决方案1】:

好问题...

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

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

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

【讨论】:

    【解决方案2】:

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

    “如何衡量输入的重要性”,作者:Warren S. Sarle,SAS Institute Inc.,美国北卡罗来纳州卡里 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 2018-09-28
      • 2017-11-28
      • 2012-06-22
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多