Partilhar via


Pilha de 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 contendo todos os parâmetros modelo como uma única matriz. Use inferência de dimensão, descrição abaixo.
  • input: dados para aplicar a pilha de uma ou mais redes recorrentes para. Deve ser uma sequência, e não deve ser escassa.
  • hiddenDims: dimensão do estado oculto em cada camada e, se bidirecional, de cada uma das duas direções
  • numLayers (predefinição: 1): número de camadas
  • bidirectional(padrão: falso): se for verdade, o modelo é bidirecional
  • recurrentOp (predefinição: lstm): selecionar o tipo RNN. Valores permitidos: lstm, gru, rnnTanhrnnReLU

Description

Esta função dá acesso ao CuDNN5 RNN, uma implementação altamente eficiente de uma pilha de uma ou mais camadas de redes recorrentes. Observámos acelerações na ordem de 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 como uma implementação BrainScript, a aceleração do tempo de treino pode valer o compromisso (note-se, no entanto, que tais modelos só podem ser implantados em máquinas 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 Fechada
  • rnnTanh: RNN simples com uma tanh não-linearidade
  • rnnReLU: RNN simples com uma não linear não linear retificada

Todos os pesos estão contidos numa única matriz que deve ter hiddenDims linhas e quantas colunas forem necessárias para manter todos os parâmetros. Uma vez que isto pode ser complicado para determinar, você pode ter a dimensão inferida automaticamente. Para se certificar de que a inicialização aleatória utiliza o ventilador correto, especifique initOutputRank=-1:

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

Se utilizar a lstm operação, recomendamos que utilize este primitivo através de RecurrentLSTMLayerStack{}, que cuidará da criação dos pesos.

Formação em GPU, implantação no CPU

Atualmente, não é possível implantar um RNN treinado como um OptimizedRNNStack() sistema em sistemas sem GPUs. Acreditamos que é possível realizar uma ação de edição de modelo pós-treino que substitua os OptimizedRNNStack() nós por expressões brainScript nativas compatíveis com CPU que imitam precisamente a implementação do RNN CuDNN5.

Exemplo

Reconhecimento de modelo que consiste numa camada de 3 escondidas 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}