从那时起,我便独自一人

照顾着

历代的星辰


时序卷积网络
刘文豪
2024/1/20

时序卷积网络(TCN)是一种专门用于序列建模任务的神经网络架构。与传统的循环神经网络(RNN),如 LSTM 或 GRU,需要逐步处理序列数据不同,TCN 使用卷积来捕捉序列中的时间依赖性。这使得它在处理时间序列或其他序列数据时,具有高度的并行化效率。

TCN 的核心是使用一维膨胀卷积。标准卷积涉及一个滑动窗口,捕捉数据的局部依赖关系。在 TCN 中,这些卷积应用于时间轴上,以学习时间模式。

TCN 的有两个关键特性

因果卷积:为了确保时间步 t 的预测不受未来时间步的影响(这在许多序列任务中是至关重要的),TCN 使用因果卷积。这意味着对于每个时间步,输出仅依赖于当前和过去的步骤,保持了“因果”关系。

膨胀卷积:TCN 使用膨胀卷积有效地捕捉长程依赖性。膨胀在卷积核考虑的输入点之间引入了间隔。通过在每一层中指数级地增加膨胀系数,TCN 可以在不显著增加计算成本的情况下,覆盖较大的感受野。

TCN详细结构

TCN 由多层因果膨胀卷积组成,并伴随有残差连接,以提高训练的稳定性和收敛性。

残差连接:类似于 ResNet,TCN 经常使用残差连接,将层的输入与其输出相加,帮助网络在层之间保留信息,并改善梯度流。

堆叠层:可以堆叠多层膨胀卷积,以增加感受野。每增加一层,模型可以捕获越来越大的时间模式,通常膨胀系数在每一层呈指数增加。

所以,总的来看,相较于RNN,TCN有以下不同:

特性 TCN RNN (LSTM/GRU)
架构类型 卷积网络 循环网络
记忆处理 通过膨胀卷积捕捉长程依赖 通过记忆门(LSTM/GRU)
训练效率 高度并行化 顺序处理
梯度流动 稳定,较少出现梯度消失问题 可能出现梯度消失/爆炸问题
灵活性 可调节感受野 固定窗口大小

# TCN 实现
import torch
import torch.nn as nn

class TemporalBlock(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride, dilation, padding):
        super(TemporalBlock, self).__init__()
        self.conv1 = nn.Conv1d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv1d(out_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation)
        self.downsample = nn.Conv1d(in_channels, out_channels, 1) if in_channels != out_channels else None

    def forward(self, x):
        out = self.relu(self.conv1(x))
        out = self.relu(self.conv2(out))
        if self.downsample is not None:
            x = self.downsample(x)
        return out + x

class TCN(nn.Module):
    def __init__(self, num_inputs, num_channels, kernel_size=2):
        super(TCN, self).__init__()
        layers = []
        num_levels = len(num_channels)
        for i in range(num_levels):
            dilation = 2 ** i
            in_channels = num_inputs if i == 0 else num_channels[i-1]
            out_channels = num_channels[i]
            layers += [TemporalBlock(in_channels, out_channels, kernel_size, stride=1, dilation=dilation, padding=(kernel_size-1)*dilation)]
        self.network = nn.Sequential(*layers)

    def forward(self, x):
        return self.network(x)
        

TCN 是序列建模中 RNN 的一种强大替代方案,具有梯度稳定、并行化和捕捉长程依赖的优势。它们在时间序列和其他涉及长序列的任务中表现尤为出色。

通过将卷积架构与膨胀相结合,TCN 为许多序列任务提供了有效的解决方案,是深度学习工具箱中的一个重要工具。