Интерпретация внимания в официальном примере Keras Transformer

Я реализовал модель, как описано в (Классификация текста с помощью Transformer) https://keras.io/examples/nlp/text_classification_with_transformer/

Я хотел бы получить доступ к значениям внимания для конкретного примера.

Насколько я понимаю, внимание рассчитывается примерно в этом месте:

class TransformerBlock(layers.Layer):
    [...]

def call(self, inputs, training):
    attn_output = self.att(inputs)
    attn_output = self.dropout1(attn_output, training=training)
    out1 = self.layernorm1(inputs + attn_output)
    ffn_output = self.ffn(out1)
    ffn_output = self.dropout2(ffn_output, training=training)
    return self.layernorm2(out1 + ffn_output)

[...]

embed_dim = 32  # Embedding size for each token

num_heads = 2  # Number of attention heads
ff_dim = 32  # Hidden layer size in feed forward network inside transformer

inputs = layers.Input(shape=(maxlen,))
embedding_layer = TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim)
x = embedding_layer(inputs)
transformer_block = TransformerBlock(embed_dim, num_heads, ff_dim)
x = transformer_block(x)
x = layers.GlobalAveragePooling1D()(x)
x = layers.Dropout(0.1)(x)
x = layers.Dense(20, activation="relu")(x)
x = layers.Dropout(0.1)(x)
outputs = layers.Dense(2, activation="softmax")(x)

If I do:

A=(model.layers[2].att(model.layers[1](model.layers[0]((X_train[0,:])))))

Я могу получить матрицу размером maxlen xnum_heads.

Как мне интерпретировать эти коэффициенты?


person 00__00__00    schedule 31.10.2020    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: если вы хотите интерпретировать результаты классификации, обращая внимание

Насколько я знаю, невозможно полностью интерпретировать то, что Transformer делает в классификации. Что делает Transformer, так это просто видеть, как каждый вход связан друг с другом, а не то, как каждое слово влияет на метку. Если вы хотите найти модель, которую можно интерпретировать, попробуйте взглянуть на LSTM для классификации.

Хорошо, я прочитал ваш код и заметил несколько ошибок, когда вы звонили model.layers[1]. Во-первых, вам нужно понять, что модель обрабатывает данные в пакетном режиме. Следовательно, ваш ввод должен быть в формате (batch_size, seq_len). Однако ваша входная форма, кажется, отбрасывает первое измерение (которое является пакетным), что заставляет вашу модель думать, что вы даете модели 200 предложений с длиной последовательности 1. Следовательно, выходная форма выглядит странно, как видно на изображении.

Демонстрация кода

Правильный метод - добавить дополнительное измерение к первому измерению (используя tf.expand_dims).

Теперь для интерпретации результатов. Вы должны знать, что блок Transformer выполняет самовнимание (которое находит оценки каждого слова по отношению к другим словам в предложениях) и взвешенно суммирует их. Таким образом, результат будет таким же, как и у слоя внедрения, и вы не сможете его объяснить (поскольку это скрытый вектор, генерируемый сетью).

Однако вы можете увидеть оценки внимания для каждой головы, используя следующие коды:

import seaborn as sns
import matplotlib.pyplot as plt

head_num=1
inp = tf.expand_dims(x_train[0,:], axis=0)
emb = model.layers[1](model.layers[0]((inp)))

self_attn = model.layers[2].att
# compute Q, K, V
query = self_attn.query_dense(emb)
key = self_attn.key_dense(emb)
value = self_attn.value_dense(emb)
# separate heads
query = self_attn.separate_heads(query, 1) # batch_size = 1
key = self_attn.separate_heads(key, 1) # batch_size = 1
value = self_attn.separate_heads(value, 1) # batch_size = 1
# compute attention scores (QK^T)
attention, weights = self_attn.attention(query, key, value)

idx_word = {v: k for k, v in keras.datasets.imdb.get_word_index().items()}
plt.figure(figsize=(30, 30))
sns.heatmap(
    weights.numpy()[0][head_num], 
    xticklabels=[idx_word[idx] for idx in inp[0].numpy()],
    yticklabels=[idx_word[idx] for idx in inp[0].numpy()]
)

Вот пример вывода:  AttentionScore

person Chompakorn CChaichot    schedule 31.10.2020
comment
спасибо за хороший ответ. Если я использую преобразователь, блокирующий слой для классификации текста, как в примере, как я могу объяснить вклад отдельных слов в прогноз, используя эту матрицу? - person 00__00__00; 01.11.2020
comment
Насколько я знаю, невозможно полностью интерпретировать то, что Transformer делает в классификации. Что делает Transformer, так это просто видеть, как каждый вход связан друг с другом, а не то, как каждое слово влияет на метку. Если вы хотите найти модель, которую можно интерпретировать, попробуйте взглянуть на LSTM для классификации. - person Chompakorn CChaichot; 01.11.2020
comment
Может быть, вы могли бы добавить этот комментарий к ответу? После некоторого дополнительного чтения я понимаю, что вы имеете в виду сейчас - person 00__00__00; 01.11.2020