【问题标题】:Conversion of output activation with Softmax produces similar values使用 Softmax 转换输出激活会产生相似的值
【发布时间】:2016-12-08 05:28:48
【问题描述】:

我训练了一个简单的递归网络(62 个输入单元、124 个隐藏/上下文单元、62 个输出单元)来预测句子中的后续单词。我使用了 sigmoid 激活函数。 由于各种奇怪的原因,无法在训练期间应用 softmax。我的教授建议,我可以在之后将 softmax 应用于网络输出。该矩阵有 576 行和 62 列。 所以我在 R 中通过以下方式实现了 softmax:

softmax <- function(outVec = NULL){
  s.vec <- exp(outVec)/sum(exp(outVec))
  return(s.vec)
}

softmax_complete <- function(vec = NULL){
  softmaxed.vec <- matrix(apply(vec, 1, softmax), ncol=dim(vec)[2], nrow=dim(vec)[1])
  return(softmaxed.vec)
}

softmax_complete() 返回的矩阵的每一行正确地总和为 1。问题是,对于每一行,我的函数产生的值彼此非常相似。由于值几乎“相同”,因此无法验证网络性能。

这是一些小的示例数据。它来自网络输出的第二行。 Softmax 尚未应用。

output.vec <- c(0.2371531427, 0.0085829534, 0.0007576860, 0.0027021256, 0.0025776778, 0.0014593119, 0.0019006504, 0.0403518006,
                0.0024586972, 0.0517364480, 0.0012057235, 0.0950696915, 0.0025749709, 0.0008823058, 0.0005064047, 0.0014039490,
                0.0013259919, 0.0014723240, 0.0011820868, 0.0011805159, 0.0009319001, 0.0022884205, 0.0023589570, 0.0020189525,
                0.0015377736, 0.0937648788, 0.0012874968, 0.0443032309, 0.0012919122, 0.0897148922, 0.0022041877, 0.0444274731,
                0.0014143962, 0.0361100733, 0.0020817134, 0.0447632931, 0.0009620183, 0.0011552101, 0.0016173105, 0.0016870035,
                0.0011272663, 0.0019183536, 0.0017270016, 0.0011056620, 0.0007743868, 0.0026786255, 0.0019340677, 0.0010532230,
                0.0014585924, 0.0386148430, 0.0012295874, 0.0390544645, 0.0017903288, 0.0967107117, 0.0013074477, 0.0006164946,
                0.0001758277, 0.0001023397, 0.0004014068, 0.0004558225, 0.0003554984, 0.0001830685)

当我将 softmax 应用于该行时,我得到以下结果:

[1] 0.01585984 0.01583950 0.01567646 0.01583540 0.01735750 0.01579704 0.01587178 0.01589101 0.01586093 0.01590457
[11] 0.01586255 0.01637181 0.01590217 0.01584308 0.01570456 0.01581733 0.01952223 0.01590497 0.01970620 0.01578586
[21] 0.01610417 0.01591379 0.01588095 0.01584309 0.01567710 0.01582956 0.01650858 0.01573117 0.01589502 0.01608836
[31] 0.01574208 0.01582079 0.01584367 0.01569571 0.01583481 0.01596172 0.01577246 0.01586151 0.01605467 0.01574746
[41] 0.01586397 0.01581472 0.01576479 0.01580914 0.01583660 0.01566672 0.01584366 0.02017004 0.01585517 0.02007705
[51] 0.01580263 0.01583277 0.01580424 0.01583763 0.01587117 0.01568283 0.01583775 0.01595945 0.01587471 0.01575585
[61] 0.01584288 0.01577770

行总和为 1.000703。对于上面示例中未描述的另一行,行总和为 0.9976472。我做错了什么?

也许你们有解决这个问题的想法。提前感谢您的时间和帮助:-)

问候,马蒂亚斯

编辑:

这就是我通过 RSNNS 创建 Elman 网络的方式:

elman<-rsnnsObjectFactory(subclass=c("elman"), nInputs=inputNeurons, maxit=maxIterations, 
                     initFunc="JE_Weights", initFuncParams=c(0.15, -0.15, 0, 1.0, 0.5), 
                     learnFunc="JE_BP", learnFuncParams=c(learnRate),
                     updateFunc="JE_Order", updateFuncParams=c(0),
                     shufflePatterns=FALSE, computeIterativeError=FALSE) 
  elman$archParams <- list(size=hiddenNeurons)
  elman$snnsObject$elman_createNet(c(inputNeurons, hiddenNeurons, outputNeurons),c(1,1,1),FALSE)
  elman$snnsObject$initializeNet(c(0.15, -0.15, 0, 1.0, 0.5), initFunc="JE_Weights") 
  elman$snnsObject$setUnitDefaults(1,0,1,0,1,"Act_Logistic","Out_Identity")
  elman$snnsObject$setTTypeUnitsActFunc("UNIT_INPUT", "Act_Logistic")
  elman$snnsObject$setTTypeUnitsActFunc("UNIT_SPECIAL_H", "Act_Identity")
  elman$snnsObject$setTTypeUnitsActFunc("UNIT_OUTPUT", "Act_Logistic")

【问题讨论】:

    标签: r machine-learning neural-network recurrent-neural-network softmax


    【解决方案1】:

    更简洁的 softmax 版本是:

    softmax <- function(x){
      score.exp <- exp(x)
      probs <-sweep(score.exp, 1, rowSums(score.exp), '/')
      return(probs)
    }
    

    您现在可以将矩阵直接传入其中。现在,查看您提供的向量。

    res <- softmax(matrix(output.vec, nrow=1))
    sum(res)
    [1] 1
    

    但是,您的价值观似乎仍然没有太大差异。在我看来,对于这个特定的样本,您的 RNN 提供的信息并不多。据此,最有可能的“类”是概率为 2% 的第一类。

    我建议使用上面的函数在整个数据集上尝试它。

    这一切都假设了您对神经网络的实现有很多事情。如果您能提供有关您使用的软件的参考以及至少您设置的参数,将会很有帮助。

    【讨论】:

    • 非常感谢您的回答。我使用 Stuttgart Neuronal Network Simulator for R (RSNNS) 构建网络。权重在 -0.15 和 0.15 之间随机生成。学习率设置为 0.1。我使用标准反向传播进行训练,但没有交叉熵(目前 RSNNS 不提供)。隐藏单元、输入单元和输出单元的激活函数是 sigmoid,上下文单元的激活函数是其标识。
    • 输入在具有正交行的矩阵中提供。每列代表一个单词,一行代表一个句子中的一个单词。一行中只有一个位处于活动状态 (1) 并标记该特定字。其他在该行中为零。我尝试了您的解决方案,但得到了相同的结果。我想使用 softmax 的原因是我有一些值总和 >1,所以我不能为我的混合线性模型使用对数赔率。
    • @matze 你能提供实际的电话吗?我假设您使用的是RSNNS::mlp?
    • 当我在没有 softmax 的情况下测量网络性能时,我得到了有用的结果。我使用的公式是Grammatical Prediction Error(Christiansen & Chater,1999)。它考虑了命中、未命中和误报,并将它们与上下文无关语法生成的单词概率进行比较 (SLG, Rohde, 1999)。但是,正如我上面提到的,某些值的总和大于 1,我担心结果不能解释为概率,因此我可能会得出错误的结论。
    • 我编辑了我的问题以显示由 RSNNS 创建 elman 网络的完整函数调用。
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2022-12-25
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多