赞
踩
长序列预测
经常用的两种经典传统算法:Prophet和Arima。这两种算法不合适做长序列和多标签输出任务。
LSTM其实就是RNN结构加上一些控制单元,在长序列预测中,如果序列越长,速度越慢,效果也越差(串行)
Informer就是套用transformer结构形成的。Transformer中decoder的输出部分是先输出第一个值,再根据encoder和第一个值输出第二个值,再根据encoder和第一个值和第二个值输出第三个值,等等,无法实现实时输出,所以informer中对decoder做了改进,实现一下输出多个预测值。
那怎么解决前面的词对当前要输出的词的影响?
论文三大核心:attention需要计算的更快。decoder部分需要一次性输出所有预测。堆叠encoder也要更快。
经实验表明:在长序列中,不是每一个位置的attention都是重要的。对于每一个Q,只有一小部分的K是与其有较强的关系,大部分的点之间是没有关系的,内积值为0。下图大部分都是黑色区域
经实验表明:有用的、能干活的Q分布较有特点,不起作用的Q类似于均匀分布
如何筛选出这些不起作用的Q呢,让每个Q计算与均匀分布之间的差异(为什么计算与均匀分布之间的差异,因为不起作用的Q的分布就近似于均匀分布),差异越大的表示这些Q越积极,越有用。
Probattention计算方法(具体怎么筛选出这些有用的Q):
从上面图中可以看出,纵坐标的一个Q需要与所有的K做计算,但其实是不需要的,这样做增大了计算量,只需要从所有的K中随机选出一部分做计算即可,就能知道右侧曲线图的大概,就能知道这个Q是干活的还是不干活的。
假设输入序列长度为96,x1...x96,首先在K中做采样,随机选25个K,现在目的是要选出一些重要的Q,本来一个Q是要与所有的96个K做计算,但现在只需要跟随机选出来的部分K做计算即可,源码中输出结果32,8,96,25,表示batch为32,8头,96个Q,25个K,即96个Q分别与25个K做内积计算。计算之后,结果是Q1K1,Q1K2,Q1K3...Q1K25, Q2K1,Q2K2,Q2K3,...Q2K25等,接下来计算与均匀分布之间的差异,每一个Q需要从25个结果中选出最大值与均匀分布做差,看差值大小,插值越大越有用。计算完差异之后,进行排序,从大到小,只要前25名的Q,把这25个有价值的Q选出来之后,之后就正常计算了,上面所有步骤的目的就是选出这有价值的25个Q。最后得到的QK内积为32,8,25,96,batch为32,8头,25个Q,每个Q与所有的96个K做内积计算,之后做特征重构,没被选中的Q不再计算attention值,将其值直接令为均值1/96V1+1/96V2+...,剩下的没用的没被选中的Q算不算都是跟均匀分布差不多,所以就直接将其值设为均值。选中的25个Q会更新,其余为平均向量
所以,最终筛选出有用的Q是用的什么方法?首先随机选部分K与所有的Q计算注意力,再从每一个Q中的所有QK中选出最大值与均匀分布做差,之后排序,选出前25个,这25个Q就是有用的,这25个正常跟96个K计算注意力,剩下的没被选中的,无用处的Q直接设置为均值即可,这样就可以减少计算量,只计算实际有用的。
Self-attention Distilling计算方法:
就是下采样,Transformer的encoder中每做一次attention之后都会下采样,通过1D的maxpool操作进行下采样,序列长度变小之后,上述选有用的Q时随机选的K的个数也会变少,这样堆叠多次就是informer的encoder架构了。
传统Transformer中的decoder架构是先输出第一个,再基于第一个输出第二个,以此类推,但在informer中,直接输出所有的,是利用mask掩码来做的
decoder中的输入是已知的值加上需要预测的值。比如要根据过去一个月的温度预测未来一周的温度情况,此时decoder的输入是已知的过去一个月中最后几天的温度和需要预测的未来一周的温度情况。所有的decoder的输入之间还是要计算attention,计算方法与前面的probattention一样。informer中decoder的输出一次性输出所有的,所以加入mask掩码来实现一次性输出所有的要求。每一个位置的mask都是到他位置为1,后面的全为0,就是只能利用每个前面的,后面的用不了
源码中:decoder输入长度是72,其中前48是已经知道的真实值,后面24个是需要预测的值,这所有的72个输入长度还是计算attention,用之前的probattention方法,但这里再计算的时候需要加上mask掩码,为了一次性输出所有的预测结果,mask意思就是能利用前面的信息,后面的信息用不了。做完自身的注意力之后,还需要做与encoder之间的注意力关系。传统的decoder输出要看与前面的关系,一个一个的输出,但在informer中不需要这样,因为加入了mask掩码,已经把前面可以利用的值置为1了(有疑问:一次性输出所有的,但同时又要根据mask掩码计算与前面之间的关系,那前面的不输出,怎么计算与他们的关系呢,怎么一下输出所有的并且还要计算与前面输出之间的关系)
位置编码:不仅有绝对位置编码(跟transformer中的位置编码一样),还包括跟时间相关的各种编码(根据自己任务设定,比如跟月份或周有关的位置编码,1-7为第一周设置一个位置编码,1-30设置为一个编码,这是按月编码等等),在encoder和decoder中都有
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。