보통 음성혹은 주가 같은 시계열 데이터를 처리하기 위해 RNN계열의 알고리즘을 사용했습니다.
RNN계열의 특징은 네트워크의 가중치를 반복적으로 사용해서 시간순서를 모델링하는 것입니다.
그러나 여기서 문제가 생기게 됩니다.
RNN은 가중치를 반복적으로 호출하기 때문에 뒷부분의 결과를 내기 위해서는 반드시의 앞의 결과가 나올때까지 대기해야 합니다.
또한 매 층 마다 같은 타임 스텝을 이용해야 하기 때문에 시야가 고정적이라는 단점도 갖고 있습니다.
물론 dilated RNN같은 모델이 제안되었지만 여전히 stacked RNN구조에서 dilation을 다양하게 섞을 수는 없었습니다.
TCN(Temporal Convolutional Metwork)은 이런 RNN의 단점을 해결하고자 등장한 모델로
dialted convolution을 이용해 시계열 정보를 처리하는 모델입니다.

TCN

우선 TCN의 구조를 살펴봅시다

TCM의 구조, 층이 깊어질수록 dilation이 커진다

위 그림에서 시간은 왼쪽에서 오른쪽으로 흐르고 층은 아래에서 위로 쌓이게 됩니다.
층이 깊어질수록 dilation이 점점 커지는 것을 확인할 수 있습니다.
층이 깊어질수록 dilation을 크게하는 이유는 입력층에 가까울 수록 local information이 중요하고
층이 깊어짐에 따라 점점 temporal imformation, 즉 순서정보를 학습하기 위함입니다.

TCM을 여러층 쌓아 만든 TCNN 모델이 음성처리에 사용되는 예시

위에서 보여드린 예시는 TCM을 음성처리에 이용하는 모델입니다.
인코더와 디코더는 음성의 특징을 추출 및 복원하는 네트워크입니다. 가운데 TCM이 여러층 쌓아져 있으며
순서정보는 이 단계에서 학습됩니다.
처음 등장한 TCM은 동영상을 처리하기 위해 등장했기 때문에 TCM의 활용도는 task에 맞게 설정하시면 됩니다.

코드 구현(Pytorch)

TCM의 구조

앞서 말씀드린 TCNN에서 사용되는 TCM의 구조입니다.
마찬가지로 task에 따라 얼마든지 변형이 가능합니다.

import torch
import torch.nn as nn


class TCM(nn.Module):
    def __init__(self, in_channels, out_channels, dilation=5, kernel_size=3):
        super(TCM, self).__init__()

        self.c1 = nn.Conv1d(in_channels, out_channels, kernel_size=1)
        self.c2 = nn.Conv1d(out_channels, out_channels, kernel_size=kernel_size, dilation=dilation, padding=dilation)
        self.c3 = nn.Conv1d(out_channels, in_channels, kernel_size=1)

        self.bn1 = nn.BatchNorm1d(num_features=out_channels)
        self.bn2 = nn.BatchNorm1d(num_features=out_channels)

        self.prelu1 = nn.PReLU()
        self.prelu2 = nn.PReLU()

    def forward(self, x):
        x_ = x
        x = self.c1(x)
        x = self.prelu1(x)
        x = self.bn1(x)
        x = self.c2(x)
        x = self.prelu2(x)
        x = self.bn2(x)
        x = self.c3(x)

        x = x + x_

        return x


model = TCM(in_channels=64, out_channels=128)
input_tensor = torch.zeros(1, 64, 100)
print(model(input_tensor).shape)

 


WRITTEN BY
텐초
딥러닝 관련 논문들과 코드를 완벽분석 합니다

,