最適化された RNN スタック
1 つ以上の再発ネットワーク 層の最適化された CuDNN5 RNN スタックを実装します。
OptimizedRNNStack (weights, input,
hiddenDims, numLayers = 1,
bidirectional = false,
recurrentOp='lstm')
パラメーター
weights
: すべてのモデル パラメーターを 1 つのマトリックスとして含む 1 つの重み付け行列。 ディメンション推論を使用します。以下の説明を参照してください。input
: 1 つ以上の繰り返しネットワークのスタックを適用するデータ。 シーケンスである必要があり、スパースにすることはできません。hiddenDims
: 各レイヤーの非表示状態の次元と、双方向の場合は、2 方向のそれぞれnumLayers
(既定値: 1): レイヤーの数bidirectional
(既定値: false): true の場合、モデルは双方向ですrecurrentOp
(既定値:lstm
): RNN の種類を選択します。 使用できる値:lstm
, ,gru
rnnTanh
rnnReLU
説明
この関数は、1 つ以上の繰り返しネットワークのスタックの非常に効率的な実装である CuDNN5 RNN へのアクセスを提供します。 BrainScript の計算ネットワークとしての明示的な実装と比較して、5 の順序で高速化を観察しました。 BrainScript の実装ほど柔軟性はありませんが、トレーニング時間の高速化は妥協の価値がある可能性があります (ただし、そのようなモデルは GPU を搭載したマシンにのみデプロイできることに注意してください)。
ネットワークは、単一または双方向で、次の種類 (recurrentOp
パラメーター) にすることができます。
lstm
:短期記憶(ホーホライターとシュミドゥーバー)gru
: ゲート付きリカレントユニットrnnTanh
: 非線形性をtanh
持つプレーン RNNrnnReLU
: 修正された線形非線形性を持つプレーン RNN
すべての重みは、すべてのパラメーターを保持するために必要な数の行と列を持つ必要がある hiddenDims
1 つのマトリックスに含まれます。
これは判断するのが面倒な場合があるため、ディメンションを自動的に 推論 できます。
ランダム初期化で正しいファンインが使用されていることを確認するには、次のように指定 initOutputRank=-1
します。
W = ParameterTensor {(Inferred:Inferred), initOutputRank=-1}
この操作を使用する lstm
場合は、このプリミティブを RecurrentLSTMLayerStack{}
使用することをお勧めします。これにより、重みの作成が行われます。
GPU に関するトレーニング、CPU にデプロイする
現時点では、GPU を使用しないシステムでトレーニングされた OptimizedRNNStack()
RNN をデプロイすることはできません。
CuDNN5 RNN の実装を正確にエミュレートする CPU 互換のネイティブ BrainScript 式によってノードを置き換える OptimizedRNNStack()
、トレーニング後のモデル編集アクションを実行できると考えています。
例
レイヤーごとの非表示状態ディメンションと方向 512 の双方向 LSTM を持つ 3 非表示レイヤーで構成される音声認識モデル:
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}