Delen via


Geoptimaliseerde RNN-stack

Implementeert de geoptimaliseerde CuDNN5 RNN-stack van een of meer terugkerende netwerklagen.

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

Parameters

  • weights: één gewichtsmatrix met alle modelparameters als één matrix. Gebruik dimensiedeductie, zie de onderstaande beschrijving.
  • input: gegevens waarop de stapel van een of meer terugkerende netwerken moet worden toegepast. Moet een reeks zijn en mag niet parseren.
  • hiddenDims: dimensie van de verborgen status in elke laag en, indien bidirectioneel, van elk van de twee richtingen
  • numLayers (standaard: 1): aantal lagen
  • bidirectional (standaard: onwaar): indien waar, is het model bidirectioneel
  • recurrentOp (standaard: lstm): selecteer het RNN-type. Toegestane waarden: lstm, gru, rnnTanhrnnReLU

Description

Deze functie geeft toegang tot de CuDNN5 RNN, een zeer efficiënte implementatie van een stapel van een of meer lagen terugkerende netwerken. We hebben versnellingen waargenomen in de volgorde van 5, vergeleken met een expliciete implementatie als rekennetwerk in BrainScript. Hoewel het niet zo flexibel is als een BrainScript-implementatie, kan de snelheid van de trainingstijd het compromis waard zijn (houd er echter rekening mee dat dergelijke modellen alleen kunnen worden geïmplementeerd op machines met een GPU).

De netwerken kunnen uni- of bidirectioneel zijn en van het volgende type (recurrentOp parameter):

  • lstm: Long Short Term Memory (Hochreiter en Schmidhuber)
  • gru: Gated Terugkerende Eenheid
  • rnnTanh: gewone RNN met een tanh niet-lineariteit
  • rnnReLU: gewone RNN met een gecorrigeerde lineaire niet-lineariteit

Alle gewichten zijn opgenomen in één matrix met hiddenDims rijen en zoveel kolommen als nodig is om alle parameters te bewaren. Omdat dit lastig kan zijn om te bepalen, kunt u de dimensie automatisch laten afleiden . Als u wilt controleren of voor willekeurige initialisatie de juiste ventilator wordt gebruikt, geeft u initOutputRank=-1het volgende op:

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

Als u de lstm bewerking gebruikt, raden we u aan om deze primitieve via RecurrentLSTMLayerStack{}te gebruiken, die zorgt voor het maken van de gewichten.

Training op GPU, implementeren op CPU

Momenteel is het niet mogelijk om een RNN te implementeren die is getraind als een OptimizedRNNStack() op systemen zonder GPU's. We denken dat het mogelijk is om een natrainingsmodelbewerkingsactie uit te voeren die de OptimizedRNNStack() knooppunten vervangt door CPU-compatibele systeemeigen BrainScript-expressies die de CuDNN5 RNN-implementatie nauwkeurig nabootsen.

Voorbeeld

Spraakherkenningsmodel dat bestaat uit een drie verborgen laag en een bidirectionele LSTM met een verborgen statusdimensie per laag en richting van 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}