1

我訓練了一個簡單的可恢復網絡(62個輸入單元,124個隱藏/上下文單元,62個輸出單元)以預測句子中的後續單詞。我使用了sigmoid激活功能。 由於一些各種奇怪的原因,在訓練過程中不可能應用softmax。我的教授建議,我可以在之後將softmax應用於網絡輸出。矩陣有576行和62色。 所以我以下列方式實現中的R SOFTMAX:輸出激活與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<-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") 

回答

0

更簡潔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%概率的第一班。

我建議使用上面的函數在整個數據集中嘗試它。

這是所有假設很多東西在你的神經網絡的實現。如果您可以提供對您使用的軟件的參考以及您設置的參數,這將會很有幫助。

+0

非常感謝您的回答。 我使用_斯圖加特神經網絡模擬器R(RSNNS)_來構建網絡。權重是在-0.15和0.15之間隨機生成的。學習率設定爲0.1。我使用標準反向傳播進行訓練,但沒有交叉熵(目前它不由RSNNS提供)。隱藏,輸入和輸出單元的激活函數是sigmoid,並且上下文單元的身份單元。 – matze

+0

輸入在具有正交行的矩陣內提供。每個顏色代表一個單詞,一行代表一個句子中的一個單詞。一行中只有一位是有效的(1)並標記該特定的字。其他人在那一行是零。我試過你的解決方案,但我得到了同樣的結果。我想使用softmax的原因是因爲我有一些數值總和> 1,所以我不能使用我的混合線性模型的對數賠率。 – matze

+0

@matze你能提供實際的電話嗎?我假設你正在使用'RSNNS :: mlp'? – cdeterman