使用EinsumDense将时间序列输入形状映射到所需的输出形状



谁能帮我理解如何处理压缩/扩展张量的维度使用EinsumDense?

我有一个形状为(batch, horizon, features)的时间序列(非NLP)输入张量,其中预期输出为(1, H, F);H为任意视界,F为任意特征大小。实际上,我在变压器编码器模块中使用EinsumDense作为我的前馈网络,并作为变压器输出中的最终致密层。FFN应该将(1, horizon, features)映射到(1, H, features),最终密集层应该将(1, H, features)映射到(1, H, F)

我当前的方程是FFN的shf,h->shf,密集层的shf,hfyz->syz,但是与我最初的设置相比,我得到了一个不太理想的结果,在那里视界长度没有变化,我的方程分别是shf,h->shfshf,hz->shz

我的两分钱

首先,对变压器编码器的直观理解:给定(batch, horizon, features),注意机制试图找到投影features的加权线性组合。通过在features之间操作每个horizon上操作获得的注意力分数来学习所得权重。接下来的FFN层应该是features中的值的线性组合。

EinsumDense为例我们有两个张量:

:数据(EinsumDense的输入张量)
b:权重(EinsumDense的内部权重张量)

# create random data in a 3D tensor
a = tf.random.uniform(minval=1, maxval=3, shape=(1,2,3), dtype=tf.int32)
# [[[1, 2, 2],
#   [2, 2, 1]]]

超高频h→超高频:这只是缩放单个特征。

b = tf.random.uniform(minval=2, maxval=4, shape=(2,), dtype=tf.int32) 
# [3, 2]
tf.einsum('shf,h->shf', a, b)
# [[[3, 6, 6],   #1st feature is scaled with 3
#   [4, 4, 2]]]] #2nd feature is scaled with 2

超高频,赫兹→shz:这是within功能的线性组合

b = tf.random.uniform(minval=2, maxval=4, shape=(2,6), dtype=tf.int32)
# [[3, 3, 3, 3, 3, 3],
#  [2, 2, 2, 3, 2, 3]]
tf.einsum('shf,hz->shz', a, b)
# [[[15, 15, 15, 15, 15, 15],
#   [10, 10, 10, 15, 10, 15]]]
# every value is a linear combination of the first feature [1, 2, 2] with b. The first value is sum([1,2,2]*3)

以上两个类似于transformer encoder架构,具有特征缩放层。并保留输出结构(batch, H, F)

超高频,hfyz→syz:between功能和within功能组合。

b = tf.random.uniform(minval=2, maxval=4, shape=(2,3,4,5), dtype=tf.int32)
tf.einsum('shf,hfyz->syz', a,b)
# each element output `(i,j)` is a dot product of a and b[:,:,i,j] 
# first element is tf.reduce_sum(a*b[:,:,0,0])

这里的输出(s,y,z), y不对应于horizon,z也不对应于features,而是之间值的组合。

相关内容

  • 没有找到相关文章

最新更新