Pile RNN optimisée
Implémente la pile RNN CuDNN5 optimisée d’une ou plusieurs couches réseau récurrentes.
OptimizedRNNStack (weights, input,
hiddenDims, numLayers = 1,
bidirectional = false,
recurrentOp='lstm')
Paramètres
weights
: une matrice de poids contenant tous les paramètres de modèle sous forme de matrice unique. Utilisez l’inférence de dimension, cf. description ci-dessous.input
: données à appliquer à la pile d’un ou plusieurs réseaux récurrents. Doit être une séquence et ne doit pas être éparse.hiddenDims
: dimension de l’état masqué dans chaque couche et, si bidirectionnelle, de chacune des deux directionsnumLayers
(valeur par défaut : 1) : nombre de couchesbidirectional
(valeur par défaut : false) : si la valeur est true, le modèle est bidirectionnelrecurrentOp
(par défaut :lstm
) sélectionnez le type RNN. Valeurs autorisées :lstm
, ,gru
rnnTanh
,rnnReLU
Description
Cette fonction donne accès au RNN CuDNN5, une implémentation hautement efficace d’une pile d’une ou plusieurs couches de réseaux récurrents. Nous avons observé des accélérations sur l’ordre de 5, comparativement à une implémentation explicite en tant que réseau de calcul dans BrainScript. Bien qu’il ne soit pas aussi flexible qu’une implémentation BrainScript, l’accélération du temps d’entraînement peut être utile (notez toutefois que ces modèles ne peuvent être déployés que sur des machines avec un GPU).
Les réseaux peuvent être uni-ou bidirectionnels et être du type suivant (recurrentOp
paramètre) :
lstm
: Mémoire à court terme (Hochreiter et Schmidhuber)gru
: Unité récurrente ferméernnTanh
: RNN brut avec unetanh
non-linéaritérnnReLU
: RNN brut avec une non-linéaire linéaire rectifiée
Toutes les pondérations sont contenues dans une seule matrice qui doit avoir hiddenDims
des lignes et autant de colonnes que nécessaire pour contenir tous les paramètres.
Étant donné que cela peut être fastidieux à déterminer, vous pouvez avoir automatiquement la dimension déduite .
Pour vous assurer que l’initialisation aléatoire utilise le ventilateur correct, spécifiez initOutputRank=-1
:
W = ParameterTensor {(Inferred:Inferred), initOutputRank=-1}
Si vous utilisez l’opération, nous vous recommandons d’utiliser cette lstm
primitive par le biais RecurrentLSTMLayerStack{}
de , ce qui prendra soin de créer les poids.
Formation sur GPU, déploiement sur le processeur
Actuellement, il n’est pas possible de déployer un RNN entraîné en tant que OptimizedRNNStack()
système sur des systèmes sans GPU.
Nous pensons qu’il est possible d’effectuer une action post-formation de modification de modèle qui remplace les OptimizedRNNStack()
nœuds par des expressions BrainScript natives compatibles processeur qui émulent précisément l’implémentation RNN CuDNN5.
Exemple
Modèle de reconnaissance vocale qui se compose d’une couche 3 masquée, une LSTM bidirectionnelle avec une dimension d’état masquée par couche et une direction de 512 :
features = Input {40}
W = ParameterTensor {(Inferred:Inferred), initOutputRank=-1, initValueScale=1/10}
h = OptimizedRNNStack (W, features, 512, numLayers=3, bidirectional=true)
p = DenseLayer {9000, activation=Softmax, init='heUniform', initValueScale=1/3}