Informer简单理解

一、输入层Encoder改进:

1、ProbAttention算法计算权值:

原Transformer中的注意力机制时间复杂度N^2,而Informer作为实时性要求高的长时间序列预测算法必然需要提高效率,降低时间开销。

  • 1.简化K:
    • 对每个Q不再与所有K计算,而是随机选取25个K,这样减少计算量
  • 2.简化Q:
    • 每个Q与各自随机选取的25个K计算结果有25个值,选取最大值作为Q结果
    • 对所有Q,选取最大的前25个Q ,因为这25个Q具有较好的区分度
    • 25个Q之外的其余Q使用96个特征V的均值作为Q结果,因为这些Q区分度不大,可以看做均匀分布
      在这里插入图片描述
  • 得到的输出结果:
  • 32代表patch数量。
  • 8代表8头,即每个向量都有8个不同的Q、K,即从8个角度对序列进行计算。
  • 25即为25个Q。
  • 96为K的总数,虽然我们在计算Q时各自只选了25个K,但是最后Q需要与所有96个K进行内积才能融合所有K的特征。
    在这里插入图片描述

2、Self-attention Distilling算法:

同样是在Transformer中的改进,为了降低时间开销。

  • Distilling算法在每层堆叠Self-attention(Transformer Encoder)时调用Distilling算法使输入序列长度减半,降低了时间开销,同样的QK的选取个数也随之减少。

二、输出层Decoder改进:

  • 预测某天的值需要将该天之前的真实值作为已知输入
  • 多个输出结果一口气输出,不用串行等待前一个数据的输出结果。
在Keras中实现Prob Attention可以通过自定义层(Custom Layer)的方式来实现。以下是一个基于Keras的Prob Attention实现代码示例: ```python import tensorflow as tf from tensorflow.keras.layers import Layer class ProbAttention(Layer): def __init__(self, **kwargs): super(ProbAttention, self).__init__(**kwargs) def build(self, input_shape): self.w = self.add_weight(name='kernel', shape=(input_shape[2], 1), initializer='uniform', trainable=True) super(ProbAttention, self).build(input_shape) def call(self, inputs, mask=None): u = tf.matmul(inputs, self.w) if mask is not None: mask = tf.cast(mask, tf.float32) u -= (1.0 - mask) * 1e12 u = tf.exp(u - tf.reduce_max(u, axis=1, keepdims=True)) s = tf.reduce_sum(u, axis=1, keepdims=True) alpha = u / s output = tf.reduce_sum(inputs * alpha, axis=1) return output def compute_output_shape(self, input_shape): return (input_shape[0], input_shape[2]) ``` 在这个自定义层里,我们将输入张量 `inputs` 与权重张量 `self.w` 做矩阵乘法运算得到一个分数张量 `u`,然后通过对分数张量 `u` 做 Softmax 激活得到一个注意力权重张量 `alpha`,最后将输入张量 `inputs` 和注意力权重张量 `alpha` 做加权求和得到输出张量 `output`。在这个实现中,我们还考虑了一个输入遮盖张量 `mask`,用于将注意力权重张量中遮盖的位置的分数设置为一个极小值,以便在 Softmax 激活后得到一个为零的注意力权重张量。 使用这个自定义层的方式与使用 Keras 常规层相同,只需要将其实例化并将其作为一个层添加到模型中即可。 ```python from tensorflow.keras.layers import Input, Embedding, Masking, Dense, Concatenate from tensorflow.keras.models import Model inputs = Input(shape=(maxlen,)) x = Embedding(vocab_size, embedding_dim, mask_zero=True)(inputs) x = Masking()(x) x1 = ProbAttention()(x) x2 = Dense(128, activation='relu')(x1) outputs = Dense(n_classes, activation='softmax')(x2) model = Model(inputs=inputs, outputs=outputs) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.summary() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值