Kerasにおける再発層への視覚ガイド


Kerasは自然言語処理のためのRNN、GRU、LSTMのような再帰層のための強力な抽象化を提供する.私が最初にドキュメンテーションからそれらについて学習を開始したとき、私は明確に入力データ形を準備する方法を理解することができませんでした.
実験を通して学んだことがあるので、APIの理解を共有したいと思いました.

単一出力


KerasでRNNレイヤーを使用している全体文の意味をコード化する簡単な例を取りましょう.

マーベルスタジオ
テキストセンター
RNNでこの文を使用するには、まず数値形式に変換する必要があります.我々はいずれかのホットエンコーディング、事前に訓練された単語のベクトルを使用するか、単語の埋め込みをゼロから学ぶことができます.簡単にするために、2つの数字に各単語を変換するためにいくつかの単語の埋め込みを使用したと仮定します.

さて、RNNにこれらの単語を渡すために、私たちはそれぞれの単語をタイムステップとして扱います.これらを通すために、RNN層を造りましょう
model = Sequential()
model.add(SimpleRNN(4, input_shape=(3, 2)))

上で述べたように、様々なパラメータがどのように意味するのか、なぜ設定されたのかを示します.

  • InputCount - shape = ( 3 , 2 )
  • 私たちは3つの単語を持っています.したがって、時間ステップ数は3である.RNNブロックは3回繰り広げられるので、図の3ブロックを見ます.
  • それぞれの単語について、我々は、ネットワークにSize 2の埋め込みを伝えます.

  • SimpleErnn ( 4 ,...) :
  • これは、隠された層に4つのユニットがあることを意味します.
  • そこで、図では、RNNブロックの間にサイズ4の隠れた状態がどのように通過されるかを見る
  • 最初のブロックでは、前の出力がないので、前の隠し状態は[ 0 , 0 , 0 , 0 ]に設定されます
  • このように、全体の文のために、図に示すようにRNN層から出力としてサイズ4のベクトルを得ます.
    import tensorflow as tf
    from tensorflow.keras.layers import SimpleRNN
    
    x = tf.random.normal((1, 3, 2))
    
    layer = SimpleRNN(4, input_shape=(3, 2))
    output = layer(x)
    
    print(output.shape)
    # (1, 4)
    
    見られるように、入力データのランダムなバッチは、3つの語を有する1つの文および各々の語がサイズ2の包埋を有することを有することをつくる.LSTMレイヤーを通過した後に、我々はその1つの文のためにサイズ4の後ろの表現を得ます.
    これは、濃淡層と組み合わせて、感情分析やテキスト分類などのアーキテクチャを構築することができます.
    model = Sequential()
    model.add(SimpleRNN(4, input_shape=(3, 2)))
    model.add(Dense(1))
    

    複数出力


    ケラスはreturn_sequences RNNセルからの出力を制御するパラメータです.我々がそれをセットするならばTrue , それが意味することは、各々の展開されたRNNセルからの出力が最後のセルだけの代わりに返されるということです.
    model = Sequential()
    model.add(SimpleRNN(4, input_shape=(3, 2), 
                        return_sequences=True))
    

    上で見られるように、我々は文の各々の語のためにSize 4の出力ベクトルを得ます.
    これは、以下のコードによって検証され、1つの文を3語で送信し、それぞれの単語に対してサイズ2の埋め込みを行うことができます.見られるように、層は各々の語のためにサイズ4のベクトルで3つの出力を我々に与えます.
    import tensorflow as tf
    from tensorflow.keras.layers import SimpleRNN
    
    x = tf.random.normal((1, 3, 2))
    
    layer = SimpleRNN(4, input_shape=(3, 2), return_sequences=True)
    output = layer(x)
    
    print(output.shape)
    # (1, 3, 4)
    

    TimediScalted層


    テキスト内のエンティティを認識したいとします.たとえば、私たちのテキスト“私はgroot”、我々は名前として“groot”を識別したい.

    前のセクションの文の各単語の出力の仕方を見たことがあります.rnnセルから出力ベクトルに分類を適用する方法が必要である.テキスト分類などの簡単な場合については、どのように我々はDense() レイヤーウィズsoftmax 最後のレイヤーとしてのアクティベーション.
    同様に、nnn層から複数の出力にdense ()層を適用することもできます.これは、各出力に濃密層を適用し、クラスの確率スコアをエンティティに与える.
    model = Sequential()
    model.add(SimpleRNN(4, input_shape=(3, 2), 
                        return_sequences=True))
    model.add(TimeDistributed(Dense(4, activation='softmax')))
    

    見られるように、我々は3語文を取って、濃い層を使っている4つのクラスに各々の語のためにRNNの出力を分類します.これらのクラスは、名前、人、場所などのような実体でありえます.

    積層層


    また、Kerasでは複数の再帰層を次々と積み重ねてもよい.
    model = Sequential()
    model.add(SimpleRNN(4, input_shape=(3, 2), return_sequences=True))
    model.add(SimpleRNN(4))
    
    コードの動作を次の図で理解できます.

    Insight :なぜ、我々は通常、最後を除くすべての層に対してReturnNumberシーケンスをtrueに設定しますか?


    第2の層が第1の層から入力を必要とするので、第1のsimplernnレイヤーのためのreturnountシーケンス= trueをセットした.番目の層については、テキストの分類を行う場合は通常falseに設定します.OutタスクがNER予測であれば、最終層でもtrueに設定できます.

    参考文献

  • Recurrent Layers - Keras Documentation
  • 接続


    あなたがこのブログ記事を楽しんだならば、私が毎週新しいブログ記事を共有するところで、私と連絡をとってください.