Sdílet prostřednictvím


Optimalizovaný zásobník RNN

Implementuje optimalizovaný zásobník cuDNN5 RNN jedné nebo více opakujících se síťových vrstev.

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

Parametry

  • weights: jedna matice hmotnosti obsahující všechny parametry modelu jako jednu matici. Použijte odvození dimenzí, viz popis níže.
  • input: data pro použití zásobníku jedné nebo více opakujících se sítí. Musí být posloupnost a nesmí být řídké.
  • hiddenDims: dimenze skrytého stavu v každé vrstvě a v případě obousměrného směrování každého ze dvou směrů
  • numLayers (výchozí: 1): počet vrstev
  • bidirectional (výchozí hodnota: false): Pokud je pravda, model je obousměrný.
  • recurrentOp (výchozí: lstm): Vyberte typ sítě RNN. Povolené hodnoty: lstm, , gru, rnnTanhrnnReLU

Description

Tato funkce poskytuje přístup k síti CuDNN5 RNN, vysoce efektivní implementaci zásobníku jedné nebo více vrstev opakujících se sítí. Zaznamenali jsme rychlost v pořadí 5 v porovnání s explicitní implementací jako výpočetní síť v BrainScriptu. I když není tak flexibilní jako implementace BrainScriptu, může být rychlejší trénování za kompromis (upozorňujeme však, že takové modely je možné nasadit pouze na počítače s GPU).

Sítě mohou být jednosměrné nebo obousměrné a mohou mít následující druh (recurrentOp parametr):

  • lstm: Dlouhodobá krátkodobá paměť (Hochreiter a Schmidhuber)
  • gru: Vrátná rekurentní jednotka
  • rnnTanh: plain RNN with a tanh non-linearity
  • rnnReLU: plain RNN with a rectified linearity non-linearity

Všechny váhy jsou obsaženy v jedné matici, která by měla obsahovat hiddenDims řádky a tolik sloupců, kolik je potřeba k uložení všech parametrů. Vzhledem k tomu, že to může být těžkopádné k určení, můžete mít dimenzi odvozenou automaticky. Chcete-li zajistit, aby náhodná inicializace používala správný ventilátor, zadejte initOutputRank=-1:

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

Pokud použijete lstm operaci, doporučujeme tuto primitivu použít prostřednictvím RecurrentLSTMLayerStack{}, což se postará o vytvoření váhy.

Trénování na GPU, nasazení na procesor

V současné době není možné nasadit síť RNN natrénovanou jako na OptimizedRNNStack() systémech bez gpu. Věříme, že je možné provést akci úprav modelu po trénování, která nahrazuje OptimizedRNNStack() uzly nativními výrazy BrainScriptu kompatibilními s procesorem, které přesně emulují implementaci RNN5 CuDNN5.

Příklad

Model rozpoznávání řeči, který se skládá ze 3 skryté vrstvy obousměrného LSTM s dimenzí skrytého stavu na vrstvu a směr 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}