谁能帮助我理解在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)
- 样本
- 样本