[NIPS 2020] Supervised Contrastive Learning 핵심 리뷰

This entry is part 9 of 11 in the series Self Supervised Learning

1. 들어가며

이번 글에서는 2020년 NIPS에 발표된 Supervised Contrastive Learning 논문을 리뷰합니다. 이름에서 알 수 있지만 사실 이 논문은 Self Supervised Learning 방법은 아닙니다. Supervised Learning 방법에 해당하죠. 하지만 Contrastive Learning 을 사용하는 기존 Self Supervised Learning 방법에서 Label 정보를 사용할 수 있다면 어떻게 성능이 달라지는지 확인할 수 있는 재밌는 방법입니다.

이 글에서는 Supervised Contrastive Learning의 기본 원리부터 파이썬 코드로의 구현, 그리고 이 방법이 어떻게 다양한 응용 분야에서 활용될 수 있는지에 대해 자세히 알아보겠습니다. 이를 통해 레이블을 더 효율적으로 활용할 수 있는 새로운 방법론에 대해 이해해 보겠습니다.

2. 제안 방법

제안 방법은 아주 간단합니다.

2-1. 핵심 아이디어

먼저 Supervised Contrastive Learning 의 핵심 아이디어를 살펴볼게요.

그림1. Self Supervised Contrastive와의 차이
그림1. Self Supervised Contrastive와의 차이

기존의 Self Supervised Contrastive Learning 방법을 생각해보죠. 위 그림의 왼쪽에 해당합니다. 이 방법에서는 나의 Augmentation 된 이미지만 끌어당기고 나머지는 모두 밀어내도록 학습했죠. 그런데 이 부분을 한번 더 생각해 볼게요. 이렇게 학습하면 이 모델은 무엇을 학습하게 될까요? 나와 다른 특성은 모두 밀어내도록 학습되겠죠? 그런데 사실 같은 클래스에 속하는 이미지는 같은 특성으로 인식하도록 학습해야 하잖아요? 즉 나와 다른 이미지더라도 같은 강아지 클래스의 이미지라면 당기도록 학습하는게 맞지 않냐는거죠.

오른쪽 그림을 볼게요. 그래서 Supervised Constrastive 에서는 나의 Augmentation 된 이미지뿐만 아니라 동일한 클래스에 속하는 이미지도 끌어당기도록 학습합니다. 그림을 보면 기존 Self Supervised Contrastive 와 달리 강아지끼리는 모두 끌어당기도록 학습하는 모습을 볼 수 있습니다.

2-2. 수식

이제 수식으로 확인해볼까요? 기존 Self Supervised Contrastive Loss 수식은 다음과 같습니다.

Self-Supervised-Contrasctive-Loss-수식
그림2. Self Supervised Contrasctive Loss 수식

오직 나의 Augmentation 된 이미지만 Positive Pair 라고 말하고 있죠.

반면 Supervised Contrastive Loss는 이렇습니다.

Supervised-Contrastive-Loss-수식
그림3. Supervised Contrastive Loss 수식

‘같은 클래스라면 모두 Positive Pair 야’ 라고 말하고 있죠?

3. 파이썬 구현

이번 챕터에서는 파이썬을 사용하여 Supervised Contrastive Learning 방법을 직접 구현해 봅니다. 이 과정을 통해 위에서 살펴본 내용을 정확히 이해해 봅니다.

3-1. Import Module

먼저 필요한 Module들을 Import 해줍니다.

import torch
import torch.nn as nn
import torch.nn.functional as F

3-2. Supervised Contrastive Learning Class 정의하기

다음은 Supervised Contrastive Learning Class를 정의해줍니다. 기존 Contrastive Learning 과는 달리 Label을 보며 Loss를 계산하는 모습을 볼 수 있습니다.

class SupervisedContrastiveLoss(torch.nn.Module):
    def __init__(self, temperature=0.1):
        super(SupervisedContrastiveLoss, self).__init__()
        self.temperature = temperature

    def forward(self, embeddings, labels):
        # Normalize the embeddings
        embeddings = F.normalize(embeddings, p=2, dim=-1)

        # Compute the similarity matrix
        sim_matrix = torch.matmul(embeddings, embeddings.T)

        # Create the positive mask
        labels = labels.unsqueeze(1)
        positive_mask = torch.eq(labels, labels.T).float()

        # Create the negative mask
        negative_mask = torch.ne(labels, labels.T).float()

        # Compute the positive and negative similarity
        sim_ij = torch.exp(sim_matrix / self.temperature)
        exp_sim_matrix = torch.exp(sim_matrix / self.temperature)

        # Remove diagonal elements
        ind = torch.eye(labels.size(0)).bool().to(device)
        sim_ij.masked_fill_(ind, 0)
        exp_sim_matrix.masked_fill_(ind, 0)

        # Compute the loss
        sum_exp_sim_matrix = torch.sum(exp_sim_matrix, dim=1)
        pos_exp_sim_matrix = torch.sum(sim_ij * positive_mask, dim=1)
        loss = -torch.log(pos_exp_sim_matrix / sum_exp_sim_matrix)

        return torch. Mean(loss)

