Pila de RNN optimizada
Implementa la pila cuDNN5 RNN optimizada de una o varias capas de red recurrentes.
OptimizedRNNStack (weights, input,
hiddenDims, numLayers = 1,
bidirectional = false,
recurrentOp='lstm')
Parámetros
weights
: una matriz de peso que contiene todos los parámetros del modelo como una sola matriz. Use la inferencia de dimensiones, cf. descripción a continuación.input
: datos a los que se va a aplicar la pila de una o varias redes recurrentes. Debe ser una secuencia y no debe ser dispersa.hiddenDims
: dimensión del estado oculto en cada capa y, si es bidireccional, de cada una de las dos direccionesnumLayers
(valor predeterminado: 1): número de capasbidirectional
(valor predeterminado: false): si es true, el modelo es bidireccionalrecurrentOp
(valor predeterminado:lstm
): seleccione el tipo RNN. Valores permitidos:lstm
,gru
,rnnTanh
,rnnReLU
Descripción
Esta función proporciona acceso al RNN5 cuDN5, una implementación muy eficaz de una pila de una o varias capas de redes recurrentes. Hemos observado velocidades en el orden de 5, en comparación con una implementación explícita como una red de cálculo en BrainScript. Aunque no es tan flexible como una implementación de BrainScript, la velocidad del tiempo de entrenamiento puede merecer la pena poner en peligro (tenga en cuenta, sin embargo, que estos modelos solo se pueden implementar en máquinas con una GPU).
Las redes pueden ser unidireccionales o bidireccionales, y ser del siguiente tipo (recurrentOp
parámetro):
lstm
: memoria a corto plazo (Hochreiter y Schmidhuber)gru
: Unidad recurrente cerradarnnTanh
: RNN sin formato con unatanh
no linealidadrnnReLU
: RNN sin formato con una no lineal rectificada
Todos los pesos están contenidos en una sola matriz que debe tener hiddenDims
filas y tantas columnas como sea necesario para contener todos los parámetros.
Dado que esto puede ser complicado de determinar, puede tener la dimensión inferida automáticamente.
Para asegurarse de que la inicialización aleatoria usa el ventilador correcto, especifique initOutputRank=-1
:
W = ParameterTensor {(Inferred:Inferred), initOutputRank=-1}
Si usa la lstm
operación, se recomienda usar este primitivo a través RecurrentLSTMLayerStack{}
de , que se encargará de crear los pesos.
Entrenamiento en GPU, implementación en CPU
Actualmente, no es posible implementar un RNN entrenado como en OptimizedRNNStack()
sistemas sin GPU.
Creemos que es posible realizar una acción posterior a la edición de modelos de entrenamiento que reemplace los OptimizedRNNStack()
nodos por expresiones brainScript nativas compatibles con CPU que emulen precisamente la implementación de RNN5 de CuDN5.
Ejemplo
Modelo de reconocimiento de voz que consta de una capa 3 oculta un LSTM bidireccional con una dimensión de estado oculto por capa y dirección 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}