web-dev-qa-db-ja.com

Keras 1dたたみ込み層はどのようにWord埋め込みと連携しますか-テキスト分類問題? (フィルター、カーネルサイズ、およびすべてのハイパーパラメーター)

現在、Kerasを使用してテキスト分類ツールを開発しています。それは機能します(正常に機能し、最大98.7の検証精度が得られました)が、1D畳み込みレイヤーがテキストデータをどのように処理するかについて、頭を悩ますことはできません。

どのハイパーパラメータを使用すればよいですか?

次の文(入力データ)があります。

  • 文中の最大単語数:951(それ以下の場合-埋め込みが追加されます)
  • 語彙サイズ:〜32000
  • 文の量(トレーニング用):9800
  • embedding_vecor_length:32(Wordの埋め込みで各Wordが持つ関係の数)
  • batch_size:37(この質問には関係ありません)
  • ラベル(クラス)の数:4

これは非常に単純なモデルです(私はより複雑な構造を作成しましたが、奇妙なことに、LSTMを使用しなくてもうまくいきます)。

model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

私の主な質問は次のとおりです。Conv1Dレイヤーにはどのハイパーパラメーターを使用する必要がありますか?

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))

次の入力データがある場合:

  • 最大単語数:951
  • 単語埋め込みディメンション:32

それはfilters=32は最初の32ワードのみをスキャンし、残りを完全に破棄します(kernel_size=2)?また、フィルターを951(文中の単語の最大数)に設定する必要がありますか?

画像の例:

たとえば、これは入力データです: http://joxi.ru/krDGDBBiEByPJA

コンボリューションレイヤー(ストライド2)の最初のステップです: http://joxi.ru/Y2LB099C9dWkOr

それは2番目のステップです(ストライド2): http://joxi.ru/brRG699iJ3Ra1m

で、もし filters = 32、レイヤーは32回繰り返しますか?私は正しいですか?だから私は文の156番目の言葉を言うことはできません、したがってこの情報は失われますか?

1D-コンボリューションがシーケンスデータにどのように適用されるかを説明しようと思います。私は単語からなる文の例を使用しますが、明らかにテキストデータに固有ではなく、他のシーケンスデータや時系列と同じです。

m単語で構成される文があり、各単語はWord埋め込みを使用して表されているとします。

Input data

ここで、このデータにnのカーネルサイズを持つk異なるフィルターで構成される1Dコンボリューションレイヤーを適用します。そのためには、長さkのスライディングウィンドウがデータから抽出され、抽出された各ウィンドウに各フィルターが適用されます。これは何が起こるかを示す図です(ここでは、_k=3_と仮定し、簡単にするために各フィルターのバイアスパラメーターを削除しています)。

Filters

上の図からわかるように、各フィルターの応答は、長さkの抽出されたウィンドウでのドット積(つまり、要素ごとの乗算とすべての結果の合計)の結果と同等です(つまり、 i-番目から_(i+k-1)_-番目の単語)。さらに、各フィルターは、トレーニングサンプルの特徴の数(つまり、ワード埋め込み次元)と同じ数のチャネルを持っていることに注意してください(したがって、ドット積の実行が可能です)。基本的に、各フィルターは、トレーニングデータのlocalウィンドウで特定のパターンの特徴の存在を検出しています(たとえば、この中に特定の単語がいくつか存在するかどうか)ウィンドウかどうか)。すべてのフィルターが長さkのすべてのウィンドウに適用された後、畳み込みの結果である次のような出力が得られます。

filters response

ご覧のとおり、_m-k+1_および_padding='valid'_( _stride=1_ レイヤーのデフォルトの動作)を想定しているため、図には_Conv1D_ウィンドウがあります。ケラス)。 stride引数は、次のウィンドウを抽出するためにウィンドウをスライドさせる(つまりシフトする)必要がある量を決定します(たとえば、上記の例では、ストライド2は単語のウィンドウを抽出します:_(1,2,3), (3,4,5), (5,6,7), ..._代わりに)。 padding引数は、ウィンドウがトレーニングサンプル内の単語で完全に構成されるべきか、または最初と最後にパディングがあるべきかを決定します。このように、畳み込み応答は、トレーニングサンプルと同じ長さ(つまり、mであり、_m-k+1_ではない)になる場合があります(たとえば、上記の例では、_padding='same'_は単語のウィンドウを抽出します:_(PAD,1,2), (1,2,3), (2,3,4), ..., (m-2,m-1,m), (m-1,m, PAD)_)。

Kerasを使用して、私が言及したいくつかのことを確認できます。

_from keras import models
from keras import layers

n = 32  # number of filters
m = 20  # number of words in a sentence
k = 3   # kernel size of filters
emb_dim = 100  # embedding dimension

model = models.Sequential()
model.add(layers.Conv1D(n, k, input_shape=(m, emb_dim)))

model.summary()
_

モデルの要約:

__________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_2 (Conv1D)            (None, 18, 32)            9632      
=================================================================
Total params: 9,632
Trainable params: 9,632
Non-trainable params: 0
_________________________________________________________________
_

ご覧のように、畳み込み層の出力は_(m-k+1,n) = (18, 32)_の形状をしており、畳み込み層のパラメーター(つまり、フィルターの重み)の数はnum_filters * (kernel_size * n_features) + one_bias_per_filter = n * (k * emb_dim) + n = 32 * (3 * 100) + 32 = 9632に等しくなります。

12
today