Self-supervised Learning

이번에 리뷰할 논문들은 모두 Self-supervised Learning 관련입니다. 예전부터 관심을 가지던 분야기도 했었고, 조만간 관련 분야로 연구를 할 수도 있을 것 같아서 공부를 하고 있습니다. 물론 황유진, 홍주영 연구원님들이 예전에 리뷰를 작성했던 논문들이지만 저 스스로 공부해보고자 이번에 리뷰로 작성하게 되었습니다.

Self-supervised Learning

먼저 Self-supervised Learning에 대해서 간략하게 해당 테스크의 정의 및 목표를 다루고자 합니다. 해당 분야의 가장 큰 motivation은 바로 supervised learning이 성능은 참 좋지만, 결국 데이터 셋에 맞는 label을 사람이 직접 취득을 해야하기 때문에 시간적으로, 인력적으로 노동력이 많이 집약되게 됩니다.

이러한 human supervision 없이 방대한 양의 unlabeled dataset으로 모델을 학습시키는 unsupervised learning 쪽 연구의 필요성은 매우 높아졌으며 이 중에 하나가 바로 Self-supervised Learning입니다. Self-supervised Learning의 종류는 다양하지만 결국 공통점은 바로 pretext task라는 것을 정의해주어야만 합니다. 이 pretext task란 모델이 어떠한 human supervision 없이 모델의 representation 능력을 학습시키기 위한 임의의 학습 task를 의미하며, 기존의 Self-supervised Learning에는 크게 Generation 방식 그리고 Discrimination 방식이 존재 했었습니다.

그림1. Generation based self-supervised learning

간략하게 소개하면 Generation 방식은 그림 1의 Image Colorization, Image Inpainting과 같이 RGB 영상만 있으면 쉽게 GT를 구할 수 있는 분야(즉, RGB 영상이 하나 있으면 grey-scale 영상과 color를 쉽게 추출할 수 있으며, inpainting의 경우에도 masking한 영역에 대한 GT를 원본 RGB에서 쉽게 구할 수 있음)에 대해 학습을 하여 CNN Encoder를 다른 down-stream task에 활용하는 것입니다.

하지만 이러한 Generation 방식은 겉으로는 그럴 듯 해보이지만 여러가지 단점 및 의문점이 존재합니다. 하나는 pixel-level generation을 학습하는 과정 자체가 결국 Encoder 뿐만 아니라 Decoder도 따로 학습을 해야하기에 학습 시간 및 메모리 측면에서 많은 비용이 들며 딱히 Encoder의 representation learning을 수행하는데 있어 pixel-level generation이 유의미한지도 애매한 것이죠.

두 번째로는 Discrimination 방식으로 이는 Generation 분야처럼 추가적인 Decoder를 통해 무언가를 생성하는 것이 아니라 Encoder를 통한 분류 과정만을 pretext task로 삼는 것을 의미합니다. 해당 분야로는 정말 다양하게 존재하지만 가장 대표적으로는 크게 영상이 몇도 회전했는지에 대한 4진 분류하는 것이 있습니다.

Training Data for Geometric Transformation
그림2. Discrimination 방식의 self-supervised learning 예시.

어처피 RGB 영상에 대해서 rotation 하는 것은 저희가 코드 한줄이면 쉽게 수행할 수 있기 때문에 label을 쉽게 취득할 수 있으며 모델은 입력 영상에 대해서 해당 영상이 얼만큼 회전했는지 4개의 클래스(0도, 90도, 180도, 270)에 분류를 수행해야만 합니다.

이러한 Discrimination 방법들의 pretext task의 경우 대부분 휴리스틱한 방식 즉 체계적으로 설계된 수학적인 공식 혹은 분석이 아닌 대략적인 어림짐작?(대충 이렇게 하면 좋지 않을까?)하는 방식으로 설계된 것이 많기 때문에 이렇게 학습된 모델의 경우 generalization 측면에서 많이 부족할 수 있습니다.

따라서 현재는 위에서 설명드린 방식들이 아닌 새로운 관점에서 접근한 논문들이 새로 생기는데 가장 대표적으로 contrastive learning을 활용한 방식입니다. contrastive learning은 다들 아시겠지만 anchor, positive, negative가 존재한다고 했을 때 anchor와 positive는 가까이, anchor와 negative는 멀어지도록 학습시킴으로써 모델이 각 class별로 유사한 직군과 그렇지 않은 직군들 사이에 차별점을 학습할 수 있도록 합니다.

