【发布时间】:2021-08-20 14:41:45
【问题描述】:
我正在努力掩盖我对 MultiHeadAttention 层的输入。我正在使用 Keras 文档中的 Transformer Block 进行自我关注。到目前为止,我在网上找不到任何示例代码,如果有人能给我一个代码 sn-p,将不胜感激。
来自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
然后在调用层时输入,transformer 块中唯一的变化是:
def call(self, inputs, mask, training):
attn_output = self.att(inputs, inputs, attention_mask=mask)
但是,当在拟合时给定 batch_size 时,这当然不起作用,并且仅适用于我的记忆中的 5 次观察,所以它没有任何意义。 除此之外,我认为这并没有正确屏蔽输入 - 一般来说,考虑到 attention_mask 的形状(观察值、sequence_length、sequence_length),我对如何屏蔽感到很困惑。我输入的形状是(观察、序列长度、特征)。该输入被零填充,但是,当涉及到转换器块时,它已经通过了嵌入层和 CNN。 我尝试了各种方法来编写一个函数,该函数在使用不同的 Tensor 或 Keras 对象进行训练时创建掩码。但是我每次都遇到错误。
我希望更熟悉 Tensorflow/Keras 的人能够提供一个示例。 或者有人告诉我,考虑到我的架构,掩蔽是无用的。该模型表现良好。但是,我希望掩蔽可以帮助加快计算速度。 我无法理解它,这让我很烦恼。
【问题讨论】:
标签: tensorflow machine-learning keras transformer attention-model