在這個地方整蒙了,W1和W2這倆是矩陣的標記,但是後面只有個Tr-1和Cr-1,我????
實際上,1 x Tr-1這種表示,即可以是向量也可以是矩陣呀,沒有問題,往下理解是向量,往上理解就是矩陣,
其次,W1與 做運算是將W1當作Tr-1 × 1的矩陣進行運算,而W3和 運算是將其當成1 × Cr-1進行運算,我們可以看到W1和W3是都是用的R^(?)的形式表示的矩陣,但是運算時候卻不一樣,敲黑板了!這就是我整蒙圈的地方,你想R^(?)是個歐幾里得空間,1×Cr-1和Cr-1 × 1都是R^Cr-1的歐幾里得空間,因此R^(?)這個東西我們是根據運算可以實時調整它是1 x c還是c x 1的!
接下來就是R^(N x Cr-1 x Tr-1),這個???這咋個運算哦?
敲黑板!這種高維的,我們以低維的眼光去分解他,看成N個Cr-1 x Tr-1的矩陣,那麼W3與分別與N個相乘,那麼自然就得到了N個1 x Tr-1的矩陣,再寫成R就是R^(N x Tr-1)了。再轉置一下,右邊W3的計算結果就是一個R^(Tr-1 x N)的值
好!那麼代碼裏面怎麼搞得呢?先上代碼:
# defer the shape of params
self.W_1.shape = (num_of_timesteps, ) #對標初始化的時間長度
self.W_2.shape = (num_of_features, num_of_timesteps) #特徵數目 x 時間長度
self.W_3.shape = (num_of_features, )
self.b_s.shape = (1, num_of_vertices, num_of_vertices)
self.V_s.shape = (num_of_vertices, num_of_vertices)
for param in [self.W_1, self.W_2, self.W_3, self.b_s, self.V_s]:
param._finish_deferred_init() #完成模塊的初始化
# compute spatial attention scores
# shape of lhs is (batch_size, V, T)
lhs = nd.dot(nd.dot(x, self.W_1.data()), self.W_2.data()) #lhs式子左部
# shape of rhs is (batch_size, T, V)
#之所以x是四維的是因爲批處理的問題,batch_size=10意思是10個樣本同時進行計算。x的維度是10 x V x features x T
rhs = nd.dot(self.W_3.data(), x.transpose((2, 0, 3, 1)))
product = nd.batch_dot(lhs, rhs)
S = nd.dot(self.V_s.data(),
nd.sigmoid(product + self.b_s.data())
.transpose((1, 2, 0))).transpose((2, 0, 1))
誒?這裏面咋有多了一維?啥情況,原因是我們訓練是一個batch一個batch訓練的
那麼這裏面咋沒有 .T的轉置操作呢?講解
一開始batch_size x N x C x T,那麼你當然可以直接算,然後再來個轉置,最終能夠滿足Tr-1 x N的結果,但如果你先對這個高維的矩陣進行一下transpose的變化,變換成C x batch x T x N這個形式再和W3運算,就可以直接得到T x N就不用做轉置了。類似於上面三維的情況,C x batch x T x N做運算的時候看成C x 1的矩陣,裏面的1是batch x T x N,然後就成了batch x T x N,因爲batch是訓練用的,其實就是Tr-1 x N了
參考資料:Attention Based Spatial-Temporal Graph Convolutional Networks for Traffic Flow Forecasting 2020.AAAI