Оптимизированный стек RNN
Реализует оптимизированный стек RNN CuDNN5 одного или нескольких повторяющихся уровней сети.
OptimizedRNNStack (weights, input,
hiddenDims, numLayers = 1,
bidirectional = false,
recurrentOp='lstm')
Параметры
weights
: одна матрица веса, содержащая все параметры модели в виде одной матрицы. Используйте определение измерения, cf. описание ниже.input
: данные для применения стека одной или нескольких повторяющихся сетей. Должна быть последовательностью и не должна быть разреженной.hiddenDims
: измерение скрытого состояния в каждом слое и, если двунаправленное, каждого из двух направлений.numLayers
(по умолчанию: 1): количество слоевbidirectional
(по умолчанию: false): если значение true, модель двунаправленнаrecurrentOp
(по умолчанию:lstm
): выберите тип RNN. Допустимые значения:lstm
,gru
,rnnTanh
rnnReLU
Описание
Эта функция предоставляет доступ к CuDNN5 RNN, высоко эффективной реализации стека одного или нескольких уровней повторяющихся сетей. Мы наблюдали ускорение в порядке 5 по сравнению с явной реализацией в качестве вычислительной сети в BrainScript. Хотя это не так гибко, как реализация BrainScript, ускорение обучения может стоить компромисса (обратите внимание, что такие модели можно развертывать только на компьютерах с GPU).
Сети могут быть однонаправленными или двунаправленными и иметь следующий вид (recurrentOp
параметр):
lstm
: долгосрочная память (Hochreiter и Schmidhuber)gru
: закрытый повторяющийся блок.rnnTanh
: обычныйtanh
RNN с нелинейной степеньюrnnReLU
: обычный RNN с исправленной линейной нелинейностью.
Все весовые коэффициенты содержатся в одной матрице, которая должна содержать hiddenDims
строки и столько столбцов, сколько необходимо для хранения всех параметров.
Так как это может быть громоздким для определения, вы можете автоматически вывести измерение.
Чтобы убедиться, что случайная инициализация использует правильный вентилятор, укажите initOutputRank=-1
:
W = ParameterTensor {(Inferred:Inferred), initOutputRank=-1}
Если вы используете lstm
операцию, мы рекомендуем использовать этот примитив, RecurrentLSTMLayerStack{}
который будет заботиться о создании весовых коэффициентов.
Обучение на GPU, развертывание на ЦП
В настоящее время невозможно развернуть RNN, обученную как в OptimizedRNNStack()
системах без GPU.
Мы считаем, что можно выполнить действие редактирования модели после обучения, которое заменяет OptimizedRNNStack()
узлы собственными выражениями BrainScript, совместимыми с ЦП, которые точно эмулируют реализацию CuDNN5 RNN.
Пример
Модель распознавания речи, состоящая из 3-скрытого слоя двунаправленного LSTM с измерением скрытого состояния на слой и направление 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}