细读Autoformer—空间计量分析
文章目錄
- 摘要
- 一. 細讀Autoformer
- 1.1 論文摘要
- 1.2 研究內容
- 1.3 Autoformer模型框架
- 1.3.1 Series Decomp Block
- 1.3.2 Model inputs
- 1.3.3 Encoder
- 1.3.4 Decoder
- 1.3.5 Auto-Correlation Mechanism
- 二. 空間計量分析理論部分
- 2.1 空間計量經濟學概述
- 2.2 空間權重矩陣得設定與選擇
- 2.2.1 空間權重矩陣的設定
- 2.2.2 如何選擇合適的空間權重矩陣
- 2.2.3 空間權重矩陣的標準化處理
- 2.3 空間自相關檢驗
- 2.3.1 全局莫蘭指數與局部莫蘭指數
- 2.4 空間計量模型得設定與選擇
- 2.4.1 空間計量模型
- 2.4.2 如何去選擇合適的空間模型
- 三. pytorch框架基礎
- 3.1 nn.Model
- 3.2 CONV2D 是如何計算的
- 3.3 卷積層的具體簡單代碼實現
- 3.4 查看VGG16 model 卷積神經網絡怎么去寫
- 3.5 Pooling layer MaxPool2(最大池化的作用)
- 3.6 非線性激活操作Non-Linear Activations
- 3.7 線性層網絡
- 3.8 神經網絡實戰小舉例
- 畢設
- 總結
摘要
本周一是重新細讀了Autoformer模型,對Autoformer的組成部分:序列分解模塊(decompostion block),自相關機制(Auto-Correlation mechanism),編碼和解碼器(Encoder和Decoder),其輸入輸出有著詳細理解。尤其是該論文的自相關機制如何去取代原來的自注意力機制,以及結合長時間預測的實際需要,說明了為什么需要這樣做與自相關機制的獨特優勢。
二是對空間計量分析相關的理論部分進行了較為系統的學習,從空間計量概述,到空間權重矩陣的介紹與設定,以及應該如何選擇;再到空間自相關檢驗莫蘭指數等的公式介紹;以及空間計量模型的介紹與設定,如何去選擇一個合適需求的計量模型。
三是對 pytorch框架基礎的簡單實踐,都是基礎內容。
一. 細讀Autoformer
1.1 論文摘要
本文研究時間序列的長期預測問題,先前基于Transformer的模型都是采用各種自我注意機制來發現長期依賴關系,但對于長期預測來說表現并不是很好,難以發現可靠的依賴關系。并卻由于Transformer都必須采用逐點稀疏版的self-attention以提高長序列效率,從而導致信息利用缺失。該文提出的Autoformer 設計為一種具有自相關機制的新型分解架構。該模型的大體框架是與Transformer相似的,但是Autoformer嘗試將分解序列和預測序列都合在一個模型里面看,新添加了decomposition block序列分解模塊,與用Auto-Correlation去替代自注意力機制。
1.2 研究內容
本文主要探索長期時間序列預測問題:待預測的序列長度(O)遠遠大于輸入長度(I),即基于有限的信息預測更長遠的未來。對于長時間預測來說,模型的預測能力及計算效率有著很強的要求。然而Transformer在長序列的O(L2)O(L^2)O(L2)時間復雜模式下很難發現可靠的時序依賴;基于Transformer的改進模型主要著力于稀疏注意力特征圖 (QKTQK^TQKT) 來降低模型復雜度,而這些模型仍使用以節點為最小單位進行消息匯聚,這樣將造成信息的丟失,這成為了長時間時序預測的性能瓶頸。
為了突破之前的困境,Autoformer的模型將從序列分解出發,提出Auto-Correlation機制替代self-attention,其考慮sub-series(子序列)間的相似度能更好的捕捉到趨勢性,更多的關注序列,而不是節點。不僅要保證時間復雜度,也需要防止信息的丟失。
1.3 Autoformer模型框架
Autoformer主要由三部分組成:
● 序列分解模塊(decompostion block);
● 自相關機制(Auto-Correlation mechanism);
● 編碼和解碼器(Encoder和Decoder)。
編碼解碼架構同時由Auto-Correlation、Series Decomp、Feed Forward三個模塊組成每一層,同時使用殘差結構。因為模型的輸入會用的Series Decomp Block,因此先介紹這個模塊。
1.3.1 Series Decomp Block
Series Decomp Block使用傳統的decomposition分解操作可以將序列分解為trend趨勢項和seasonal季節項這兩個部分,關于這兩個部分的理解是一個可以反應短期的波動另一個則反應長期的季節性。
其中padding是為了保證序列長度不變,avgpool是移動平均。獲取趨勢項后,序列-趨勢=季節。
XtX_tXt?存儲的是每個滑動窗口的均值,而XsX_sXs?則是保留季節性的平滑序列。
1.3.2 Model inputs
編碼器的輸入為已知歷史III個時間點長度的序列,解碼器的輸入包括季節項 和周期項 ;一個是季節項 [Xdes∈R(I/2+O)?dX_{des}\in\R^{(I/2+O)*d}Xdes?∈R(I/2+O)?d],另一個是周期項[Xdet∈R(I/2+O)?dX_{det}\in\R^{(I/2+O)*d}Xdet?∈R(I/2+O)?d]。前 I/2I/2I/2 部分由 XenX_{en}Xen? 分解得到,后面的OOO長度序列分別由0與均值mean補齊。d為時序條數,O為未來時間長度。
公式表示如下:
上圖來源知乎機器學習社區,上圖清晰的反應了編碼器與解碼器的輸入。
1.3.3 Encoder
關注季節部分建模的編碼器,輸出的是過去季節性信息,它將被用做互信息,幫助解碼器調整預測結果。只保留平滑的seasonal part, 每一層的處理公式如下:
假設我們有 N 個編碼器層。 第 l 個編碼器層的整體方程總結為:
1.3.4 Decoder
假設我們有M個解碼層,第l個解碼層 的內部細節如下;
解碼器包括兩個部分:
● 上路是對seasonal季節項成分使用堆疊自相關機制;
● 對trend-cyclical周期項成分使用累加操作。
對于季節項,自相關機制利用序列的周期性質,聚合不同周期中具有相似過程的子序列;對于趨勢項,使用權重累積的方式,逐步從預測的隱變量中提取出趨勢信息。。其中, [XenNX_{en}^NXenN?] 是encoder中的潛在變量,第l個decoder layer的方程可以看作Xdel=Decoder(Xdel?1),XenN)X_{de}^l=Decoder(X_{de}^{l-1}),X_{en}^N)Xdel?=Decoder(Xdel?1?),XenN?) 。
模型最終的輸出結果為:
1.3.5 Auto-Correlation Mechanism
自相關機制模塊關鍵是如何高效計算自相關系數:通過計算序列自相關系數,發現周期依賴項(Period-based dependencies),然后再平移時間做相似子序列的聚合(Time delay aggregation)。
如上圖所示,Q,K,V和Transformer一樣通過映射輸入得到,首先注意到對Q和K分別執行快速傅里葉變換操作 (FFT),K還執行了共軛操作,公式如下(基于Wiener–Khinchin theorem ):
τττ 是從1取到L,然后分別算出前K個最大的TOPK,取為K個 τ1,.....τkτ_1,.....τ_kτ1?,.....τk?做周期長度。
當使用FFT高效求解出τττ 從111 到 L?1L-1L?1 的所有 RXX(T)R_{XX}(T)RXX?(T) 后,然后本文將只取出最大的 topktop ktopk 個RXX(T)R_{XX}(T)RXX?(T),并且對取出的 kkk個RXX(T)R_{XX}(T)RXX?(T)執行softmaxsoftmaxsoftmax 操作轉換為概率,最后將 kkk個概率與對應的進行 ROLL()ROLL()ROLL()操作之后的VVV 相乘后相加得到最后的結果,如下所示:
其中ROLL()ROLL()ROLL()操作是將VVV 按相同相位移動(前面得部分移動到后面對齊),具體圖解如下:
二. 空間計量分析理論部分
2.1 空間計量經濟學概述
所謂空間數據,就是在原來得橫截面或者面板數據上,加上橫截面單位的位置信息(或者相互距離)。研究如何處理空間數據的計量經濟學分支,稱為“空間計量經濟學”。
傳統的計量只是研究了個體的自變量對個體的因變量的影響,而空間計量在傳統計量的基礎上,進一步研究個體的自變量對其他個體的因變量的影響。因此空間計量經濟學最大的特色在于充分考慮橫截面單位(地理區域)之間的空間依賴性。
空間相關性,也稱空間依賴性,是指不同區域的事物和現象之間在空間上的互相依賴、互相制約、互相影響和互相作用,是事物和現象本身固有的空間經濟屬性,是地理空間現象和空間過程的本質屬性。
空間依賴可以定義為觀測值及區位之間的依賴性。當相鄰區域特征變量的高值或低值在空間上呈現集聚傾向時為正的空間自相關,反之,當相鄰區域特征變量取值與本區域變量取值高低相反時則為負的空間自相關。
為什么會存在空間相關性!
原因1:觀測數據地理位置鄰近
原因2:截面層個體的相互競爭與合作
原因3: 模仿行為
原因4:溢出效應
原因5:測量誤差
2.2 空間權重矩陣得設定與選擇
如何將經濟變量的空間效應納入回歸方程中,這便需要根據某種標準建立空間權重矩陣。
2.2.1 空間權重矩陣的設定
之前也學習了三種空間權重矩陣,還有一個綜合距離,以及它們應該如何去獲取與創建。下面再簡單復習一下:
-
鄰近權重矩陣
-
地理距離權重矩陣
-
經濟距離權重矩陣
一般的經濟指標是應用人均GDP,再按如下的公式去計算經濟距離矩陣:
對于如何創建經濟距離權重矩陣,在之前的文章中有相關介紹。
- 綜合距離矩陣
由于選取的距離形式不同,對于空間相似度的度量也會造成不同的結果。所以需要根據不同的需求,對距離進行加權處理。但具體怎么做還不是很清楚?
2.2.2 如何選擇合適的空間權重矩陣
盡管二進制的空間鄰近權值矩陣并非適用于所有的空間計量經濟模型,但是,處于某些情況下的實用性,在構建空間計量模型時的首選就是從二進制的鄰近矩陣開始的。
一般是先從空間鄰近的最基本二進制矩陣開始,逐步選擇確定空間權值。
關于各種權值矩陣的選擇,沒有現成的理論根據,一般可考慮空間計量模型對各種空間權值矩陣的適用程度,檢驗估計結果對權值矩陣的敏感性,最終的依據實際上就是結果的客觀性和科學性。
2.2.3 空間權重矩陣的標準化處理
下面說明一下需要標準化的原因,以及處理的公式:
空間權重矩陣標準化的優缺點:
具體執行過程在Stata軟件分析中使用代碼可輕松實現這一操作。
2.3 空間自相關檢驗
在確定好空間權重矩陣之后,我們需要對判斷數據做是否存在空間自相關性。
“空間自相關”可以理解為位置相近的區域具有相似的變量取值。如果高值與高值集聚在一起,低值與低值集聚在一起,則為“正空間自相關”;反之,如果高值與低值相鄰,則為“負空間自相關”;如果高值與低值完全隨機地分布,則不存在空間自相關。
目前常用來考察數據空間自相關的指標為莫蘭指數I和吉爾里指數C,其中莫蘭指數是最常用的。
2.3.1 全局莫蘭指數與局部莫蘭指數
莫蘭指數I如果接近于0,則說明該空間分布是隨機的,不存在空間自相關。
它們的具體實現,之前也有demo做了執行代碼,結果展示,這里是再次理清它們的概念與判斷。
2.4 空間計量模型得設定與選擇
2.4.1 空間計量模型
再次理解一下空間計量模型表示與含義:
1. SAR
在空間自回歸模型(空間滯后模型)中,被解釋變量間存在較強的空間依賴性,進而鄰地被解釋變量會通過空間傳導機制影響到本地的被解釋變量。(比如技術擴散)
2.SEM
3.SDM
一般的空間計量模型:
2.4.2 如何去選擇合適的空間模型
對一般性空間計量模型進行拉格朗日乘數檢驗**(LM檢驗**)、穩健的拉格朗日乘數檢驗(RLM檢驗)和似然比檢驗(LR檢驗),根據檢驗結果來選擇合適的模型。
對于空間截面數據:
對于空間面板模型:
具體過程可參考空間計量領域經典論文:如【中國東部沿海五大城市創新效率,影響因素及空間溢出效應】
三. pytorch框架基礎
3.1 nn.Model
神經網絡的基本骨架-nn.Module
import torch from torch import nnclass Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()## 調用父類初始化函數def forward(self,input):output = input+1 # 最簡單的自定義return output ## 自定義輸出y=Tudui() # 實例化類 x = torch.tensor(1.1) # 注意: Tensor是class,tensor是function,將數據類型轉換為Tensor output = y(x) print(output) # tensor(2.1000)3.2 CONV2D 是如何計算的
詳細計算過程可見:torch.nn.functional.conv卷積模塊詳解模塊
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor
functional.conv2d函數的使用
import torch import torch.nn.functional as F# 輸入:5x5矩陣 input = torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1]]) # 卷積核3x3矩陣 kernel = torch.tensor([[1, 2, 1],[0, 1, 0],[2, 1, 0]])# 尺寸變換,要對應conv2d input的要求(minibatch=1,channel=1,h,w) input = torch.reshape(input, (1, 1, 5, 5)) kernel = torch.reshape(kernel, (1, 1, 3, 3))# stride:每次(在哪個方向)移動幾步 output = F.conv2d(input, kernel, stride=1) print(output)output1 = F.conv2d(input, kernel, stride=2) print(output1)output2 = F.conv2d(input, kernel, stride=1, padding=1) # padding=1是一般默認為全零填充一圈 print(output2)# output # tensor([[[[10, 12, 12], # [18, 16, 16], # [13, 9, 3]]]])# tensor([[[[10, 12], # [13, 3]]]])# tensor([[[[ 1, 3, 4, 10, 8], # [ 5, 10, 12, 12, 6], # [ 7, 18, 16, 16, 8], # [11, 13, 9, 3, 4], # [14, 13, 9, 7, 4]]]])3.3 卷積層的具體簡單代碼實現
GitHub上可視化卷積過程 卷積層動圖理解(藍色input,綠色output,深色kernel)。
dilation:設置了的話就是空洞卷積(可見上面鏈接中的可視化)。
3.4 查看VGG16 model 卷積神經網絡怎么去寫
如下圖一個經典案例:
可見其input是 3通道,224224;然而其卷積之后是(224224*64),可知是維持了圖片的尺寸,定是padding 進行了填充,所以我們可以將 【上個案例中卷積操作:nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)】
那么本圖中可知:(in_channels=3,out_channels=64,…)
由上面公式可推導出padding 等參數。
3.5 Pooling layer MaxPool2(最大池化的作用)
上官網查看具體的知識:Maxpooling
參數有:
kernel_size – 窗口的大小,以達到最大值
stride – 移動窗戶的步幅。默認值為kernel_size
padding– 要在兩側添加的隱式零填充
dilation– 控制窗口中元素步幅的參數(空洞卷積)
return_indices – if 將返回最大指數和輸出。對torch.nn.MaxUnpool2d稍后有用True
ceil_mode – 當為 True 時,將使用ceil而不是floor來計算輸出形狀(ceil向上取整,floor向下取整)
import torch import torchvision from torch import nn from torch.nn import MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),download=True) dataloader = DataLoader(dataset=dataset, batch_size=64, shuffle=True, drop_last=False)# #輸入:5x5矩陣 # input=torch.tensor([[1,2,0,3,1], # [0,1,2,3,1], # [1,2,1,0,0], # [5,2,3,1,1], # [2,1,0,1,1]],dtype=torch.float32) #dtype:將數據類型更改為浮點數 # ## 由于方法規定,必須轉換形狀 # input=torch.reshape(input,(-1,1,5,5)) # print(input.shape)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)self.maxpool2 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self,input):output1 = self.maxpool1(input)output2 = self.maxpool2(input)# return output1return output1,output2 test = Test() # 與之前的input 對應輸出 # output = test(input) # print(output) # 輸出結果 兩種情況 # (tensor([[[[2., 3.], # [5., 1.]]]]), tensor([[[[2.]]]])) writer = SummaryWriter("../log1") step= 0for data in dataloader:imgs,targets = datawriter.add_images("input",imgs,step)# 注意,最大池化不會改變channel(input是3通道,output也是3通道)output1,output2 = test(imgs)writer.add_images("output1",output1,step)writer.add_images("output2",output2,step)step=step+1writer.close()輸出池化之后的結果圖片:
最大池化的作用:在保留原有數據特征的情況下 減小數據量。
3.6 非線性激活操作Non-Linear Activations
看官方文檔:官方非線性激活文檔
import torchvision from torch import nn from torch.nn import ReLU, Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),download=True) dataloader = DataLoader(dataset=dataset, batch_size=64, shuffle=True, drop_last=False)class test(nn.Module):def __init__(self):super(test, self).__init__()# inplace:是否將 input 替換成output (一般默認為False,不會取代原來的input)self.relu1 = ReLU(inplace=False)self.sigmoid1 = Sigmoid()def forward(self, input):output = self.relu1(input)output = self.sigmoid1(output)return outputtest1 = test()writer = SummaryWriter("../log1") step = 0 # 每一個循環是一個batch=64,drop_last為False是不舍棄不足的 for data in dataloader:imgs, t = datawriter.add_images("input", imgs, step)output = test1(imgs)writer.add_images("output", output, step)step = step + 1writer.close()經過ReLU與Sigmoid非線性激活的操作后:
非線性激活的作用是:提升模型的泛化能力
3.7 線性層網絡
正則化的官方文檔:BATCHNORM2D
查看官網線性層的文檔: Linear Layers
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
in_features – 每個輸入樣本的大小
out_features – 每個輸出樣本的大小
bias – If set to False, the layer will not learn an additive bias. Default: True
下面是經典的VGG16 model :
可見圖上后兩層是由(1?1?40961*1*40961?1?4096)–線性層->(1?1?10001*1*10001?1?1000),那這里是如何實現的?
線性層的簡單實現:
import torch import torchvision from torch import nn from torch.nn import Linear from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),download=True) # 這里不droplast=True 后面會報錯,因為linear1的定義是 196608,而最后一組圖片不夠64張, 最后的大小也不足 196608 dataloader = DataLoader(dataset, batch_size=64, drop_last=True)class test(nn.Module):def __init__(self):super(test, self).__init__()self.linear1 = Linear(196608, 10) ## 線性層(輸入 feature,輸出 feature)def forward(self, input):output = self.linear1(input)return outputtest1 = test() for data in dataloader:imgs, t = dataprint(imgs.shape)# 將圖片線性化output = torch.reshape(imgs, (1, 1, 1, -1))# flatten也可以用#output=torch.flatten(imgs)print(output.shape)output = test1(output) # 經過linear層之后變成10維print(output.shape)# torch.Size([64, 3, 32, 32]) #torch.Size([1, 1, 1, 196608]) # torch.Size([1, 1, 1, 10])3.8 神經網絡實戰小舉例
我們應用CIFAR10數據集做一個十分簡單的分類,根據圖片的內容識別屬于哪一個類即可。
CIFAR10模型結果如下:
用nn.Sequential將代碼變得更簡潔:
class test(nn.Module):def __init__(self):super(test, self).__init__()self.model1=nn.Sequential(nn.Conv2d(3, 32, 5, padding=2, stride=1),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, stride=1, padding=2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, stride=1, padding=2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self,x):x=self.model1(x)return x畢設
學弟初稿已交,項目正在搭建,保持聯系。
總結
一是:對于Transformer類模型應用于時序任務,主要分為網絡模型的修改以及應用領域兩個角度:
-
網絡的修改:主要圍繞著位置編碼、注意力機制以及模型層級設計進行展開;
-
應用領域:主要圍繞著時序預測、時序分類以及異常值檢測進行展開。
具體的關于Transformer類模型應用在時序預測文獻可詳見:Transformer應用于時序任務的綜述
二是:對于空間計量分析,需要重新考量解釋變量與被解釋變量,如何建立合適的面板數據,合適的權重矩陣等,以及之間應該如何去建立空間計量模型,如何優化生態環境與經濟環境的相關關系。
三是: 抓緊學習模型框架代碼,從最基礎的模型與利用現有數據集,到搭建自己的模型與利用自己的時序數據去做一些預測實現是近期的任務。
總結
以上是生活随笔為你收集整理的细读Autoformer—空间计量分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sybase在线手册
- 下一篇: 团队管理经验