물론 이러한 contrastive learning 역시 무엇을 anchor와 positive 관계인지, negative 관계인지 알아야하기 때문에 label과 같은 supervision이 필요할 수 있으나, pretext task처럼 저희가 임의의 label을 제공함으로써 positive와 negative를 구분할 수도 있습니다.

이러한 self-supervised conrastive learning 방법론은 또한 영상을 feature level로 변환시켜주는 encoder, 각각의 feature vector 사이에 유사도를 계산하는 유사도 메트릭이 필요합니다. 여기서 encoder의 경우에는 저희가 학습시키고자 하는 CNN 모델이 될 것이며, vector 사이에 유사도를 계산하는 방식으로는 cosine similarity 등을 활용할 수 있습니다. 보다 자세한 내용들은 아래에서 다뤄보도록 하죠.

Simple Framework for Contrastive Learning of Visual Representations

일단 먼저 소개드릴 논문은 SimCLR 이라고 부르는 방법론입니다. 해당 논문은 예전에 홍주영 연구원님이 x 리뷰로 작성했었으며 제가 이번에 작성할 리뷰에서는 최대한 간결하게 작성을 해보고자 합니다.

SimCLR은 가장 먼저 positive와 negative pair를 나누기 위해 하나의 영상에 대해 2가지 data augmentation을 취합니다. 이중 하나는 anchor 혹은 query이며 나머지는 key image가 됩니다. 이 key image는 query image와 동일한 영상에 대해 서로 다른 augmentation을 취했기 때문에 조금 다르게 생기긴 했지만 positive 관계로 볼 수 있습니다.

Random Augmentation on Image
그림3. Data augmentation을 통하여 query와 positive image pair를 생성.

그럼 negative pair는 어떻게 구할 수 있을까요? negative pair는 하나의 미니배치 내에서 자기 자신을 제외한 다른 배치 영상들이 모두 negative image로 활용됩니다. 즉 배치 사이즈가 256이라고 가정했을 때, 15번째 이미지에 대해 positive는 15번째 이미지에 대하여 data augmentation을 취한 영상이 되는 것이며, 그 외에 negative image들은 15번째 이미지를 제외한 모든 이미지에 data augmentation을 취한 영상들이 되는 것입니다.

Augmenting images in a batch for SimCLR
그림4. 배치가 2라고 했을 때, 배치 내 영상들은 모두 DA를 통하여 2장의 영상을 생성함. 즉 배치가 N일 때 2N개의 영상이 생성. 고양이 영상에 대하여 pair1이 positive pair라면 pair2의 영상들은 모두 negative pair가 되는 것.

자 이렇게 positive pair와 negative pair를 구성했다면 이젠 contrastive learning을 수행하기 위해서 영상으로부터 feature vector를 추출해야 합니다. CNN 혹은 transformer와 같은 저희가 self-learning 하기 위한 encoder에 태워서 feature vector(h)를 추출해줍니다. SimCLR에서는 Encoder로 Resnet-50을 활용하여 2048길이의 vector를 추출했다고 합니다.

Encoder part of SimCLR
그림5. 학습시키고자 하는 Encoder를 통해 영상으로부터 feature vector를 추출해준다.

자 그럼 이제 그림5의 표현을 빌려 query image를 x_{i} , key image를 라고 했을 때, 각각의 feature vector를 [latex] h_{i}, h_{j} 라고 놓을 수 있습니다. 그럼 contrastive learning을 위해서 이 h_{i}, h_{j} 둘에 대하여 거리를 계산하고 이 거리를 줄여나갈 수 있을 것입니다.

하지만 SimCLR에서는 h를 곧바로 contrastive loss를 계산하는데 활용하지 않고 추가적인 Projection layer를 태워서 z라는 새로운 latent space로 투영시킵니다. 그리고 이 z embedding vector들 끼리 유사도를 계산하는 방식으로 모델을 학습하죠.

Projection Head Component of SimCLR
그림6. projection head를 통해 h를 z로 변환 후 유사도를 계산.

