Compartilhar via


Pilha RNN otimizada

Implementa a pilha de RNN CuDNN5 otimizada de uma ou mais camadas de rede recorrentes.

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

Parâmetros

  • weights: uma matriz de peso que contém todos os parâmetros de modelo como uma única matriz. Use a inferência de dimensão, cf. descrição abaixo.
  • input: dados para aplicar a pilha de uma ou mais redes recorrentes. Deve ser uma sequência e não deve ser esparsa.
  • hiddenDims: dimensão do estado oculto em cada camada e, se bidirecional, de cada uma das duas direções
  • numLayers (padrão: 1): número de camadas
  • bidirectional (padrão: false): se verdadeiro, o modelo será bidirecional
  • recurrentOp (padrão: lstm): selecione o tipo RNN. Valores permitidos: lstm, , gru, rnnTanhrnnReLU

Descrição

Essa função dá acesso ao CuDNN5 RNN, uma implementação altamente eficiente de uma pilha de uma ou mais camadas de redes recorrentes. Observamos acelerações na ordem 5, em comparação com uma implementação explícita como uma rede de computação no BrainScript. Embora não seja tão flexível quanto uma implementação do BrainScript, a aceleração do tempo de treinamento pode valer a pena o comprometimento (observe, no entanto, que esses modelos só podem ser implantados em computadores com uma GPU).

As redes podem ser uni ou bidirecionais e ser do seguinte tipo (recurrentOp parâmetro):

  • lstm: Memória de Longo Prazo (Hochreiter e Schmidhuber)
  • gru: unidade recorrente em portão
  • rnnTanh: RNN simples com uma tanh não linearidade
  • rnnReLU: RNN simples com uma não linearidade linear corrigida

Todos os pesos estão contidos em uma única matriz que deve ter hiddenDims linhas e quantas colunas forem necessárias para manter todos os parâmetros. Como isso pode ser complicado para determinar, você pode ter a dimensão inferida automaticamente. Para garantir que a inicialização aleatória use o ventilador correto, especifique initOutputRank=-1:

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

Se você usar a lstm operação, recomendamos usar esse primitivo por meio RecurrentLSTMLayerStack{}do qual cuidará da criação dos pesos.

Treinamento em GPU, implantação na CPU

Atualmente, não é possível implantar um RNN treinado como um OptimizedRNNStack() sistema on sem GPUs. Acreditamos que é possível executar uma ação de edição de modelo pós-treinamento que substitui os OptimizedRNNStack() nós por expressões BrainScript nativas compatíveis com CPU que emulam precisamente a implementação de RNN CuDNN5.

Exemplo

Modelo de reconhecimento de fala que consiste em uma camada 3 oculta um LSTM bidirecional com uma dimensão de estado oculto por camada e direção de 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}