webentwicklung-frage-antwort-db.com.de

Wie füge ich einen Aufmerksamkeitsmechanismus in Keras hinzu?

Ich verwende derzeit diesen Code, den ich von einer Diskussion über github .__ bekomme. Hier ist der Code des Aufmerksamkeitsmechanismus:

_input = Input(shape=[max_length], dtype='int32')

# get the embedding layer
embedded = Embedding(
        input_dim=vocab_size,
        output_dim=embedding_size,
        input_length=max_length,
        trainable=False,
        mask_zero=False
    )(_input)

activations = LSTM(units, return_sequences=True)(embedded)

# compute importance for each step
attention = Dense(1, activation='tanh')(activations)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)


sent_representation = merge([activations, attention], mode='mul')
sent_representation = Lambda(lambda xin: K.sum(xin, axis=-2), output_shape=(units,))(sent_representation)

probabilities = Dense(3, activation='softmax')(sent_representation)

Ist dies der richtige Weg? Ich hatte irgendwie erwartet, dass es eine zeitverteilte Schicht gibt, da der Aufmerksamkeitsmechanismus in jedem Zeitschritt des RNN verteilt wird. Ich brauche jemanden, der bestätigt, dass diese Implementierung (der Code) eine korrekte Implementierung des Aufmerksamkeitsmechanismus ist. Vielen Dank.

10

Wenn Sie eine Aufmerksamkeit in der Zeitdimension haben möchten, scheint mir dieser Teil Ihres Codes richtig zu sein:

activations = LSTM(units, return_sequences=True)(embedded)

# compute importance for each step
attention = Dense(1, activation='tanh')(activations)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)

sent_representation = merge([activations, attention], mode='mul')

Sie haben den Aufmerksamkeitsvektor der Form (batch_size, max_length) erarbeitet:

attention = Activation('softmax')(attention)

Ich habe diesen Code noch nie zuvor gesehen, daher kann ich nicht sagen, ob dieser Code richtig ist oder nicht:

K.sum(xin, axis=-2)

Weitere Lektüre (vielleicht haben Sie einen Blick):

10
Philippe Remy

Kürzlich habe ich mit dem Anwenden von Aufmerksamkeitsmechanismen auf eine dichte Ebene gearbeitet. Hier ist eine Beispielimplementierung:

def baseline_model():
  input_dims = train_data_X.shape[1]
  inputs = Input(shape=(input_dims,))
  dense1800 = Dense(1800, activation='relu', kernel_regularizer=regularizers.l2(0.01))(inputs)
  attention_probs = Dense( 1800, activation='sigmoid', name='attention_probs')(dense1800)
  attention_mul = multiply([ dense1800, attention_probs], name='attention_mul')
  dense7 = Dense(7, kernel_regularizer=regularizers.l2(0.01), activation='softmax')(attention_mul)   
  model = Model(input=[inputs], output=dense7)
  model.compile(optimizer='adam',
                loss='categorical_crossentropy',
                metrics=['accuracy'])
  return model

print (model.summary)

model.fit( train_data_X, train_data_Y_, epochs=20, validation_split=0.2, batch_size=600, shuffle=True, verbose=1)

enter image description here

1

Der Aufmerksamkeitsmechanismus lenkt die Aufmerksamkeit auf verschiedene Teile des Satzes:

activations = LSTM(units, return_sequences=True)(embedded)

Und es bestimmt den Beitrag jedes verborgenen Zustands dieses Satzes durch

  1. Berechnung der Aggregation jedes versteckten Zustands attention = Dense(1, activation='tanh')(activations)
  2. Gewichte verschiedenen Zuständen zuweisen attention = Activation('softmax')(attention)

Und schließlich auf verschiedene Zustände achten:

sent_representation = merge([activations, attention], mode='mul')

Ich verstehe diesen Teil nicht ganz: sent_representation = Lambda(lambda xin: K.sum(xin, axis=-2), output_shape=(units,))(sent_representation)

Um mehr zu verstehen, können Sie sich auf this und this beziehen, und auch dieses one liefert eine gute Implementierung besitzen.

1
MJeremy