이러한 방식을 채택한 이유는 결국 self-learning의 목적인 좋은 representation을 담은 h 벡터는 그 역할을 온전히 다 하기 위하여 해당 h로 유사도를 계산하지 않고 따로 유사도 계산을 위한 새로운 vector를 학습하기 위함입니다. 즉 말 그대로 z는 유사도 계산을 위한 목적, 그리고 h는 영상의 좋은 표현력을 담은 vector로써 downstream task에서 z가 아닌 h를 활용하는 것이죠. 실제로 저자는 특정한 downstream task을 수행할 때 h와 z 각각을 입력으로 평가하였을 때 h를 활용하는 것이 downstream task에서 더 좋은 결과를 달성했다고 합니다.

조금 더 구체적으로 Color 영상인지 흑백 영상인지? 혹은 영상이 회전됐는지? 또는 원본 영상인지 소벨 필터가 적용된 영상인지 등 단순한 이진 분류 문제를 푼다는 관점에서 g(h) 즉 projection head를 통과한 z 벡터를 활용했을 때 보다 CNN 인코더 자체에서 나온 h를 활용하는 것이 더 좋은 결과를 달성했다고 합니다.

저자는 이러한 경향성이 발생한 이유에 대해서 결국 anchor와 positive pair는 동일 영상에 대해서 data augmentation을 각각 다르게 취한 영상이기 때문에 차이점이라고 한다면 영상에 어떠한 transformation 차이만 있는 상황으로 볼 수 있습니다. 하지만 결국 두 영상은 positive pair이므로 loss 계산을 통해 서로의 벡터가 유사해야한다는 제약이 걸려있으므로 projection head를 타고 나온 z는 이러한 영상의 transformation에 강건한 성질을 지니게 됩니다. 따라서 이 영상이 Color인지 흑백인지 또는 원본 영상인지 소벨 필터를 적용한 엣지 영상인지 등은 영상의 transformation 종류들 중 하나로 볼 수 있으므로 z를 통하여 이러한 영상의 변환 등을 분류하는 것은 상당히 어려워지는 것이죠.

또 한가지 중요한 점으로, projection head는 모델의 성능에 상당히 중요한 결과를 끼칩니다. 아래 그림 7을 살펴보시면 가장 우측 초록색의 경우 z가 아닌 h를 통해서 유사도를 계산하게 될 경우 영상 분류 성능이 상당히 감소하는 것을 볼 수 있습니다. 그리고 FC layer 하나만 있는 경우 없는 것보다는 성능 향상이 크긴 하지만 해당 논문에서는 Non-linear 즉 2개 이상의 MLP로 구현할 경우 더 좋은 성능을 달성할 수 있었다고 합니다.

그림7. Projection의 차원, 적용 여부, 종류 등에 따른 Top-1 error

해당 논문의 학습 과정에 대해서는 대부분 다루었기에 이제 정량적 결과에 대해서만 가볍게 다루고 다음 논문으로 넘어가겠습니다. 일단 NCE loss를 통해서 contrastive learning을 수행하는 것이 이 논문의 주요 목적 함수이며, 그렇기 때문에 저자는 Batch size를 키움으로써 negative sample을 더 많이 보도록 학습할 경우 모델의 성능이 크게 향상된다고 주장합니다.

위에 그래프는 y축이 모델의 분류 정확성, x축이 학습 에포크 수, 각각의 막대바가 legend에 나와있듯이 배치 사이즈를 의미하며 학습을 얼마나 길게 하는지 그리고 배치 사이즈를 어떻게 하면 성능이 좋은지를 나타낸 것입니다. 결론부터 말씀드리면 학습 길이를 늘리고 배치 사이즈를 키우면 모델의 성능이 꾸준히 증가하는 것을 볼 수 있습니다. 특히나 배치가 256일 때와 8192개일 때의 성능 차이가 큰 것을 쉽게 볼 수 있는데 이는 contrastive learning에서 negative sample 개수의 효과에 대해 잘 알려주는 실험 결과로 볼 수 있겠습니다.

위에 그림은 최종적으로 다른 방법론들과 비교해서 제안하는 SimCLR이 어떠한 GT 없이 self-supervised learning만으로 Supervised 성능을 달성했다! 라는 결과를 나타내는 것인데 사실 여기에는 한가지 눈속임이 있습니다. 바로 SimCLR 표기 옆에 붙어있는 2x 4x인데 이는 바로 모델의 크기를 의미합니다.

