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çõesnumLayers
(padrão: 1): número de camadasbidirectional
(padrão: false): se verdadeiro, o modelo será bidirecionalrecurrentOp
(padrão:lstm
): selecione o tipo RNN. Valores permitidos:lstm
, ,gru
,rnnTanh
rnnReLU
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ãornnTanh
: RNN simples com umatanh
não linearidadernnReLU
: 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}