Udostępnij przez


Zoptymalizowany stos sieci RNN

Implementuje zoptymalizowany stos CuDNN5 RNN co najmniej jednej cyklicznej warstwy sieciowej.

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

Parametry

  • weights: jedna macierz wagi zawierająca wszystkie parametry modelu jako pojedynczą macierz. Użyj wnioskowania wymiarów, por. opis poniżej.
  • input: dane, do których ma być stosowany stos co najmniej jednej cyklicznej sieci. Musi być sekwencją i nie może być rozrzedzy.
  • hiddenDims: wymiar ukrytego stanu w każdej warstwie i, jeśli dwukierunkowy, każdego z dwóch kierunków
  • numLayers (ustawienie domyślne: 1): liczba warstw
  • bidirectional (wartość domyślna: false): jeśli wartość true, model jest dwukierunkowy
  • recurrentOp (ustawienie domyślne: lstm): wybierz typ nazwy sieci RNN. Dozwolone wartości: lstm, , rnnTanhgru,rnnReLU

Opis

Ta funkcja zapewnia dostęp do sieci RNN CuDNN5, wysoce wydajnej implementacji stosu co najmniej jednej warstwy sieci cyklicznych. Zaobserwowaliśmy przyspieszenie w kolejności 5 w porównaniu z jawną implementacją jako siecią obliczeniową w języku BrainScript. Chociaż nie jest to tak elastyczne, jak implementacja brainScript, przyspieszenie czasu trenowania może być warte naruszenia (należy jednak pamiętać, że takie modele można wdrażać tylko na maszynach z procesorem GPU).

Sieci mogą być jednokierunkowe lub dwukierunkowe i mieć następujący rodzaj (recurrentOp parametr):

  • lstm: Pamięć krótkoterminowa (Hochreiter i Schmidhuber)
  • gru: Jednostka rekursyjna z bramą
  • rnnTanh: zwykła nazwa sieci RNN z nieliniowością tanh
  • rnnReLU: zwykła nazwa sieci RNN z prostą nieliniowością liniową

Wszystkie wagi są zawarte w pojedynczej macierzy, która powinna zawierać hiddenDims wiersze i tyle kolumn, ile jest potrzebnych do przechowywania wszystkich parametrów. Ponieważ może to być kłopotliwe do określenia, można automatycznie wywnioskować wymiar. Aby upewnić się, że inicjowanie losowe używa poprawnego wentylatora, określ :initOutputRank=-1

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

Jeśli używasz lstm operacji , zalecamy użycie tego elementu pierwotnego za pomocą RecurrentLSTMLayerStack{}elementu , który zajmie się tworzeniem wag.

Trenowanie na procesorze GPU, wdrażanie na procesorze CPU

Obecnie nie można wdrożyć sieci RNN wytrenowanego jako modułu OptimizedRNNStack() w systemach bez procesorów GPU. Uważamy, że istnieje możliwość wykonania akcji edytowania modelu po trenowaniu, która zastępuje OptimizedRNNStack() węzły za pomocą natywnych wyrażeń BrainScript zgodnych z procesorem CPU, które dokładnie emulują implementację sieci RNN5 CuDNN5.

Przykład

Model rozpoznawania mowy składający się z 3-ukrytej warstwy dwukierunkowej LSTM z wymiarem ukrytego stanu na warstwę i kierunek 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}