안녕하세요, 오늘 읽은 논문은 Improved Baselines with Mometum Contrastive Learning 입니다.
해당 논문은 MoCo v1에서 SimCLR의 두 가지 아이디어를 적용한 모델입니다.
SimCLR은 contrastive learning에서 세 가지 핵심 요소를 제안하는데요, (1) 많은 negative sample을 사용하기 위한 large batch, longer training, (2) stronger augmentation(color distortion, random resize crop, blur), (3) MLP projection head 가 contrastive learning의 성능을 높일 수 있다는 것을 실험적으로 보여줍니다.
MoCov2는 SimCLR에서 제안한 3가지 방법 중 (2)와 (3)을 적용하여 SOTA 성능을 달성합니다. MoCo는 negative sample을 queue에 저장하고 사용하므로 large batch를 사용하지 않아도 된다는 장점이 있어 (1) 을 적용하지 않았습니다.
augmentation은 random resized crop + strong color distortion + blur를 사용하고, unsupervised learning시에 encoder의 마지막 단에 MLP 구조(fc + relu + fc) 를 추가하고, transfer learning시에 이 MLP 구조를 버리고 linear layer를 추가하여 transfer 합니다.
pytorch 코드로 다음과 같이 구현할 수 있습니다.
# I use q encoder as resnett18 model
q_encoder = resnet18(pretrained=False)
# define classifier for our task
classifier = nn.Sequential(OrderedDict([
('fc1', nn.Linear(q_encoder.fc.in_features, 100)),
('added_relu1', nn.ReLU()),
('fc2', nn.Linear(100, 50)),
('added_relu2', nn.ReLU()),
('fc3', nn.Linear(50, 25))
]))
# replace classifier
# and this classifier make representation have 25 dimention
q_encoder.fc = classifier
MLP 구조를 추가하여 unsupervised learning 학습을 진행한 후에, transfer learning시에 아래 코드와 같이 MLP 구조를 제거합니다.
# removing the projection head of q_encoder
if len(nn.Sequential(*list(q_encoder.fc.children()))) == 5:
q_encoder.fc = nn.Sequential(*list(q_encoder.fc.children())[:-3])
그리고 Linear layer를 추가하여 transfer learning을 합니다.
# define Linear Classifier for transfer learning
class LinearClassifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = torch.nn.Linear(100,10)
def forward(self, x):
x = self.fc1(x)
return x
linear_classifier = LinearClassifier().to(device)
Experiment
MLP, augmentation, cosine learning rate scheduler의 ablation study 입니다.
MoCov2와 SimCLR의 비교입니다.
참고자료
[1] https://www.analyticsvidhya.com/blog/2020/08/moco-v2-in-pytorch/