Freigeben über


Optimierte RNN-Stapel

Implementiert den optimierten CuDNN5 RNN-Stapel eines oder mehrerer wiederkehrender Netzwerkebenen.

OptimizedRNNStack (weights, input,
                   hiddenDims, numLayers = 1,
                   bidirectional = false,
                   recurrentOp='lstm')

Parameter

  • weights: eine Gewichtsmatrix, die alle Modellparameter als einzelne Matrix enthält. Verwenden Sie die Dimensioninference, cf. Beschreibung unten.
  • input: Daten zum Anwenden des Stapels eines oder mehrerer wiederkehrender Netzwerke auf. Muss eine Sequenz sein und darf nicht versparen.
  • hiddenDims: Dimension des ausgeblendeten Zustands in jeder Ebene und, wenn bidirektional, jeder der beiden Richtungen
  • numLayers (Standard: 1): Anzahl der Ebenen
  • bidirectional (standard: false): if true, the model is bidirectional
  • recurrentOp (Standard: lstm): Wählen Sie den RNN-Typ aus. Zulässige Werte: lstm, , gru, rnnTanhrnnReLU

BESCHREIBUNG

Diese Funktion bietet Zugriff auf das CuDNN5 RNN, eine hoch effiziente Implementierung eines Stapels eines oder mehrerer Ebenen wiederkehrender Netzwerke. Wir haben Geschwindigkeiten in der Reihenfolge von 5 beobachtet, verglichen mit einer expliziten Implementierung als Berechnungsnetzwerk in BrainScript. Obwohl es nicht so flexibel wie eine BrainScript-Implementierung ist, kann die Geschwindigkeit der Schulungszeit den Kompromiss wert sein (beachten Sie jedoch, dass solche Modelle nur auf Computern mit einer GPU bereitgestellt werden können).

Die Netzwerke können uni- oder bidirektional sein und von der folgenden Art (recurrentOp Parameter):

  • lstm: Long Short Term Memory (Hochreiter und Schmidhuber)
  • gru: Wiederkehrende Einheit mit Gittern
  • rnnTanh: nur RNN mit einer tanh Nicht-Linearität
  • rnnReLU: einfache RNN mit einer rektifizierten linearen Nicht-Linearität

Alle Gewichtungen sind in einer einzelnen Matrix enthalten, die Zeilen und so viele Spalten wie erforderlich enthalten sollte hiddenDims , um alle Parameter zu halten. Da dies schwerfällig sein kann, um zu bestimmen, können Sie die Dimension automatisch verzögert haben. Um sicherzustellen, dass die zufällige Initialisierung den richtigen Fan-In verwendet, geben Sie folgendes an initOutputRank=-1:

W = ParameterTensor {(Inferred:Inferred), initOutputRank=-1}

Wenn Sie den lstm Vorgang verwenden, empfehlen wir, diesen Grundtyp durch RecurrentLSTMLayerStack{}zu verwenden, der die Gewichte erstellt.

Schulung auf GPU, Bereitstellen auf CPU

Derzeit ist es nicht möglich, eine RNN-Schulung als OptimizedRNNStack() System ohne GPUs bereitzustellen. Wir glauben, dass es möglich ist, eine Nachschulungsmodellbearbeitungsaktion durchzuführen, die die Knoten durch CPU-kompatible native BrainScript-Ausdrücke ersetzt, die genau die OptimizedRNNStack() CuDN5 RNN5-Implementierung emulieren.

Beispiel

Spracherkennungsmodell, das aus einer 3-ausgeblendeten Ebene besteht, eine bidirektionale LSTM mit einer ausgeblendeten Zustandsdimension pro Ebene und Richtung von 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}