网站建设方案网站安全,网站开发价格预算,重庆建设工程信息网官网入口网页,dedecms网站二次开发论文#xff1a;Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting (AAAI’21 Best Paper)
看了一下以前的论文学习学习#xff0c;我也是重应用吧#xff0c;所以代码部分会比较多#xff0c;理论部分就一笔带过吧
论文作者也很良心的…论文Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting (AAAI’21 Best Paper)
看了一下以前的论文学习学习我也是重应用吧所以代码部分会比较多理论部分就一笔带过吧
论文作者也很良心的给出了colab就大大加快了看源码是怎么实现的速度https://colab.research.google.com/drive/1_X7O2BkFLvqyCdZzDZvV2MB0aAvYALLC
那么源码主要看什么呢首先是issuegithub的issue里面如果压根就跑不了那就不用花时间了如果没太大的错误说明代码没有致命的错误
第二步是看数据源数据是什么数据如何预处理
第三步看模型实现一般就在model文件夹下面这一步比较简单重点看创新点部分如何实现的
第四步pth看看复现结果 文章目录模型框架代码地址模型框架 创新点ProbSparse Attention 主要思想就是用top-k选择最有用的信息 代码地址
https://github.com/zhouhaoyi/Informer2020
下载好代码和数据仔细阅读Data的说明我们得知得把数据放到data/ETT文件夹下面
parser部分大致看看什么意思modeldataroot_pathdata_path单卡多卡和num_workers设置一下结合上下文推测大致的意思同时github里面提供了数据字典我们至少需要修改data和data_path参数
由于我是windows上debug的所以args如果是requiredTrue的话参数需要我们手动填就很麻烦个人习惯就都改成False先
右键运行成功那么就可以逐步debug了 main_informer.py运行逐渐运行到 exp.train(setting) 进入train函数 train_data, train_loader self._get_data(flagtrain)vali_data, vali_loader self._get_data(flagval)test_data, test_loader self._get_data(flagtest)首先_get_data取数据进入函数看看data_dict里面看到了Dataset_Custom就知道它是可以自定义数据的后面实例化dataset实例化dataset再实例化dataloader数据集做好了
dataset中看看怎么预处理数据的dataset里面有__read_data__和__getitem__函数上下文分析__read_data__就是预处理的步骤因为看到了StandardScaler里面做了一个标准化
time_features函数对时间维度做特征编码思想很简单但是代码写特别复杂
最后构造dataloader 往下走到epoch开始迭代训练数据到_process_one_batch函数
pred, true self._process_one_batch(train_data, batch_x, batch_y, batch_x_mark, batch_y_mark)_process_one_batch进一步处理数据和输入进modeldec_input先全0或者全1进行初始化
然后enc_inputh后面48个和dec_input按dim1维度进行拼接
dec_input前面的48个就是时序的观测值我们要预测后面的24个
model输入是96,12的enc_inputenc_mark是96,4时间编码特征 dec_input是72,12dec_mark是72,4 model 部分
主要是attention模块其他都比较简单在model/attn.py看ProbAttention class直接看forward函数
首先划分QKV96个seqlen中选25个(U_part)
重点来了_prob_QK函数
scores_top, index self._prob_QK(queries, keys, sample_kU_part, n_topu)进入_prob_QK
首先K扩充了-3的维度K_expand328969664
index_sample随机采样出0~96的96×25的矩阵K_sample取出328962564
Q和K_sample计算内积的到Q_K_sample3289625 Q_K_sample上计算max选出M_top个max波峰最大的Q得到Q_reduce25个Q
Q_reduce再和96个K做内积 def _prob_QK(self, Q, K, sample_k, n_top): # n_top: c*ln(L_q)# Q [B, H, L, D]B, H, L_K, E K.shape_, _, L_Q, _ Q.shape# calculate the sampled Q_KK_expand K.unsqueeze(-3).expand(B, H, L_Q, L_K, E)index_sample torch.randint(L_K, (L_Q, sample_k)) # real U U_part(factor*ln(L_k))*L_qK_sample K_expand[:, :, torch.arange(L_Q).unsqueeze(1), index_sample, :]Q_K_sample torch.matmul(Q.unsqueeze(-2), K_sample.transpose(-2, -1)).squeeze(-2)# find the Top_k query with sparisty measurementM Q_K_sample.max(-1)[0] - torch.div(Q_K_sample.sum(-1), L_K)M_top M.topk(n_top, sortedFalse)[1]# use the reduced Q to calculate Q_KQ_reduce Q[torch.arange(B)[:, None, None],torch.arange(H)[None, :, None],M_top, :] # factor*ln(L_q)Q_K torch.matmul(Q_reduce, K.transpose(-2, -1)) # factor*ln(L_q)*L_kreturn Q_K, M_top_get_initial_context函数显示了如果没有选择到的Q说明比较平庸直接用平均V来表示 V_sum V.mean(dim-2)_update_context 只更新25个Q
context_in[torch.arange(B)[:, None, None],torch.arange(H)[None, :, None],index, :]\ torch.matmul(attn, V).type_as(context_in)attention做完 回到forward做了一个蒸馏操作MaxPool1dstride2做个下采样 96len变成48len
ConvLayer((downConv): Conv1d(512, 512, kernel_size(3,), stride(1,), padding(1,), padding_modecircular)(norm): BatchNorm1d(512, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue)(activation): ELU(alpha1.0)(maxPool): MaxPool1d(kernel_size3, stride2, padding1, dilation1, ceil_modeFalse)
)encoder做完 做decoder用的模块和encoder一致还有一个cross attention都老生常谈跳过…