CV-001, Selfie: Self-supervised Pretraining for Image Embedding (2019-Arxiv)

첫 번째 글로 CV 분야는 NLP 포스팅과 다르게 정리 순으로 포스팅을 한다.. 
실제로 나는 CV을 첨으로 접하고 기본으로 LeNet, ImagNet, GoogLeNet, ResNet, DenseNet, R-CNN 계열, Yolo, FCNN 등등 수 많은 논문들을 보고 task-specific하게 논문들을 읽어갔다. 개인적으로는 visual odometry을 집중적으로 연구했었기 때문에 camera pose , FlowNet(opticla flow), Depth estimation 등등 관련해서 보았다.
하지만 이 많은 논문들을 다 정리하고 selfie을 정리하는 것은 시간상 답이 없기 때문에... 앞의 유명한 논문들은 다른 잘 정리한 자료들 검색해서 보도록 하자.
---------------------------------------------------------------------------------------------------

참고

  • Selfie: Self-supervised Pretraining for Image Embedding은 NLP에서 최근 대세인 BERT의 개념을 알고보면 더욱 읽기 쉬울 것이다.
  • BERT을 모른다면 그전의 attention is all u need에서 말하는 포스팅들만은 적어도 읽고 self-attention 개념정도는 파악하고 이 논문을 읽길 추천한다.

0. Abstract

  • Supervised-learning을 하여 좋은 성능을 내기 위해서는 많은 labeled data가 필요하게 된다.
  • 따라서 unsupervised representation learning을 통하여 성능을 올리는 것은 데이터의 효율성 측면에서 중요하고 이는 open challenge이다.
  • BERT에 대한 간략한 설명 생략
  • BERT는 언어 모델로 discrete space을 다루기 때문에 이미지에 바로 적용하기는 어렵다.
    • 이러한 이미지 도메인과의 간극을 줄여서 pretraining하는 것이 성공의 열쇠라고 가정한다.
  • 이 논문에서는 Selfie (SELF-supervised Image Embedding)이라는 것을 제안하여 BERT을 continuous 공간에 적용한다.
    • 이미지에서 작은 변화가 일어났을 때, classification loss는 regression loss보다 덜 민감하기 때문에 classification loss을 사용한다.
    • BERT와 비슷하게, 이미지의 일부분을 masking을 하고 기존 이미지에서 reconstruction 하는 방향으로 간다.
    • classification loss을 사용하기 위해, distractor patch을 같은 이미지에서 샘플링을하고 모델이 target masked locatioin에 맞는 patch를 채울 수 있도록 한다.
  • 실험에서 Selfie가 labeled된 데이터가 적을 때 특별히 효과가 있음을 보여준다.
    • CIFAR-10, ImageNet 32x32, 224x224에서 데이터 양을 5%~100%으로 바꿔가면서 실험하면서 성능을 입증했음
    • 또한 ImageNet 224x224에서 unlabeled가 labeled 데이터보다 10배 이상 많을 때, self-supervised pretraining이 효과가 있음을 보여준다.

