4

このリカレント ニューラル ネットワークを実装しようとしています(これは Voice Activity Detector です)。

ん

これらの青い円は個々のニューロンであることに注意してください。多くのニューロンを表しているわけではありません。本当に小さなネットワークです。S の意味や一部のレイヤーが二次であるという事実など、いくつかの追加の詳細がありますが、この質問には関係ありません。

次のように Microsoft のCNTKを使用して実装しました(テストされていません!)。

# For the layers with diagonal connections.
QuadraticWithDiagonal(X, Xdim, Ydim)
{
    OldX = PastValue(Xdim, 1, X)
    OldY = PastValue(Ydim, 1, Y)

    Wqaa = LearnableParameter(Ydim, Xdim)
    Wqbb = LearnableParameter(Ydim, Xdim)
    Wqab = LearnableParameter(Ydim, Xdim)
    Wla = LearnableParameter(Ydim, Xdim)
    Wlb = LearnableParameter(Ydim, Xdim)
    Wlc = LearnableParameter(Ydim, Xdim)
    Wb = LearnableParameter(Ydim)

    XSquared = ElementTimes(X, X)
    OldXSquared = ElementTimes(OldX, OldX)
    CrossXSquared = ElementTimes(X, OldX)

    T1 = Times(Wqaa, XSquared)
    T2 = Times(Wqbb, OldXSquared)
    T3 = Times(Wqab, CrossXSquared)

    T4 = Times(Wla, X)
    T5 = Times(Wlb, OldX)
    T6 = Times(Wlc, OldY)

    Y = Plus(T1, T2, T3, T4, T5, T6, Wb)
}


# For the layers without diagonal connections.
QuadraticWithoutDiagonal(X, Xdim, Ydim)
{
    OldY = PastValue(Ydim, 1, Y)

    Wqaa = LearnableParameter(Ydim, Xdim)
    Wla = LearnableParameter(Ydim, Xdim)
    Wlc = LearnableParameter(Ydim, Xdim)
    Wb = LearnableParameter(Ydim)

    XSquared = ElementTimes(X, X)

    T1 = Times(Wqaa, XSquared)  
    T4 = Times(Wla, X)
    T6 = Times(Wlc, OldY)

    Y = Plus(T1, T4, T6, Wb)
}


# The actual network.

# 13x1 input PLP.
I = InputValue(13, 1, tag="feature")
# Hidden layers
H0 = QuadraticWithDiagonal(I, 13, 3)
H1 = QuadraticWithDiagonal(H0, 3, 3)
# 1x1 Pre-output
P = Tanh(QuadraticWithoutDiagonal(H1, 3, 1))
# 5x1 Delay taps
D = QuadraticWithoutDiagonal(P, 1, 5)
# 1x1 Output
O = Tanh(QuadraticWithoutDiagonal(D, 5, 1))

このPastValue()関数は、前の時間ステップからレイヤーの値を取得します。これにより、このような珍しい RNN の実装が非常に簡単になります

残念ながら、CNTK の Network Description Language は非常に優れていますが、データ入力、トレーニング、および評価の手順をスクリプト化できないという事実はかなり制限的です。そのため、Torch または Tensorflow で同じネットワークを実装することを検討しています。

残念ながら、両方のドキュメントを読んだことがありますが、繰り返し接続を実装する方法がわかりません。どちらのライブラリも、RNN を非反復層であるかのようにスタックする LSTM ブラック ボックスと同一視しているようです。に相当するものはないようでPastValue()、事前に作成された LSTM レイヤーを使用するだけではないすべての例は完全に不透明です。

Torch または Tensorflow (または両方!) でこのようなネットワークを実装する方法を誰か教えてもらえますか?

4

1 に答える 1