谁能帮我理解如何处理压缩/扩展张量的维度使用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->shf
和shf,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
,而是之间值的组合。