2. Method

  • 그림 1이 사실 방법의 전부이다.
  • Step 1
    • 모델을 unlabeled data로 pretrain한다.
  • Step 2
    • Target supervised task로 finetune한다.
    • 그림에서 P라고 써있는 블록을 step 1에서 학습을 하여 초기화하는 것이고 전체 부분을 fine-tune 한다고 생각하면 된다.
  • Step 1, patch processing network pretraining 과정을 보자.
    • patch당 하나의 feature vector을 encoder와 decoder에서 생성한다.
    • Encoder에서는 patch feature vectors끼리 attention pooling network을 통과하여 single vector u을 생성한다.
    • Decoder에서는 v(u+position embedding k와 patch feature vectors(h1, h2, h3)와 내적을 통한 후, softamx을 거쳐 score값을 거친다.
    • 이 score값으로 classification을 하는 과정으로 학습이 진행이 된다.
    • 여기서 어떤 것이 정답인 지는 그림을 보듯이 position embedding k가 무엇이냐에 따라 다르다.
    • 즉 그림처럼 masking patch가 3개이고 k가 patch 4라면, distractor patch의 정답은 4가 되어야하니까 [1,0,0]이 되어야 한다.
    • 만약 k가 patch 3이라면, [0,0,1]이 되어야 하는 식!

2.1 Pretraining Details

  • Figure 1을 기준으로 설명을 한다.
  • Encoder의 입력으로는 Patch1, Patch2, Patch5, Patch6, Patch7, Patch9가 들어간다.
  • Decoder의 입력으로는 Patch3, Patch4, Patch8가 들어간다.
  • Masking되는 패치들은 랜덤인지 아닌지에 따라 다르다.
  • Encoder에서는 single vector u 을 도출한다.
    • 그리고 u vector와 masking된 패치들 중 random으로 선택하여 (ex. 4 patch) 그 patch에 대한 location embedding(ex. 4)을 더해서 v vector을 만든다.
  • Decoder에서는 h1, h2, h3의 output vectors을 도출한다.
  • v vector와 h와 dot product을 통하여 cross entropy을 통하여 classification task을 적용한다.
    • classification loss을 통하여 encoder와 decoder에 해당하는 P을 같이 학습하는 것
  • 즉 masking 안된 patch를 이용하여 masking된 패치를 맞추는데, pixel 값을 맞추는 개념이 아니라, 여러 개의 masking patch 중, position embedding된 patch을 맞추는 개념이다.
  • pretraining process동안 encoder은 생성된 vector u에 이미지의 입력의 압축된 정보를 담아 masking patch를 복구할 수 있도록 해야 한다.
    • 이러한 정보는 missing patch의 global과 local의 위치관계에 관한 것을 담고 있어야 한다.

2.1.1 Patch sampling method

  • 32x32 이미지에서는 patch size을 8로 설정하였다.
    • 즉 4x4 grid을 만든 셈
  • 224x224 이미지에서는 patch size을 32x32로 설정하였다.
    • 즉 7x7 grid을 만든 셈
  • Patch size는 image에서 크기를 균등하게 나는데, random성을 추가하기 위해 원래 이미지(32x32)에 4-padding을 붙여서 36x36을 만든다.
    • 그 다음 32x32로 무작위로 자른 후, 이를 patch로 쪼개는 것

2.1.2 Patch processing network

  • 이 연구에서는 ResNet-50을 기본 모델로 unlabeled data로 성능을 향상시키는 것이다.
  • Patch processing network P는 ResNet-50의 앞에 3개의 block만을 사용하는 것이고 이를 통해 patch를 single feature vector로 만드는 것이다.
  • convolution만 통과하면 vector가 형성이 되는 것은 아니기 때문에, 마지막에 average pooling across the spatial dimensions of the output of ResNet-36을 하게 된다.
    • 여기서 말하는 ResNet-36은 ResNet-50의 앞의 3개 블락을 의미하는 것임.

2.1.3 Efficient implementation of mask prediction

  • Figure 1에서의 예시를 들어보자면, patch 4가 정답으로 하여 한 번 학습할 수 있다.
  • 하지만 이미 patch encoding은 다 계산 해놨기 때문에 효율을 위하여 patch 3, 8이 정답이라고 해서 2번더 학습할 수 있다.
    • 즉 positional embedding 부분만 바꾸면 되니까
    • 이러면 3배 계산적으로 이득이다.

2.2 Attention Pooling

2.2.1 Transformer as pooling operation

  • 먼저 patch processing network을 통하여 h1,...,hn으로 patch n개에 대한 vector을 생성을 하자.
  • 여기서의 목표는 h1,...,hn으로 u vector을 만드는 것이다. 쉽게는 max-pooling, average pooling 등을 이용할 수 있지만 attention operation을 이용한다.
  1. h1,...,hn으로 u0을 생성한다.
    • temperature softmax을 이용해서 한다.
    • 정확한 과정은 안써있지만, 추측으로는 h1~hn을 s1~sn으로 하나의 scalar값으로 matrix 곱을 통해 만든다.
    • 그 다음 scalar끼리 temperature softmax해서 weight을 구하고 이걸 이용하여 h1,...,hn의 weighted sum을 통해 같은 차원인 u0을 생성한다.
    • h의 output은 버리고 u만을 가져가서 최종 vector로 사용한다.
    • 여기서 TransformerLayers은 BERT 논문에서 사용한 self-attention layer matrix을 이용한 것 처럼 통과시킨다는 것이다.

2.2.2 Attention block

  • BERT attention block 설명
    • Q,K,V에 대해 간략히 설명하는데 이 부분은 BERT posting 부분을 참고하시는게 좋다.
  • Dropout rate는 0.1 사용하였고 residual connection을 하였고 마지막 layer에는 normalization을 하였음.

2.2.3 Positional embeddings

  • 32x32 이미지에서는 patch size을 8x8로 4x4 grid, 총 16개에 대한 positional embedding 필요
  • 224x224 이미지에서는 patch size을 32x32로 7x7 grid, 총 49개에 대한 positional embedding 필요
  • 이것을 row, column embeddings으로 나눠서 embedding을 구성하였다.
    • 예를 들면, 224x224 이미지에서 49개에 대한 embedding을 하지 않고 row 7개, column 7개에 대한 총 14개 embedding을 한다.
    • 따라서 patch에 대한 positional embedding을 할 때, 이 두가지 값을 더하면 된다.
    • 이 방법은 parameters도 줄이고 모델의 regularizing을 도와준다.
    • BERT에서는 사실 positional embedidng을 학습해도 큰 효과가 없어서 sin, cos함수를 이용한 embedding을 했는데.. 여기서는 2D라 조금 다른건가 싶음

2.3 Finetunning Details

  • 앞에서 말한 것과 같이 ResNet-50의 앞 3블락은 pretrain patch processing network을 하게 된다.
  • Finetune을 할 땐, 전체 이미지 가지고 end-to-end ResNet-50을 학습하게 된다.

3. Experiments and Results

  • CIFAR-10과 ImageNet 데이터를 이용한다.
  • 데이터에서 일부분으로 unlabeled라 생각하고 실험을 여러 번 진행하는데, unlabeled의 비율에 따라 실험결과를 진행하는 식
    • unlabeled 데이터는 pretraining에 쓰임

3.1 Datasets

  • Labeled data의 비율을 대략 5%, 10%, 20%, 100%을 가져가면서 실험을 해보았다.
  • CIFAR-10에서는 10%의 비율대신 8% 비율의 학습 데이터를 쓰는데 이는 Oliver에서 사용했던 세팅에 맞추기 위해 그런 것 같음. (정확히 왜 그랬는지는 모르겠음. Oliver 논문을 봐야할 것 같음)

3.2 Experimental setup

3.2.1 Model architecture

  • 기본적으로 ResNet-50v2와 똑같은 구조이다.
  • Batch normalization은 각각의 residual block에서 사용한다.
  • Self-attention layers에서 residual layers전에 dropout을 적용하는데 rate는 10%이다.
    • Transformer구조보면 self-attention하고 residual로 더하고 instance normalizing하게 됨
  • 모델의 크기는 대략 25M parameters와 50개의 layers을 가짐
  • Attention pooling에서 3개의 attention blocks가 추가되고 이는 hidden size=1024, intermediate size 640, attention heads=32이다.
    • self-attention하는 과정이 입력에서 Q,K,V라는 것을 matrix 곲으로 만들게 되기 때문에 이 3개의 matrix가 필요하다.
    • 또한 이렇게 Q,K,V,을 통해 나온 output을 하나의 head라고 하는데, multihead로 32번을 반복했다는 것이다.
    • 이렇게 나온 32개의 출력을 concat하여 matrix곲을 한 번 취해주는데 여기서 matrix가 또 필요하다.
    • 이것에 대한 dimension을 언급한 것 같고 Q,K,V size가 1024, concat후 matrix dim이 640이란 것 같은데..?(정확하지 않음)

3.2.2 Model training

  • Optimizer: Nesterov coefficient of 0.9 (실제 이거 사용한 논문은 처음 본 듯...?)
  • Batch size: CIFAR-10: 512, ImageNet: 1024
  • Learning rate: cosine shape with a warm up phase of 100 steps (maximum lr range: [0.01, 0.02, 0.05, 0.1, 0.2, 0.4])
  • Regularization: L2 regularization, 가중치 0.0001
  • 120,000 steps 학습
  • pretraining할 때, masking된 것을 예측하는 patch을 얼마나 사용할지 비율: p
    • p: 75% or 50% 사용
    • p라는 의미가 전체 패치가 9개고 masking이 3개라면, 6개로 predict했단 개념에서 6/9인지 6/6인지가 불확실함
    • 6/9이로 생각해서 p가 100%인 것은 없는 것 같음..

3.2.3 Reporting results

  • 실험 데이터의 10%는 validation 데이터로 사용하여서 90%로 학습하다가 적절한 hyper-parameters을 찾음
  • 그 후, 실험 데이터 100%로 random seed로 5번 학습하여 이에 대한 평균과 표준편차를 report 함

3.3 Results

    • Table 1은 pretraining 의 유무에 따른 결과이다.
    • labeled data을 5%만 사용했을 때, ImageNet 224x224에서 성능이 11.1이 늘어났다고 여기서 강조하는데 표를 보면, CIFAR-10을 보면 변화가 없다.
    • 즉 항상 효과가 있어보진 않고 20%만 labeled data을 사용해도 큰 효과가 있는 느낌은 아니라고 생각한다.
    • Labeld 100%일 때 unlabeld dataset = labeled dataset을 하였단 것 같고 gain은 small 일 것으로 예상되었었다고 한다
    • Pretrained model은 학습이 될 때, loss가 높은 값에서 수렴을 하게 된다.
    • 하지만 test data에서 랜덤 초기화보다는 loss가 줄어들고 accuracy는 높다.
    • 즉 이것은 여기서 사용한 pretraing이 regularization 효과가 있다고 여기서 언급한다.

3.3.1 Baseline Comparison

  • 여기서 말하고자 하는 것은 Baseline 성능이 더욱 좋아졌다는 것 같음..
  • 애초에 ResNet-50v2은 상당히 좋은 성능을 가지는 것이라고 함.
    • DenseNet과 비교해서 설명을 함.
  • 이러한 ResNet-50v2을 조금이나마 더욱 좋게 만들었다!

3.3.2 Contrast to Other Works

  • 이전의 unsupervised representation learning과 비교를 하겠다.
  • 이 논문의 ImageNet 224x224의 성능은 77%
    • Comprehensive study(Kolensnikov)의 ImageNet 성능은 55.2%
    • Context Autoencoders(Pathak)의 성능은 56.5%
    • Constrastive Predictive Coding(Oord)의 성능은 48.7%
  • 이들에 비해 훨씬 좋다.
    • 그 이유가 past work들은 아마도 finetune 과정을 안거쳤기 때문이라고 추측
    • 이 논문의 설명이 좀 웃긴게, 그냥 ResNet-50v2 supervised 성능에서 0.1만 높여놓고 이게 unsupervised learning 때문에 77%을 달성했듯이 말을 한다.
    • past work하고 비교를해서 unsupervised learning으로 정말 효과를 입증하려면, 똑같이 finetunning과정을 통일시켜서 비교를 해야하는 것 아닌가???
  • 이 연구와 비슷하게 unlabeled data을 이용하여 semi-supervised learning setting을 한 연구와 비교를 한다.
    • Henaff(2019)의 방법은 적은 데이터를 학습에 대해 pretraining의 효과를 말하는 논문이라고 한다.
      • 하지만 이 논문은 ResNet-171을 사용했기 때문에 직접비교는 못한다고 한다.
      • 아니 그러면..ResNet-171에 이 방법으로 실험을 해보면 되는데... 구글 브레인이 이런 걸 안해봤을 까에 대한 의심이 들고 실제로 해봤는데 별로 효과를 못봐서 말안한 스멜!
    • Unsupervised Data Agumentation (Xie) 방법은 CIFAR-10의 subset 8%에서 94.7%의 성능을 달성했다고 한다.
      • 즉 이 논문보다 훨씬 효과적이었다는 것임;;

3.3.3 Finetunning on ResNet-36 + attention pooling

  • 위에서 계속 언급한 finetunning 결과에서는 pretraining 때 사용했던 attention-pooling을 사용하지 않고 P network(3개의 convolution block ResNet-36)만을 이용했다.
  • 그래서 section 4.2에서는 ResNet-36+attention pooling을 다 사용한 것을 다룬다.

3.3.4 Finetunning Sensitivity and Mismatch to Pretraining

  • 이러한 실험 결과에도 transffering pretrained models을 하는 것은 어렵다.
    • 여기서 transferring이란 것은 ImageNet로 학습한 것을 CIFAR 데이터에 맞는 모델로 transferring하는 것을 의미
    • 즉 pratrining하는 데이터가 실제 수행해야하는 task와 도메인이 다르면 쉽지 않다는 것
  • 또한 pretraining과 finetunning setting에는 mismatch가 있다.
    • 예를 들면, pretraining은 patch단위로 독단적으로 학습을 하는 식이다.
    • 하지만 finetunning할 때는 이미지 전체를 봐야하는 점이 다르다.
    • 따라서 앞으로 이런 부분을 해결하기 원한다.
  • 내가 느끼기엔 해상도 문제의 차이때문에 발생하는 것 같다.
    • 위에서 말햇듯이 prertraining은 patch단위로 봐야하고 finetunning은 전체 단위로 보고 학습하는 점이 다르다.
    • 이 점은 finetunning을 pretraining처럼 patch 단위로 하고 다시 융합하는 느낌으로 하면 되지 않을까 싶은데..?
    • 참고로 언어 BERT는 이런 식으로 pretraining과 finetunning이 다르지 않기 때문에 발생하지 않는다.
      • 물론 언어 BERT에서 pretraining과 finetunning이 다르다.
      • 이 부분은 쉽게 말하면 [MASK] token을 쓰냐 안쓰냐의 차이가 있다.
      • selfie에서는 [MASK] patch라는 것이 denosing을 하는 것이 아니기 때문에 이런 부분은 없는 것 같다.
    • ImageNet와 CIFAR또한 해상도가 다르기 때문에 pratrining과 finetunning간에 간극이 발생하는 것 같다.

4. Analysis

4.1 Pretraining benefits more when there is less labeled data

  • ImageNet 224x224의 labeled 데이터양을 전체 데이터에서 2%, 5%, 10%, 20%, 100%만 사용하면서 실험을 진행해본다. (즉 unlabeled 데이터들로 설정한 것들은 pre-training으로만 사용)
  • 앞의 결과섹션처럼 실험을 5번동안 학습하면서 나온 것을 평균낸다.
  • 결과에서 보듯이, unlabeld 데이터가 labeled 데이터보다 훨씬 양이 많아야 효과가 있다.
    • labeld 데이터 2%만을 사용하면 성능 향상은 꽤 있으나 점점 급격히 효과가 감소하게 된다.
    • 즉 쉽게 생각하면 labeld 데이터 1개를 모으는 것보다 unlabeld 1개 모으는 것이 훨씬 쉽지만 unlabeld로 효과를 보려면 엄청 모아야 한다는 것!!

4.2 Self-attention as the last layer helps finetuning performance

  • Pre-training일 때 쓰였던 attention pooling을 가져와서 써보자
  • 위의 그림처럼 오른쪽 버전이 ResNet-36+attention pooling이다.
    • 상세 과정이 살짝 궁금한게 patch를 쪼개서 하는 것인지 아니면 전체 이미지에 대해서 한 번에 네트워크를 통과시킨지가 궁금하다
    • 전체 이미지가 입력이라면 attention할 다른 대상이 없기 때문이다.
    • 그런데 pre-training 과정을 생각해보면, patch 단위로 넣어서 attention-pooling을 거쳐서 하나의 vector을 형성하는게 맞다고 생각한다.
    • 그것을 classification 하기 위해 하나의 layer+softmax을 했을 듯
    • 결과를 보면 데이터 양이 적은 경우 pre-training을 한 것을 그대로 가져다 쓴 attention-pooling이 더욱 성능이 좋다.
    • 하지만 데이터가 full일 경우는 (pre-training이 애초에 큰 효과가 없기 때문에) attention-pooling이 좋을 수도(ImageNet 경우) 안좋을 수도(CIFAR-10)도 있다.
    • 하지만 ImageNet 경우는 좋기 때문에 hybrid 모델 구조 같은 경우를 연구해볼 수도 있고 이것은 future work이다!

5. Related Work

  • Unsupervised representation learning for text.
  • Unsupervised representation learning for images.
    • Selfie는denoising autoencoders와 비슷한 개념이다
    • 하지만 어떻게 입력을 reconstruct 하는지가 다른 것일 뿐
    • 가장 큰 차이점은 selfie는 distracting patches들에서 missing patch를 찾는 식으로 되는 것
    • 이 방법은 contrastive predictive coding(negative sampling 이용)과 또 연관이 있다고 함..
  • Semi-supervised learning.
  • 생략

6. Conclusion

  • Masked language modeling 개념을 continuous data인 이미지에 적용한 논문
  • 정사각형 입력 이미지에서 negative samples로 부터 target masked patches을 선택하는 방법
  • classification 문제로 풀었기 때문에 정확한 pixel value을 맞추는 것이 아니다
  • 실험에서 Selfie는 unlabeld 데이터에 비해 labeled 데이터가 작아야만 중요한 gain을 얻을 수 있었다.
  • 성능부분 외에도 표준 편차를 줄이는 pretraining method이다.
  • 또한 unsupervised pretraining와 superviesed learning의 hybrid convolution-attention 모델 구조에 대한 promise(기대감?)도 보여준다. 
    • Table2에서 말하는 내용
Reference

댓글