즉 같은 사이즈의 모델의 경우에는 SimCLR이 약 68~69% 정도의 top-1 accuracy를 지니고 있으며 Supervised 학습 방식의 성능은 약 76%정도로 아직까지 성능 차이가 많이 존재합니다. 다만 기존 Resnet50보다 4배 더 큰 모델에서 학습을 하게 될 경우는 Supervised 모델과 유사한 성능을 달성할 수 있다고 하죠. (물론 Supervised 모델도 4배 더 큰 모델로 학습하면 더 좋은 성능을 달성하겠지만요)

Momentum Contrast for Unsupervised Visual Representation Learning

SimCLR에 대한 리뷰는 이정도로 마치고 그 다음으로는 MoCo라고 부르는 논문에 대해서 가볍게 다뤄보겠습니다. moco 논문에서 제기하는 문제점은 대략 아래 그림을 통해서 설명할 수 있을 것 같습니다.

그림8. 3가지 contrastive loss 방식의 컨셉 비교 그림.

먼저 제일 좌측은 위에서 다룬 SimCLR과 유사한 방식의 학습 기법으로 query image와 key image에 대해 각각 encoder를 태워서 query, key에 대한 feature vector를 생성합니다. 그리고 이 feature vector에 대해 projection head를 태우고 나서 나온 결과로 similarity를 계산하는 식으로 학습하죠.

이러한 학습 방식은 좋은 성능을 보장하였지만 아시다시피 SimCLR의 경우 배치 사이즈가 커지면 커질수록 성능이 더 높아지는 것을 볼 수 있었습니다. 그래서 막 256부터 실험을 시작해서 8192개의 배치사이즈를 가지고 모델을 학습시키곤 했었는데 이것이 구글이라서 가능한 것이지 사실 개인이 돌리기에는 너무나 터무니없는 배치 사이즈이긴 합니다.

따라서 MoCo 저자는 배치 사이즈를 통해 많은 양의 메모리가 필요로 모델 학습에 많은 제약이 존재한다고 합니다. 또한 추가적으로는 SimCLR의 경우 2개의 인코더를 통해서 query와 key를 각각 추출 및 역전파 계산이 되기 때문에 두 인코더가 서로 다른 경향을 보일 수 있다고 합니다.

그림 8의 두 번째 방식의 경우에는 메모리 뱅크로부터 샘플링하여 키 데이터를 추출하기 때문에 negative sample을 선정하는 방식에서 inconsistent가 발생한다고 합니다. 제가 이해한바로는 엄청 방대한 데이터에서 N개만을 추려가지고 학습을 수행하는데 이 때 이 추리는 과정(sampling)에서 불확실성이 발생한다?라는 것인데 조금 모호하네요.

아무튼 결과적으로 논문에서는 이러한 large batch size를 통한 memory issue 및 negative sample 계산 시 사용하는 sampling의 inconsistent 문제를 해결하기 위해서 Momentum Encoder와 negative sample을 위한 dictionary를 제안합니다.

쉽게 생각하면 query 영상에 대해서는 학습 가능한 encoder를 활용하며, key를 계산하는 encoder의 경우에는 query encoder의 파라미터에 대한 momentum-updated encoder를 활용하는 것이죠. 또한 negative sample을 담당하는 dictionary 같은 경우에는 매 학습 iteration마다 이전에 사용했던 key batch를 다음 iteration의 negative pair로 활용하기 위해 사전에 저장하고, 가장 오래된 key의 경우에는 다시 제거하는 등 학습 과정때마다 새롭게 dictionary를 update하면서 동시에 momentum encoder를 통하여 예전에 봤던 negative pair의 경향성은 유지하는 방식을 통해 적은 수의 배치 사이즈임에도 불구하고 negative pair의 수를 늘리는 효과를 불러올 수 있었다고 합니다.

그 과정에 대해서 조금 더 자세히 살펴보겠습니다. 먼저 SimCLR과 동일하게 어떤 영상 x가 있으면 먼저 각각 서로 다른 data augmentation을 취해서 query와 key image를 생성합니다.

