Поделиться через


Оптимизированный стек 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, rnnTanhrnnReLU

Описание

Эта функция предоставляет доступ к 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}