LSTM с вниманием, получающим веса ?? Классификация документов на основе встраивания предложений

Я действительно застрял в создании NN для классификации текста с keras, используя lstm и добавляя attention_layer сверху. Я уверен, что довольно близко, но я запутался:

  • Нужно ли мне добавлять TimeDistributed плотный слой после LSTM?

  • И как мне получить веса внимания из моей сети (для целей визуализации)? - чтобы я знал, какое предложение было «ответственным» за то, что документ был классифицирован как хороший или плохо?

Скажем, у меня есть 10 документов, состоящих из 100 предложений, и каждое предложение представлено как вектор из 500 элементов. Итак, моя матрица документов, содержащая последовательности предложений, выглядит так: X = np.array(Matrix).reshape(10, 100, 500)

Документы следует классифицировать по оценке 1 = хорошо; 0 = плохо - так

y= [1,0,0,1,1]
yy= np.array(y)

Мне не нужен слой встраивания, потому что каждое предложение каждого документа уже является разреженным вектором.

Слой внимания взят из: https://github.com/richliao/textClassifier/blob/master/textClassifierHATT.py

MAX_SENTS = 100
MAX_SENT_LENGTH = 500

review_input = Input(shape=(MAX_SENTS, MAX_SENT_LENGTH))
l_lstm_sent = LSTM(100, activation='tanh', return_sequences=True)(review_input)
l_att_sent = AttLayer(100)(l_lstm_sent)
preds = Dense(1, activation='softmax')(l_att_sent)
model = Model(review_input, preds)

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])
model.fit(X, yy, nb_epoch=10, batch_size=50)

Итак, я думаю, что моя модель должна быть настроена правильно, но я не совсем уверен ... Но как мне получить из этого веса внимания (например, чтобы я знал, какое предложение вызвало классификацию как 1)? Помощь очень ценится


person Felix    schedule 11.01.2020    source источник
comment
Это просто другая модель после model=Model(review_input, preds)? Типа: attmodel = Model(review_input, outputs=[preds, l_att_sent]), а затем установка model на работающий predictions, att_weights = attmodel.predict(X)?   -  person Felix    schedule 12.01.2020


Ответы (1)


1. Распределенное время

В этом случае вам не нужно заключать Dense в TimeDistributed, хотя это может быть немного быстрее, если вы это сделаете, особенно если вы можете предоставить маску, которая маскирует большую часть вывода LSTM.

Однако Dense работает в последнем измерении независимо от формы перед последним измерением.

2. Вес внимания

Да, это так, как вы предлагаете в комментарии. Вам необходимо изменить AttLayer, который может возвращать как свой вывод, так и веса внимания.

return output, ait

А затем создайте модель, которая содержит тензоры веса прогнозов и внимания, и получите для них прогнозы:

l_att_sent, l_att_sent = AttLayer(100)(l_lstm_sent)
...
predictions, att_weights = attmodel.predict(X)
person Jindřich    schedule 13.01.2020