【问题标题】:Interpreting attention in Keras Transformer official example解释 Keras Transformer 官方示例中的注意力
【发布时间】:2020-10-31 14:34:53
【问题描述】:

我已经按照(使用 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)

如果我这样做:

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

我可以检索一个大小为 maxlen xnum_heads 的矩阵。

我应该如何解释这些系数?

【问题讨论】:

    标签: tensorflow keras nlp attention-model


    【解决方案1】:

    编辑:如果您想使用注意力来解释分类输出

    据我所知,不可能完全解释 Transformer 在分类中的作用。 Transformer 所做的只是查看每个输入如何相互关联,而不是查看每个单词对标签的贡献。如果您希望找到可解释的模型,请尝试查看 LSTM attention 进行分类。

    好的,我已经阅读了您的代码,并在您致电 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()]
    )
    

    这是一个示例输出:

    【讨论】:

    • 感谢您的回答。如果我像示例中那样使用transformer block a layer进行文本分类,如何使用该矩阵解释单个单词对预测的贡献?
    • 据我所知,不可能完全解释Transformer在分类方面的作用。 Transformer 所做的只是查看每个输入如何相互关联,而不是查看每个单词对标签的贡献。如果您希望找到可解释的模型,请尝试查看 LSTM attention 进行分类。
    • 也许您可以将此评论添加到答案中?经过一些额外的阅读,我现在明白你的意思了
    猜你喜欢
    • 2022-07-02
    • 1970-01-01
    • 2022-12-15
    • 2022-06-14
    • 1970-01-01
    • 2020-08-29
    • 2018-07-15
    • 2018-03-02
    • 2021-04-18
    相关资源
    最近更新 更多