4. 실험 결과

Supervised Contrastive Learning 방식의 실험 결과를 살펴보겠습니다.

4-1.Classification 성능 테스트

첫 번째로 classification 성능 테스트 결과를 살펴보겠습니다.

classification-성능-테스ᄐ
그림4. Classification 성능 테스트

Self Supervised Contrastive 방식인 SimCLR보다 높은 성능을 내고 있네요. 심지어 전통적인 Classification Loss인 Cross Entropy 보다도 좋은 성능을 낸다는 점이 놀랍습니다.

4-2. Robustness

두 번째로, 실험 결과에 따르면 Self Supervised Contrastive 방식은 Corruption에 더 강인하며 데이터가 더 적을 때도 좋은 성능을 냅니다.

그림5. Robustness Test
그림5. Robustness Test

위 실험 결과를 보면 Cross Entropy 방식과 비교했을 때 mCE이 더 낮은 모습을 볼 수 있습니다. 오른쪽 그래프에서도 Corruption 수치가 올라감에 따라 Cross Entropy 모델들보다 성능 저하가 덜한 모습을 보입니다.

5. 의의

다음은 Supervised Contrastive Learning 논문의 의의를 살펴보겠습니다.

첫 번째는 Contrastive Learning과 Supervised Learning을 결합한 학습 방법을 제안했다는 점입니다. Supervised Contrastive Learning은 Contrastive Learning의 장점을 Supervised Learning에 적용합니다. 이로써 레이블이 있는 데이터를 더 효율적으로 활용할 수 있습니다. Contrastive Learning은 일반적으로 레이블이 없는 데이터에서 잘 작동하지만, Supervised Contrastive Learning은 레이블을 활용하여 같은 클래스의 샘플을 가깝게 배치하고 다른 클래스의 샘플을 멀게 배치합니다.

두 번째 의의는 Feature 추출 품질을 향상시켰다는 점입니다. Supervised Contrastive Learning은 레이블 정보를 사용하여 특성 공간을 더욱 의미있게 구성합니다. 이는 분류, 검색, 세분화 등 다양한 Down Stream 작업에서 더 좋은 성능을 달성할 수 있음을 의미합니다. 특히, 레이블이 있는 적은 양의 데이터가 있을 때, Supervised Contrastive Learning은 이를 최대한 활용하여 특성을 더 잘 추출할 수 있습니다.

이 두 가지 의의는 Supervised Contrastive Learning이 단순히 레이블을 활용하는 것을 넘어, Contrastive Learning과 Supervised Learning을 유기적으로 결합하여 더 효율적인 특성 추출과 더 높은 성능을 달성할 수 있게 하는 중요한 기술적 발전이라고 할 수 있습니다.

6. 마치며

Supervised Contrastive Learning은 레이블을 활용하여 특징 추출을 더욱 효율적으로 만드는 방법입니다. 이 방법은 특별한 Loss 함수를 사용하여, 같은 레이블을 가진 데이터끼리는 가까워지고, 다른 레이블을 가진 데이터끼리는 멀어지도록 학습합니다.

이러한 접근법은 모델이 더 강력하고 일반화된 특징을 추출하도록 도와줍니다. 이 글을 통해 이 방법의 중요성과 유용성을 이해하셨기를 바랍니다. Supervised Contrastive Learning은 레이블이 있는 데이터에서 특히 뛰어난 성능을 보이며, 다양한 응용 분야에서 활용될 수 있습니다.

Series Navigation<< [CVPR 2020] Momentum Contrast for Unsupervised Visual Representation Learning (MoCo) 핵심 리뷰[NIPS 2020] Bootstrap Your Own Latent A New Approach to Self-Supervised Learning (BYOL) 핵심 리뷰 >>
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
Scroll to Top