Dela via


Optimerad RNN-stack

Implementerar den optimerade CuDNN5 RNN-stacken för ett eller flera återkommande nätverksnivåer.

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

Parametrar

  • weights: en viktmatris som innehåller alla modellparametrar som en enda matris. Använd dimensionsinferens, se beskrivningen nedan.
  • input: data som stacken för ett eller flera återkommande nätverk ska tillämpas på. Måste vara en sekvens och får inte vara gles.
  • hiddenDims: dimensionen av det dolda tillståndet i varje lager och, om det är dubbelriktat, av var och en av de två riktningarna
  • numLayers (standard: 1): antal lager
  • bidirectional (standard: false): om det är sant är modellen dubbelriktad
  • recurrentOp (standard: lstm): välj RNN-typen. Tillåtna värden: lstm, gru, rnnTanh, rnnReLU

Description

Den här funktionen ger åtkomst till CuDNN5 RNN, en mycket effektiv implementering av en stack med ett eller flera lager av återkommande nätverk. Vi har observerat hastighetsupptakten i storleksordningen 5, jämfört med en explicit implementering som ett beräkningsnätverk i BrainScript. Även om det inte är lika flexibelt som en BrainScript-implementering kan den snabba träningstiden vara värd kompromissen (observera dock att sådana modeller bara kan distribueras på datorer med en GPU).

Nätverken kan vara enkelriktade eller dubbelriktade och vara av följande typ (recurrentOp parameter):

  • lstm: Långsiktigt minne (Hochreiter och Schmidhuber)
  • gru: Gated Recurrent Unit
  • rnnTanh: oformaterad RNN med en tanh icke-linjäritet
  • rnnReLU: oformaterad RNN med en rektifierad linjär icke-linjäritet

Alla vikter finns i en enda matris som ska ha hiddenDims rader och så många kolumner som behövs för att lagra alla parametrar. Eftersom det kan vara besvärligt att avgöra kan du få dimensionen härledd automatiskt. Om du vill se till att slumpmässig initiering använder rätt fläkt anger du initOutputRank=-1:

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

Om du använder åtgärden lstm rekommenderar vi att du använder den här primitiven via RecurrentLSTMLayerStack{}, som tar hand om att skapa vikterna.

Utbildning om GPU, distribuera på CPU

För närvarande går det inte att distribuera ett RNN som tränats som ett OptimizedRNNStack() på-system utan GPU:er. Vi tror att det är möjligt att utföra en modellredigeringsåtgärd efter träningen som ersätter OptimizedRNNStack() noderna med CPU-kompatibla inbyggda BrainScript-uttryck som exakt emulerar CuDNN5 RNN-implementeringen.

Exempel

Taligenkänningsmodell som består av ett 3-dolt lager en dubbelriktad LSTM med en dold tillståndsdimension per lager och riktning på 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}