그럼 이제 query image는 일반적인 encoder에, key image는 query encoder의 파라미터 정보를 통해 계산된 momentum encoder에 입력으로 넣어 각각 query와 key vector를 생성합니다. 이때 두 벡터는 서로 positive pair이기 때문에 유사도 계산 시 가까워지도록 학습이 되겠죠. 유사도 계산을 위해 단순하게 q와 k 사이에 행렬곱 연산을 수행해주고 이때의 결과는 N \times c \times c \times 1 == N \times 1이 됩니다. 여기서 N은 배치 사이즈를, c는 feature vector의 차원을 의미합니다. 즉 positive pair에 대해서 계산된 벡터는 Nx1짜리 어떠한 값이 생성됩니다.

반면 negative pair의 경우에는 어떠한 dictionary 안에 key 집합들이 존재하게 됩니다. 즉 C \times K 의 형태를 지니는 값이 존재로 하는데 이는 K개의 key가 c개만큼 있다는 것을 의미합니다. 그러면 negative pair는 query vector와 이 key dictionary 사이에 행렬곱을 통해 N \times C \times C \times K == N \times K 의 행렬이 생성됩니다.

그럼 결과적으로 위에 그림과 같이 positive pair를 통해 계산된 N \times 1 과 negative pair로 계산된 N \times K 에 대해서 K축으로 concat을 해주면 N개의 배치 사이즈에 대하여 K+1길이의 similarity score map을 생성할 수 있습니다.

여기서 맨 앞 줄의 값들이 바로 positive pair이고 그 외에는 다 negative pair이기 때문에 저희가 쉽게 label을 positive와 negative pair에 대한 label을 제공할 수 있으며 이를 통하여 SimCLR와 동일하게 Info NCE loss로 contrastive learning을 수행하게 됩니다. 위에 과정을 수도 코드로 나타내면 아래와 같습니다.

그럼 이러한 MoCo의 방식이 얼마나 장점이 있는지 처음 문제정의 할 때 언급된 2가지 방법론과 비교를 해보겠습니다.

여기서 end-to-end 방식은 SimCLR 방식으로 해당 방법론은 성능은 좋지만 negative pair의 샘플 수를 4096 이상으로 키웠을 때 모델 성능이 나타나지 않는 모습입니다. 그 이유는 당연히 구글같은 큰 회사에들만 가능한 대용량 배치 사이즈 학습 방식이기 때문에 불쌍한 논문의 저자는 성능을 내지 못한 것 같습니다ㅎㅎ..

그리고 memory bank 방법론은 negative sample의 수를 65536개까지 늘릴 수 있었으나, 성능적인 측면에서 감소하는 것을 볼 수 있습니다. 이는 샘플링 과정에서 발생하는 inconsistent문제라고 합니다. 하지만 논문에서 제안하는 MoCo의 경우에는 momentum encoder를 통해 이러한 문제도 해결하고 dictionary 구조로 memory bank까지 모방하는 덕분에 네거티브 샘플의 개수도 크게 늘리고 모델의 성능도 크게 향상시켰다고 저자는 주장합니다.

물론 논문에서 제안하는 Momentum encoder 방식과 dictionary 타입의 negative sampling 방식은 SimCLR에서 발생할 수 있는 문제점을 해결해주는 좋은 기법인 것은 맞으나 사실 이 둘만 가지고서는 self-supervised model의 representation 성능을 향상시킨 것은 아니라고 합니다. 위에 기법을 총칭해서 MoCo1이라고 했을 때 SimCLR에서 제안하는 MLP projection head, augmentation 방법, cos similarity 등등을 적용하였을 경우 SimCLR을 뛰어넘는 성능을 달성할 수 있었다고 합니다. 그리고 이것을 MoCoV2라고 명칭하고 있네요.

결론

이번에 소개드린 논문들은 대부분 CNN 모델에 대해서 Contrastive learning을 하는 Self-learning 논문들의 대표격들을 다뤄보았습니다. 다음 리뷰로는 지금과는 결이 조금 다르게 Dino라고 부르는 ViT에 대한 Self-supervsied Learning과 영상의 masking 과정을 통한 mask self-supervised learning? 이름은 기억은 안나는데 아무튼 그 논문에 대해서 읽고 정리해보려고 합니다. 두 방법론은 제가 알기로 모두 ViT를 가지고 Self-learning을 수행하고 있는데 성능이 매우 좋다고해서 관심있게 봐야할 것 같습니다.

Author: 신 정민

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다