MultiHeadAttention attention_mask [Keras, Tensorflow] 示例

问题描述

我正在努力掩盖我对 MultiHeadAttention 层的输入。我正在使用 Keras 文档中的 Transformer Block 进行自我注意。到目前为止,我在网上找不到任何示例代码,如果有人能给我一个代码片段,我将不胜感激。

来自this页面的转换器块:

class TransformerBlock(layers.Layer):
    def __init__(self,embed_dim,num_heads,ff_dim,rate=0.1):
        super(TransformerBlock,self).__init__()
        self.att = layers.MultiHeadAttention(num_heads=num_heads,key_dim=embed_dim)
        self.ffn = keras.Sequential(
            [layers.Dense(ff_dim,activation="relu"),layers.Dense(embed_dim),]
        )
        self.layernorm1 = layers.Layernormalization(epsilon=1e-6)
        self.layernorm2 = layers.Layernormalization(epsilon=1e-6)
        self.dropout1 = layers.Dropout(rate)
        self.dropout2 = layers.Dropout(rate)

    def call(self,inputs,training):
        attn_output = self.att(inputs,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)

屏蔽文档可以在 this 链接下找到:

attention_mask:形状为 [B,T,S] 的布尔掩码,可防止 注意某些位置。布尔掩码指定哪个查询 元素可以关注哪些关键元素,1表示关注,0表示关注 表示没有注意。可以为丢失的批次进行广播 尺寸和头部尺寸。

唯一可以运行的是在图层类之外创建的蒙版作为 numpy 数组:

mask = np.ones((observations,sequence_length,sequence_length))
mask[X[:observations,:,0]==0]=0

然后在调用层时输入,转换器块中唯一的变化是:

def call(self,mask,training):
    attn_output = self.att(inputs,attention_mask=mask)

然而,这当然在拟合时给定 batch_size 时不起作用,并且仅对我的记忆进行 5 次观察有效,因此它没有任何意义。 除此之外,我认为这并没有正确屏蔽输入 - 一般来说,考虑到 attention_mask 的形状(观察、序列长度、序列长度),我对如何屏蔽很困惑。我的输入的形状是(观察、序列长度、特征)。这个输入被零填充,然而,当涉及到变压器块时,它已经通过了一个嵌入层和 CNN。 我尝试了各种方法来编写一个函数,该函数在使用不同的 Tensor 或 Keras 对象进行训练时创建掩码。但是我每次都遇到错误

我希望更熟悉 Tensorflow/Keras 的人能够提供一个例子。 或者有人告诉我,鉴于我的架构,遮罩是无用的。该模型表现良好。但是,我希望屏蔽可以帮助加快计算速度。 它只是让我烦恼,我无法理解它。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)