Как мы могли бы использовать внимание Богданова в многоуровневой модели LSTM?

#keras #lstm #attention-model

Вопрос:

Я стремлюсь использовать внимание в многоуровневой модели LSTM, но я не знаю, как добавить дополнительный механизм внимания Keras между слоями кодера и декодера. Допустим, у нас есть входной слой, кодер, декодер и плотный слой классификации, и мы стремимся, чтобы наш декодер обращал внимание на все скрытые состояния кодера (h = [h1, …, hT]) при выводе его выходов. Существует ли какое-либо высокоуровневое кодирование с использованием Keras, которое я могу выполнить? Например,

 input_layer = Input(shape=(T, f))
x = input_layer  
x = LSTM(num_neurons1, return_sequences=True)(x)
# Adding attention here, but I don't know how?
x = LSTM(num_neurons2)(x)
output_layer = Dense(1, 'sigmoid')(x)
model = Model(input_layer, output_layer)
...
 

Я думаю, что это неправильно использовать: x = дополнительное внимание(x, x). Я прав?

Ответ №1:

Может быть, это полезно для вашей проблемы ?

Это модель классификации с LSTM и вниманием к классификации на уровне персонажей:

сначала создайте пользовательский слой для attention : класс attention(слой): def init(self,**kwargs): супер(внимание,сам).инициализация(**квт)

 def build(self,input_shape):
    self.W=self.add_weight(name='attention_weight', shape=(input_shape[-1],1), 
                           initializer='random_normal', trainable=True)
    self.b=self.add_weight(name='attention_bias', shape=(input_shape[1],1), 
                           initializer='zeros', trainable=True)        
    super(attention, self).build(input_shape)

def call(self,x):
    # Alignment scores. Pass them through tanh function
    e = K.tanh(K.dot(x,self.W) self.b)
    # Remove dimension of size 1
    e = K.squeeze(e, axis=-1)   
    # Compute the weights
    alpha = K.softmax(e)
    # Reshape to tensorFlow format
    alpha = K.expand_dims(alpha, axis=-1)
    # Compute the context vector
    context = x * alpha
    context = K.sum(context, axis=1)
    return context
 

LEN_CHA = 64 # количество символов
LEN_Input = 110 # зависит от самого длинного предложения, дополненного нулем

 def LSTM_model_attention(Labels=3):
model = Sequential()
model.add(Embedding(LEN_CHA, EMBEDDING_DIM, input_length=LEN_INPUT))
model.add(SpatialDropout1D(0.7))
model.add(Bidirectional(LSTM(256, return_sequences=True)))
model.add(attention())
model.add(Dense(Labels, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
return model
 

LSTM_attention = LSTM_model_attention()
lstm_внимание.резюме()