如何在 Tensorflow 中屏蔽 2-D MultiHeadAttention?



谁能帮助我理解在MultiHeadAttention中屏蔽3D输入(技术上是4D)?

我的原始数据集由以下形式的时间序列组成:

输入:(samples, horizon, features)~>(8, 4, 2)~>K, V, Q during inference

目标:(samples, horizon, features)~>(8, 4, 2)~>Q during training
标签:(sample, horizon, features)~>(1, 4, 2)

本质上,我正在获取 8 个时间序列数据样本,并最终以相同的格式输出 1 个样本。目标是输入的水平偏移值,并馈送到仅编码器变压器模型中(如上所示Q, K, V)。

为了最好地近似单个输出样本(与目标中的最后一个样本相同),我需要对每个样本的视界和样本之间的因果注意力进行全神贯注。一旦数据通过编码器运行,它就会被发送到EinsumDense 层,该层将编码器输出(8, 4, 2)减少到(1, 4, 2)。 为了使所有这些工作,我需要在我的数据上注入第 4 个维度,因此输入和目标的格式为(1, 8, 4, 2)

因此,进入我的实际问题,如何为编码器生成掩码?经过一些错误的挖掘,我注意到MHA用于屏蔽softmax的张量的形状被格式化为(1, 1, 8, 4, 8, 4)这让我相信它(B, H, TS, TH, SS, SH)

B=批次
H=头部
TS=目标样本
TH=目标地平线
SS=源样本
SH=源地平线

我从文档中收集这个概念只是因为attention_output描述:

。其中 T 表示目标序列形状

假设是这种情况,以下是否是一个合理的掩码,或者是否有更合适的方法:

sample_mask = tf.linalg.band_part(tf.ones((samples, samples)), -1, 0)
horizon_mask = tf.ones((horizon, horizon))
encoder_mask = (
sample_mask[:, tf.newaxis, :, tf.newaxis]
* horizon_mask[tf.newaxis, :, tf.newaxis, :]
)

它是掩蔽的,你可以喜欢它,因为数据以多种方式包含,它没有错,但我正在尝试使用 Tensorflow 方法,请查看结果它们在同一维度上。张量流掩码层

示例:与目标形状简单相同的掩码值 您成为解决方案的观察者,用眼睛证明时尚改善治理。

import tensorflow as tf
import matplotlib.pyplot as plt
start = 3
limit = 25
delta = 3
sample = tf.range(start, limit, delta)
sample = tf.cast( sample, dtype=tf.int64 )
sample = tf.constant( sample, shape=( 8, 1 ) )
horizon = tf.random.uniform(shape=[1, 4], minval=5, maxval=10, dtype=tf.int64)
features = tf.random.uniform(shape=[1, 1, 2], minval=-5, maxval=+5, dtype=tf.int64)
temp = tf.math.multiply(sample, horizon)
temp = tf.expand_dims(temp, axis=2)
input = tf.math.multiply( temp, features )
print( "input: " )
print( input )
n_samples = 8
n_horizon = 4
n_features = 2
sample_mask = tf.linalg.band_part(tf.ones((n_samples, n_samples)), -1, 0)
horizon_mask = tf.ones((n_horizon, n_horizon))
encoder_mask = (
sample_mask[:, tf.newaxis, :, tf.newaxis]
* horizon_mask[tf.newaxis, :, tf.newaxis, :]
)
print( encoder_mask )
masking_layer = tf.keras.layers.Masking(mask_value=50, input_shape=(n_horizon, n_features))
print( masking_layer(input) )
img_1 = tf.keras.preprocessing.image.array_to_img(
tf.constant( tf.constant( input[:,:,1], shape=(8, 4, 1) ), shape=(8, 4, 1) ),
data_format=None,
scale=True
)

img_2 = tf.keras.preprocessing.image.array_to_img(
tf.constant( masking_layer(input)[:,:,0], shape=(8, 4, 1) ),
data_format=None,
scale=True
)
plt.figure(figsize=(1, 2))
plt.title("  ")
plt.subplot(1, 2, 1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(img_1)
plt.xlabel("Input (8, 4, 2), left")
plt.subplot(1, 2, 2)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(img_2)
plt.xlabel("Masks (8, 4, 2), left")
plt.show()

输出:我们从表匹配特征创建的输入张量。

[[ -960     0]
[-1080     0]
[ -960     0]
[ -960     0]]], shape=(8, 4, 2), dtype=int64)

输出:问题 - 屏蔽方法。

[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
...
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]], shape=(8, 4, 8, 4), dtype=float32)

输出:masking_layer = tf.keras.layers.Masking(mask_value=50, input_shape=(n_horizon, n_features))

[[ -840     0]
[ -945     0]
[ -840     0]
[ -840     0]]
[[ -960     0]
[-1080     0]
[ -960     0]
[ -960     0]]], shape=(8, 4, 2), dtype=int64)
  • 样本
  • 样本

相关内容

  • 没有找到相关文章