web-dev-qa-db-ja.com

SpatialDropout1Dを理解する方法と使用するタイミング

時折、一部のモデルがSpatialDropout1Dの代わりにDropout。たとえば、品詞タグ付けニューラルネットワークでは、以下を使用します。

model = Sequential()
model.add(Embedding(s_vocabsize, EMBED_SIZE,
                    input_length=MAX_SEQLEN))
model.add(SpatialDropout1D(0.2)) ##This
model.add(GRU(HIDDEN_SIZE, dropout=0.2, recurrent_dropout=0.2))
model.add(RepeatVector(MAX_SEQLEN))
model.add(GRU(HIDDEN_SIZE, return_sequences=True))
model.add(TimeDistributed(Dense(t_vocabsize)))
model.add(Activation("softmax"))

Kerasのドキュメントによると、次のように書かれています。

このバージョンはDropoutと同じ機能を実行しますが、個々の要素ではなく1Dフィーチャマップ全体をドロップします。

ただし、1Dフィーチャのエントリの意味を理解できません。具体的には、SpatialDropout1Dquora で説明した同じモデル内。 Quoraと同じモデルを使用して、誰かがこの概念を説明できますか?

また、どのような状況でSpatialDropout1Dの代わりにDropout

23
Raven Cheuk

ノイズ形状

_SpatialDropout1D_を理解するには、ノイズシェイプの概念に慣れる必要があります。プレーンバニラドロップアウトでは、各要素は個別に保持またはドロップされます。たとえば、テンソルが_[2, 2, 2]_の場合、ランダムなコインフリップ(特定の「ヘッド」確率)に応じて、8つの要素のそれぞれをゼロにすることができます。合計で、8つの独立したコインフリップがあり、_0_から_8_までの任意の数の値がゼロになる場合があります。

時にはそれ以上のことをする必要があります。たとえば、whole sliceを_0_軸に沿ってドロップする必要があるかもしれません。この場合の_noise_shape_は_[1, 2, 2]_であり、ドロップアウトには4つの独立したランダムコインフリップのみが含まれます。最初のコンポーネントは一緒に保持されるか、一緒にドロップされます。ゼロ要素の数は、_0_、_2_、_4_、_6_、または_8_です。 _1_または_5_にはできません。

これを表示する別の方法は、入力テンソルが実際には_[2, 2]_であるが、各値が倍精度(または多精度)であると想像することです。レイヤーは、途中でバイトをドロップする代わりに、マルチバイト値全体をドロップします。

なぜ便利なのですか?

上記の例は説明のためだけのものであり、実際のアプリケーションでは一般的ではありません。より現実的な例は次のとおりです:shape(x) = [k, l, m, n] and _noise_shape = [k, 1, 1, n]_。この場合、各バッチとチャネルコンポーネントは独立して保持されますが、各行と列は一緒に保持されるか、保持されません。つまり、whole_[l, m]_feature mapは保持または削除されます。

これは、特に初期畳み込み層で、隣接するピクセルの相関を考慮するために行うことができます。効果的には、ピクセルがフィーチャマップ全体で隣接ピクセルと共適応するのを防ぎ、他のフィーチャマップが存在しないかのように学習させる必要があります。これはまさに_SpatialDropout2D_が行っていることです。機能マップ間の独立性を促進します。

_SpatialDropout1D_は非常によく似ています:shape(x) = [k, l, m]を指定すると、_noise_shape = [k, 1, m]_を使用し、1次元の機能マップ全体をドロップします。

参照: Convolutional Networksを使用した効率的なオブジェクトのローカリゼーション Jonathan Tompson at al。

15
Maxim

簡単にするために、まず、いわゆる機能マップ(1D、2Dなど)が通常のチャネルであることに注意してください。例を見てみましょう:

  1. Dropout():2D入力を定義してみましょう:[[1、1、1]、[2、2、2]]。ドロップアウトはすべての要素を独立して考慮し、[[1、0、1]、[0、2、2]]のようなものになる可能性があります

  2. SpatialDropout1D():この場合、結果は[[1、0、1]、[2、0、2]]のようになります。 2番目の要素がallチャネルに沿ってゼロになっていることに注意してください。

10
Dilshat