channel independence
这个概念在时序预测中的论文被多次提到,通道独立可以立即为变量独立,每个通道其实就是一个变量。说直接一点,就是模型不捕捉通道与通道之间的关联,往往只捕捉同一个变量下不同时间点之间的关联或者说模型在预测某一个变量(Channel)时,只使用该变量自身的历史数据,而不使用(或不依赖)其他变量的数据。。之所以这样做,是因为很多论文(patchtst,Dlinear)认为捕捉变量之间的关系容易过拟合或者效果不好。
DLinear就是采用通道独立的,核心的操作是moving average和lineaer预测,对应的具体代码如下:
class moving_avg(nn.Module):
"""
Moving average block to highlight the trend of time series
"""
def __init__(self, kernel_size, stride):
super(moving_avg, self).__init__()
self.kernel_size = kernel_size
self.avg = nn.AvgPool1d(kernel_size=kernel_size, stride=stride, padding=0)
def forward(self, x):
# padding on the both ends of time series
front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1)
end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1)
x = torch.cat([front, x, end], dim=1)
x = self.avg(x.permute(0, 2, 1))
x = x.permute(0, 2, 1)
return x
可以看到,不论是moving average还是线性模型预测,都只对最后一个维度进行处理,而输入的张量,最后一个维度是Input length,和channel无关,所以就起到了channel independence的作用。
那么patchtst这样的,涉及transformer的如何保证通道独立性?
patchtst会把channel和batch_size维度给合并,这样看起来就是有channel*batch_size个变量。
而DLinear中的individual要稍微特别点,和常用的shared模式有两点不同:
- 为每个通道创建一个预测模型
- 每一个预测模型接收到的输入仅是这个通道的数据,也就是[batch_size, 1, seq_len]。