Hello Data

비전공생의 MoCo2020 논문 리뷰 본문

Self,Semi-supervised learning

비전공생의 MoCo2020 논문 리뷰

지웅쓰 2023. 4. 11. 21:39

SSL 첫 논문 리뷰 대상은 MoCo 이다. 어디서부터 논문을 읽어야할지 감은 안잡혔지만 Moco -> SimCLR -> BYOL 순으로 대표적인 논문들만 읽어볼 예정이다.

 

Introduction

이전 비전 분야에서 unsupervised learning이 NLP 분야만큼 나오지 않은 이유는 표현들이 더욱 continuous, high-dimensional 등등의 이유라고 말한다. 그러나 contrastive loss가 등장하면서 최근의 발전을 이루고 있는데 추가로 활용하는 것이 dynamic dictionary이다. dictionary 안에는 query이미지에 대한 key 이미지들이 있으며 이미지 query 에 대해서 similar / dissimilar 을 계산하게 된다. 논문에서는 이 dictionary에 대하여 충분히 커야하고, 일관성을 가져야한다고 말한다. 크기가 클 수록 더 많은 negative key들과 같이 계산하게 되니 좋다. 그리고 일관성을 더욱 높이기 위해서 여기서 핵심들인 queue와 key encoder 를 업데이트 하기 위해 momentum 을 활용한다,queueencoderqueueconsistency. MoCo의 전체적인 학습과정은 다음과 같다.

 

 

Method

MoCo에서 사용하는 loss는 infoNCE loss로 다음과 같다.

q: query

k+: q와 similar pair keyquery

ki : q와 dissimilar keyKnegativesample

T: temperature hyperparameter

Tsoftmax

 

이러한 loss를 활용하여 query encoder를 학습합니다. 

학습하는 과정에서 논문의 저자들은 계속해서 consistency를 강조하는데요, 이를 위한 해결책으로는 첫번째로 큐를 제시합니다.

 

Solution1. Queue

장점

1. encoded key 들을 재사용할 수 있다.

2. dictionary size와 mini batch size를 decouple할 수 있다.

특히 두번째 장점으로 인해 더 큰 dictionary size를 유지할 수 있다고 말합니다. 이유에 대해서는 dictionary안에 있는 sample들에 대해서 FIFOFirstinFirstout를 이용하기 때문에 dictionary에 mini batch에 대하여 enqueued 된다면 맨 아래에 있는oldest mini batch는 deque 됩니다. 따라서 이러한 dictionary 구조는 모든 데이터에 대해 최신적이며removingoutdated consistent 를 가질 수 있다고 말합니다.

 

Solution2. Momentum update

이러한 queue구조는 dictionary를 충분히 크게 만들 수 있지만 학습에 쓰이기는 굉장히 어렵습니다. queue안에 있는 모든 데이터들에 대해 backpropagation을 수행하기 어려우니까요. 따라서 아주 naive 한 해결책으로는 query encoder를 key encoder가 copy한다고 말하지만 성능은 좋지 않다고 합니다. 이에 대한 이유로는 query의 빠른 변화, 학습에 대해서 key encoder가 consistency를 잃는다고 합니다. 따라서 이를 대응하기 위해 momentum update를 도입하는데 식은 다음과 같습니다.

m 에 0 값을 주게 된다면 이전에 말했던 query encoder을 copy하는 것이며 1을 주면 query encoder를 학습에 활용하지 않는 것이다. 논문에서는 실험적으로 0.999 값을 주며 key encoder의 학습을 조금 더 smoothly하게 한다고 한다. 여기서 저자들은 이 식의 핵심을 slowly evolving key encoder라고 한다.

 

## 논문에서 강조하는 consistent를 유지한다는 것이 관념적으로는 이해는 되고 구체적으로는 이해하기 힘들지만 해결책 2개를 따라가면서 이해를 써보자면,

queue를 사용해 구식의 표현들을 없앤다 -->  만약 large dictionary 안에서 구식과 최신의 표현들이 섞여있다면encoder,updateencoder 이 또한 문제일 것이다. 내게 조금 더 익숙한 attention encoder로 설명해보자면, 첫번째 학습에 쓰였던 key가 업데이트 되지 않고 10회 때 또 쓰인다면 학습이 원활하게 잘 되지 않을 것이다.

 

momentum update -->  아무래도 query encoder는 학습하는 속도가 빠를텐데query, 이를 key decoder 에도 적용한다면 큰 dictionary 안에 있는 모든 key 들에 대해 일관성이 없어질 것입니다,minibatchqueryencoderkeyencoder,dictionary. 따라서 이러한 query encoder 의 학습속도의 0.001만 적용한다minibatchbackpropagationqueryencoder.

 

MoCo 에 대한 pseudo code는 다음과 같다.

각각의 contrastive 를 위해서는 내적을 이용하고 이에 대한 loss는 Cross Entropy Loss가 사용된다. 여기서 query encoder back propagation으로 학습이 되고 key encoder는 따로 학습이 되는 것을 알 수 있다.

 

Others

추가적으로 저자들은 shuffling BN을 사용했다고 하는데 이는 batch내 samples 사이에서의  leak information을 방지한다고 한다. MoCo에서는 1개의 데이터와 다른 데이터들을 구분하는 것인데, 한 데이터 feature를 본다면, same batch 내에서 other samples들을 보지 않는 것이 좋다고 하는데shortcutconnection,cheat 이러한 것을 BN이 수행한다고 합니다. 따라서 shuffling BN을 사용한다고 이론적으로 논문에서 말하고 있습니다. shuffling BN을 수행하기 위해 훈련에서 많은 GPU를 통해 각 sample들을 다른 GPU에 넣어 훈련을 한다고 합니다fqfkkey,query.

 

다음은 MoCO에 대한 성능입니다.

 

이 외에도 detection, segmentation에서도 훌륭한 성능을 가지고 있다고 합니다.

 

다음에는 SimCLR에 대해서 공부해보겠습니다. 틀린 부분 지적해주시면 감사하겠습니다.

https://arxiv.org/pdf/1911.05722.pdf