TimeMixer icon indicating copy to clipboard operation
TimeMixer copied to clipboard

Timemixer++论文中的一些困惑点

Open Tianyi-Lin opened this issue 9 months ago • 1 comments

读了论文,感觉有几个地方会有点不理解 1)二维图的竖轴是period len好理解,横轴这个frequency就误导了,修改为period index更好理解一些,例如fft峰值在frequency=4,那么纵轴period len = total len / 4,横轴period index = {0,1,2,3}。事实上这里的横轴不是频率,只是有数量关系fft peak frequency index = max period index,物理意义不对?个人感觉和stft 时频图那种的一个竖轴频率,一个横轴时间,物理意义更加明确。且在附录中,有time view和embedding view画的彩色图,个人理解是把dmodel的维度展开来可视化,和frequency还是没有什么关系?特别是横轴在展开dmodel之后,变成类似连续的了(之前time view横轴是0,1,2,3离散的;展开dmodel后横轴实际上是4*dmodel个离散值,如果freq=4峰值),更加难以解释物理意义?还请指正

2)在双轴注意力部分,附录中有点看不懂。首先说输入图像,前文说纵轴pk是period len,横轴fmk是period个数 = fft 峰值的freq index(个人还是认为可以换一个符号如 f peak index之类的,横轴只是多个period concat到一起形成的,与频率无关),通道为dmodel。col-axis attn显然是period内部attn(竖向一列,period内部attn),故序列可以看作pkdmodel,batch=fmk,也就是提到的row-axis(横轴)。但是,为什么说conv2d(我理解是三通道二维卷积)出来的qkv是fmkdmodel,为什么不是pkdmodel(常见的QKV写法都是Nd,序列长度N*模型维度d),这里似乎是笔误吗? 此外,conv2d是怎么进行的呢?Timemixer++参考的Timesnet里面的二维图没有dmodel维度,所以2d卷积的两维={period内(竖轴)*period之间(横轴)}进行,这里多了个dmodel,不知道具体如何进行卷积的。希望可以解答 感谢🙏!

Tianyi-Lin avatar Apr 25 '25 15:04 Tianyi-Lin

针对第(2)点,我也对论文中关于Q,K,V矩阵维度的表述存在类似疑惑,特别是在 列注意力(ColAttention) 部分。为此,我查阅了匿名 GitHub 仓库中的实现代码,以便核实这一部分的实际操作。

以下是ColAttention的关键实现代码片段(以Q为例),完整代码附在最后。

b, _, h, w = x.size()   # 简记为 [B, D, P, F];其中 h = P 表示论文中的 p_k,w = F 表示 f_{m,k}
Q = Q.permute(0, 3, 1, 2).contiguous().view(b * w, -1, h).permute(0, 2, 1)  # 最终形状为 [B * F, P, D]

这段代码的处理逻辑如下:

  1. 原始输入维度是 [B, D, P, F],其中 P 是每个周期内的时间点数(即 p_k),F 是周期的重复次数(即 f_{m,k});

  2. permute(0, 3, 1, 2) 将输入转置为 [B, F, D, P]

  3. view(b * w, -1, h) 将 F 合并进 batch 维度,得到 [B * f_{m,k}, D, p_k]

  4. permute(0, 2, 1) 得到最终形状为 [B * f_{m,k}, p_k, d_model],符合标准 Transformer 注意力输入 [batch, seq_len, d_model]的形式。

这说明:在每个周期内,我们在 p_k 个时间点之间进行注意力计算,而f_{m,k}个周期被合并进 batch 中以并行处理。

然而,论文第 5 页在描述Attention_col时写道:

"For column-axis attention, queries, keys, and values Q_col, K_col, V_col ∈ R^{f_{m,k} × d_model} are computed via 2D convolution..."

从实现代码来看,它确实是与论文中的描述是不太符合的。我的理解是,作者可能是想强调“有f_{m,k}个列 attention 实例”,而不是每个Q的具体 shape。

考虑到该论文已被 ICLR 2025 接收为 Oral,我也查看了审稿意见与互联网上的相关讨论,似乎尚没有人指出这一问题。因此,我也希望能进一步确认:

  • 这一维度的描述是否是作者有意进行抽象简化?
  • 还是说在表述上存在笔误?

如有理解不当之处,也欢迎大家补充和指正!


匿名仓库中ColAttention的完整实现如下:

class ColAttention(nn.Module):
    def __init__(self, in_dim, q_k_dim):
        super(ColAttention, self).__init__()
        self.in_dim = in_dim
        self.q_k_dim = q_k_dim

        self.query_conv = nn.Conv2d(in_channels=in_dim, out_channels=self.q_k_dim, kernel_size=1)
        self.key_conv = nn.Conv2d(in_channels=in_dim, out_channels=self.q_k_dim, kernel_size=1)
        self.value_conv = nn.Conv2d(in_channels=in_dim, out_channels=self.in_dim, kernel_size=1)
        self.softmax = Softmax(dim=2)
        self.gamma = nn.Parameter(torch.zeros(1))

    def forward(self, x):
        b, _, h, w = x.size()
        Q = self.query_conv(x)
        K = self.key_conv(x)
        V = self.value_conv(x)

        Q = Q.permute(0, 3, 1, 2).contiguous().view(b * w, -1, h).permute(0, 2, 1)  # size = (b*w,h,c2)
        K = K.permute(0, 3, 1, 2).contiguous().view(b * w, -1, h)  # size = (b*w,c2,h)
        V = V.permute(0, 3, 1, 2).contiguous().view(b * w, -1, h)  # size = (b*w,c1,h)

        col_attn = torch.bmm(Q, K)
        col_attn = self.softmax(col_attn)
        out = torch.bmm(V, col_attn.permute(0, 2, 1))
        out = out.view(b, w, -1, h).permute(0, 2, 3, 1)
        out = self.gamma * out + x
        return out

yuanxiaoye1031 avatar May 25 '25 10:05 yuanxiaoye1031

@yuanxiaoye1031 感谢细致检查。我重新检查了下每个维度,此处 b, _, h, w = x.size() 的维度理解反了,应为: b, _, h, w = x.size() # 简记为 [B, D, P, F];其中 h 表示论文中的 f_{m,k},w 表示为p_k 因此,

"For column-axis attention, queries, keys, and values Q_col, K_col, V_col ∈ R^{f_{m,k} × d_model} are computed via 2D convolution..."

应理解为Q_col, K_col, V_col的形状忽略batch维度后为R^{f_{m,k} × d_model}

LeeJarvis996 avatar Jun 26 '25 07:06 LeeJarvis996

@Tianyi-Lin 感谢您的留言,(1) 关于frequency词汇的使用,TimeMixer++沿用了TimesNet的做法,基于信号处理领域的基本概念扩展到时间序列领域,和信号处理领域的解释有一定差别。附录的表征图中d_model横纵轴是frequency和period,便于可视d_model进行了降维处理。 (2) 您可以看一下yuanxiaoye1031的分析。此外,conv2d的作用类似Transformer中的projection,用于得到Q、K、V张量。论文中R^{f_{m,k} × d_model} 得到的过程分为两步,先通过 Conv2d 得到隐藏表示,再将 p__k 所在维度合并到 batch_size 维度,而并非一步到位:

... by transposing the non-target axis to the batch dimension.

LeeJarvis996 avatar Jun 30 '25 15:06 LeeJarvis996