수학/딥러닝 이론

[딥러닝] Computer Vision과 NLP에서의 attention 함께 살펴보기

AI 꿈나무 2021. 6. 24. 17:16
반응형

 안녕하세요, 최근에 NLP를 공부하고 있는데, CV에서 사용하는 attention을 생각하고 NLP의 attention을 공부했더니 이해가 잘 안되더라구요 ㅎㅎ 두 분야의 attention을 함께 살펴보도록 하겠습니다.

 

Computer Vision

 CV에서 attention은 피쳐맵에서 픽셀 또는 채널 간 중요한 요소를 계산하여 중요도에 따른 가중치 정보를 담은 attention vector를 생성합니다. 그리고 이 attention vector를 피쳐맵에 곱하여 가중치를 가하죠. 대표적으로 SENet, CBAM, SKNet이 있습니다.

 

 SENet을 잠시 살펴보면 피쳐맵에서 채널 간 가중치를 계산하여 이 가중치를 피쳐맵에 element-wise로 곱합니다.

 

 

class SEBlock(nn.Module):
    def __init__(self, in_channels, r=16):
        super().__init__()
        self.squeeze = nn.AdaptiveAvgPool2d((1,1))
        self.excitation = nn.Sequential(
            nn.Linear(in_channels, in_channels // r),
            nn.ReLU(),
            nn.Linear(in_channels // r, in_channels),
            nn.Sigmoid()
        )

    def forward(self, x):
        x = self.squeeze(x)
        x = x.view(x.size(0), -1) 
        x = self.excitation(x)
        x = x.view(x.size(0), x.size(1), 1, 1)
        return x

 

 CBAM도 잠깐 살펴보자면, 피쳐맵에서의 채널, 픽셀 간 가중치를 계산합니다.

 

 

 CBAM과 SENet은 마지막에 sigmoid를 거쳐서 0~1 값을 갖는 attention vector를 생성하는데, 이를 기존의 피쳐맵에 element-wise로 곱하여 가중치를 가합니다.

 

NLP

 nlp에서 attention은 encode의 정보를 가져오는 용도로 사용합니다. CV에서의 attention과의 가장 큰 차이점은 attention vector를 encode output과 행렬 곱하여 가중치를 적용합니다. 그리고 이 가중치가 적용된 행렬을 decode embedding과 concat하여 rnn으로 전달합니다.

 

 nlp에서 attention vector를 계산하는 과정을 살펴보겠습니다. 우선 encode output과 decode의 이전 hidden state를 사용하여 energy를 계산합니다.

 

 

 energy를 계산할 때는 fc layer와 tanh 활성화함수가 사용됩니다.

 

 이 energy에 fc layer를 거쳐서 attention vector를 계산합니다.

 

 

 여기에 softmax 함수를 거쳐서 값의 범위를 0~1로 조절합니다.

 

 이 attention vector의 차원은 [batch, src len] 입니다. 즉, decode의 이전 히든스테이츠와 가장 관련성이 높은 encode output의 가중치를 계산합니다. 그리고 이 attention vector를 encode output과 matmul 연산을 수행해 weight vector를 생성합니다. encode output의 차원은 [batch, src_len, encode_hidden_dim *2] 입니다. 앞에서 bi-rnn을 사용했기 때문에 encode_hidden_dim * 2의 차원을 갖습니다.

 

 

 이 weighted vector를 decode embedding과 concat하여 rnn에 입력값으로 입력합니다. 이는 decode embedding과 가장 연관있는 encode output을 함께 입력하는 것으로 생각해볼 수 있습니다. weighted vector의 차원은 [1, batch size, encode_hidden_dim * 2]를 갖고, decode embedding의 차원은 [1, batch, emb_dim] 입니다.

 

반응형