文章中の次の単語を予測するための簡単なreccurent network(62 input units、124 hidden/context units、62 output units)を訓練しました。私はシグモイド活性化機能を使用しました。 いくつかの奇妙な理由によって、トレーニング中にsoftmaxを適用することができませんでした。私の教授は、後でsoftmaxをネットワーク出力に適用できると提案しました。行列は576行と62 coloumnsを持っています。 だから、私は次のようにRでソフトマックスを実装:、問題は1に正しく合計()戻り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、それは行ごとに、私の関数である値を生成しますお互いに非常に似ています。値はほぼ「同じ」なので、ネットワークのパフォーマンスを検証することはできません。
ここに小さなサンプルデータがあります。それはネットワーク出力の2番目の行からです。 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)
私は、次のような結果を得る:
[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です。私は間違って何をしていますか?
多分、あなたはその問題を解決する考えがあります。お時間を事前にありがとうと
に関して、マティアス
EDIT :-)役立つ:
これは私が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")
ありがとうございました。 私は_Stuttgart Neuronal Network Simulator for R(RSNNS)_を使用してネットワークを構築します。重みは、-0.15と0.15の間でランダムに生成されます。学習率は0.1に設定された。トレーニングのために標準的なバックプロパゲーションを使用しましたが、クロスエントロピーはありませんでした(現在はRSNNSでは提供されていません)。隠れ、入力、出力単位の活性化関数はシグモイドであり、コンテキスト単位の活性化関数はそのアイデンティティです。 – matze
入力は、直交する行を持つ行列内で提供されます。各列は単一の単語を表し、行は文中の単語を表します。ある行の中の1つのビットだけがactive(1)であり、その特定の単語にフラグを立てます。他のものはその行でゼロです。私はあなたの解決策を試みましたが、私は同じ結果を得ました。私がsoftmaxを使用したい理由は、> 1にいくつかの値の合計があるので、私の混合線形モデルに対数オッズを使用することができないからです。 – matze
@matze実際の電話をかけることはできますか?私は 'RSNNS :: mlp'を使っていると思いますか? – cdeterman