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çõesnumLayers
(predefinição: 1): número de camadasbidirectional
(padrão: falso): se for verdade, o modelo é bidirecionalrecurrentOp
(predefinição:lstm
): selecionar o tipo RNN. Valores permitidos:lstm
,gru
,rnnTanh
rnnReLU
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 FechadarnnTanh
: RNN simples com umatanh
não-linearidadernnReLU
: 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}