Partager via


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 directions
  • numLayers (valeur par défaut : 1) : nombre de couches
  • bidirectional (valeur par défaut : false) : si la valeur est true, le modèle est bidirectionnel
  • recurrentOp (par défaut : lstm) sélectionnez le type RNN. Valeurs autorisées : lstm, , grurnnTanh,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ée
  • rnnTanh: RNN brut avec une tanh 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}