1

J'ai formé un simple réseau de reccurent (62 unités d'entrée, 124 unités de contexte/cachées, 62 unités de sortie) pour prédire le mot suivant dans une phrase. J'ai utilisé la fonction d'activation sigmoïde. Pour certaines raisons diverses et étranges, il n'était pas possible d'appliquer softmax pendant l'entraînement. Mon professeur a suggéré, que je pourrais appliquer softmax ensuite à la sortie des réseaux. La matrice a 576 lignes et 62 colonnes. Je mis en œuvre dans softmax R de la manière suivante:Conversion de l'activation de sortie avec Softmax produit des valeurs similaires

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) 
} 

Chaque ligne de la matrice des rendements softmax_complete(), résume correctement à 1. Le problème est que pour chaque ligne, ma fonction produisant des valeurs qui sont très similaires les uns aux autres. Il n'est pas possible de valider les performances des réseaux car les valeurs sont presque "identiques".

Voici quelques exemples de données. C'est à partir de la deuxième ligne de la sortie des réseaux. Softmax n'a pas encore été appliqué.

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) 

Quand j'applique softmax à cette ligne, je reçois les résultats suivants:

[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 

La somme de la ligne est 1,000703. Et pour une autre ligne qui n'est pas représentée dans l'exemple ci-dessus, la somme des lignes est 0,9976472. Qu'est-ce que je fais mal? Peut-être que vous avez une idée pour résoudre ce problème. Nous vous remercions d'avance pour votre temps et votre aide :-)

Cordialement, Matthias

EDIT:

Voici comment je crée le Net Elman par 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") 

Répondre

0

Une plus concise version de softmax serait:

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

où vous pouvez maintenant passer la matrice directement dans. Maintenant, en regardant le vecteur que vous avez fourni.

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

Cependant, il semble toujours qu'il n'y ait pas beaucoup de différence dans vos valeurs. Il me semble que pour cet échantillon particulier, ce n'est pas beaucoup d'informations fournies par votre RNN. D'après cela, la «classe» la plus probable est la première classe avec une probabilité de 2%.

Je vous recommande de l'essayer sur l'ensemble de votre ensemble de données en utilisant la fonction ci-dessus.

Tout cela suppose beaucoup de choses sur votre implémentation du réseau neuronal. Il serait utile que vous fournissiez une référence au logiciel que vous avez utilisé et au moins les paramètres que vous avez définis.

+0

Merci beaucoup pour votre réponse. J'utilise le _Stuttgart Neuronal Network Simulator pour R (RSNNS) _ pour construire le réseau. Les poids sont générés de manière aléatoire entre -0,15 et 0,15. Le taux d'apprentissage a été fixé à 0,1. J'ai utilisé la rétropropagation standard pour l'entraînement mais sans Cross-Entropy (ce n'est actuellement pas fourni par RSNNS). La fonction d'activation pour les unités cachées, d'entrée et de sortie est sigmoïde et pour les unités de contexte son identité. – matze

+0

Les entrées sont fournies dans une matrice avec des lignes orthogonales. Chaque colonne représente un seul mot, une ligne représente un mot dans une phrase.Un seul bit d'affilée est actif (1) et signale ce mot spécifique. Les autres sont à zéro dans cette rangée. J'ai essayé votre solution mais j'ai eu les mêmes résultats. La raison pour laquelle je veux utiliser softmax est que j'ai quelques valeurs sum à> 1 donc je ne peux pas utiliser les cotes log pour mon modèle linéaire mixte. – matze

+0

@matze Pouvez-vous fournir l'appel réel? Je suppose que vous utilisez 'RSNNS :: mlp'? – cdeterman