Condividi tramite


Stack RNN ottimizzato

Implementa lo stack RNN5 CuDNN5 ottimizzato di uno o più livelli di rete ricorrenti.

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

Parametri

  • weights: una matrice di peso contenente tutti i parametri del modello come singola matrice. Usare l'inferenza delle dimensioni, vedere la descrizione seguente.
  • input: dati da applicare allo stack di una o più reti ricorrenti. Deve essere una sequenza e non deve essere sparse.
  • hiddenDims: dimensione dello stato nascosto in ogni livello e, se bidirezionale, di ognuna delle due direzioni
  • numLayers (impostazione predefinita: 1): numero di livelli
  • bidirectional (impostazione predefinita: false): se true, il modello è bidirezionale
  • recurrentOp (impostazione predefinita: lstm): selezionare il tipo RNN. Valori consentiti: lstm, gru, , rnnTanhrnnReLU

Descrizione

Questa funzione consente l'accesso alla RNN CuDNN5, un'implementazione estremamente efficiente di uno o più livelli di reti ricorrenti. Abbiamo osservato velocità sull'ordine di 5, rispetto a un'implementazione esplicita come rete di calcolo in BrainScript. Anche se non è flessibile come un'implementazione BrainScript, la velocità del tempo di training può essere utile per la compromissione (si noti tuttavia che tali modelli possono essere distribuiti solo nei computer con una GPU).

Le reti possono essere uni- o bidirezionali e essere del tipo seguente (recurrentOp parametro):

  • lstm: memoria a breve termine (Hochreiter e Schmidhuber)
  • gru: Unità ricorrente gated
  • rnnTanh: RNN normale con una tanh non linearità
  • rnnReLU: RNN normale con una non linearità lineare rettificata

Tutti i pesi sono contenuti in una singola matrice che deve contenere hiddenDims righe e quante colonne devono contenere tutti i parametri. Poiché ciò può essere complesso da determinare, è possibile avere la dimensione dedotto automaticamente. Per assicurarsi che l'inizializzazione casuale usi la ventola corretta, specificare initOutputRank=-1:

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

Se si usa l'operazione, è consigliabile usare questa lstm primitiva tramite RecurrentLSTMLayerStack{}, che si occupa della creazione dei pesi.

Training sulla GPU, distribuire sulla CPU

Attualmente non è possibile distribuire un RNN sottoposto a training come OptimizedRNNStack() in sistemi senza GPU. Si ritiene che sia possibile eseguire un'azione di post-training model-editing che sostituisce i OptimizedRNNStack() nodi in base alle espressioni Native BrainScript compatibili con la CPU che emula esattamente l'implementazione RNN5 di CuDNN5.

Esempio

Modello di riconoscimento vocale costituito da un livello nascosto a 3 livelli bidirezionali LSTM con una dimensione di stato nascosto per livello e direzione 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}