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å riktningarnanumLayers
(standard: 1): antal lagerbidirectional
(standard: false): om det är sant är modellen dubbelriktadrecurrentOp
(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 UnitrnnTanh
: oformaterad RNN med entanh
icke-linjäritetrnnReLU
: 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}