본문 바로가기

ML

[Contrastive Learning]SimCLR 사용하여 학습하기

728x90

본 글은 해당 링크의 튜토리얼을 실행하며 정리한 내용을 작성하였습니다.


현재 주어진 데이터셋의 불균형이 심하여 여러 클래스 중 유독 2개의 클래스가 서로 비슷하여 정확성이 낮은 문제가

있습니다.

이를 해결하기 위한 방법으로 Contrastive Learning을 적용하고자 합니다. 

 

일단 적용 모델의 이름은 SimCLR이며 자세한 내용은 위쪽에 언급한 링크에서 확인하실 수 있습니다. 

 

SimCLR의 핵심은 이미지를 Augumentation하여 같은 이미지의 쌍인 Positive pair의 loss는 줄이고
서로 다른 이미지쌍인 Negative Pair의 loss는 늘리는 것

 

으로 기존 Contrastive Learning 방식과 크게 다르지 않다고 생각합니다.

이러한 방식으로 같은 클래스는 더 가깝게 다른 클래스는 서로 멀게하여 latent space를 보다 구분되게 만들 수 있습니다.

이를 가능하게 만들기 위해 SimCLR은 InfoNCE loss를 적용하였으며  그림과 수식은 아래와 같습니다. 

 

수식에서 가운데 식을 보시면 Softmax를 적용한 후에 negative log-likelihood를 계산하여 loss를 구하게 됩니다. 

이때 분자는 Positive pair 의 유사도, 분모는  Negative Pair간의 유사도를 의미합니다. 

유사도(sim)은 아래 식으로 구해지며 cosine similarity를 사용합니다.

 

위 loss는 negative log-likelihood loss이므로 아래 그림과 같이 값이 작을수록 loss가 크기에

 

Positive pair 의 유사도는 크게, Negative Pair간의 유사도는 작게 되도록 학습이 진행됩니다. 

 

분모에서 k≠i 인 이유는 서로 같은 이미지의 유사도는 1이며 이는 Negative Pair간의 유사도 측정 목적에 맞지 않습니다.

따라서 k≠i 에 대한 유사도 측정을 진행합니다. 

또한 위 식에서 τ(타우)는 유사도 결과를 스케일링 하여 보다 학습을 원활하게 만들기 위해 사용합니다. 

 

이러한 방식을 통해 튜토리얼에서는 정확성이 아래와 같이 나타났습니다.

이는 기존 ResNet 결과 대비 8.02%(81.33-73.31) 증가한 결과로 상당히 큰 수치라 생각됩니다. 

 


아래는 실제 저의 custom dataset을 사용한 학습 결과입니다.

 

학습을 진행함에 따라 점점 성능이 향상되었으며 최종적으로 79.63%의 성능에 도달했습니다. 

 

Contrastive Learning을 하지 않은 기본 ResNet의 결과는 다음과 같습니다.

 

결과적으로 총 22.8%의 성능 향상 

 

예상 보다 훨씬 좋은 결과를 보여줬습니다. 따라서 이를 토대로 detection 결과를 보정해야겠습니다.