작성자 : 성균관대학교 사회학과 박지은
1. Self-Supervised Learning (자기지도학습)
1-1. 필요성
레이블링의 단점
- Supervised learning(지도학습)은 강력하지만 많은 양의 레이블링된 데이터 필요
- 많은 양의 양질의 데이터만 있다면 좋은 성능을 낼 수 있음
- 하지만 이는 레이블링된 데이터가 없으면 사용 불가능하다는 문제가 있음
- 레이블링 작업자의 편향된 사전 지식 포함될 수 있음
- 레이블링에 매우 많은 시간 소요 (목적 태스크 복잡할수록)
GAN의 불안정성
- GAN은 높은 차원의 파라미터 공간의 non-convex한 문제에서 내쉬 균형을 찾기 때문에 학습이 어려움
- 자기지도학습을 사용하면 학습이 더 쉬워서 과거의 정보를 더 기억할 수 있음
- 학습이 진행될수록 생성자는 점점 더 실제 데이터에 가까운 데이터 분포를 만들어내는 non-stationary한 환경
- 뉴럴 네트워크는 학습 데이터의 도메인이 바뀌는 동적인 상황에서 과거의 데이터 잊음
- ex) conditional model: real/fake를 구분하는 것뿐만 아니라 cat/dog도 구분하며 계속 학습하여, 새 데이터에 대하여 판별자가 구분해서 condition 습득 후 real/fake 구분을 진행하면 학습이 더 쉽고 안정적
- supervision signal이 학습에 불필요한 편향을 줄 수 있음

1) 디노이징 오토인코더 (Denoising Autoencoders)
- 랜덤 노이즈가 섞인 원본 raw data에서 네트워크를 거쳐 원본 raw data를 복원하는 방법

- 입력 이미지를 중복 패치 x_i,j로 나눔
- 각 패치를 encoder network fθ에 넣어 single vector z_i,j = fθ(x_i,j)를 만듦
- z 뭉치를 context network g_ϕ에 넣어 context vector c_i,j를 만듦
- mask는 c_i,j의 receptive field가 {z_u,v}_u≤i,v가 되도록 함
- prediction matrix W_k(prediction length k>0)를 이용하여 z^_i+k,j=W_kci,j 예측
-
c_i,j와 z_i+k,j의 상호 정보량이 최대가 되도록 L_CPC를 이용하여 학습

(z_l: negative samples, 이미지의 다른 위치나 배치 안의 다른 이미지에서 무작위로 뽑은 feature vectors)
- InfoNCE loss 사용
- NCE(Noise Contrastive Estimation)를 통해 상호 정보량을 최대화 → {predict, correct, negatives} 비교
- 단순 cross-entropy를 이용하기에는 클래스 수가 너무 많아서 비효율적 → good/bad 판별하는 이진 분류 사용
- 각각의 c_t마다 x_1, x_2, ..., x_n 중 실제 x를 예측해야 함
- negatives: 이미지의 다른 위치나 배치 안의 다른 이미지에서 무작위로 뽑은 특징 벡터

-
과정
- 이미지를 네트워크에 넣고, feature extractor를 통해서 최종 출력으로 위와 같은 패치별 특징 벡터를 구하도록 모델 구현
- 원본 이미지를 down scaling 했을 때 추론되는 특징 벡터 D의 합 = 패치별 네트워크를 지나서 얻은 T들의 합
-
L2 loss 사용, 모든 특징 벡터를 0으로 출력하는 trivial loss 될 수도 있음
→ sample supervision 학습: 패치로 잘리는 영상 x와 완전히 다른 영상 y를 넣었을 때 다른 feature 벡터가 나오도록 하는 contrastive loss를 추가

3-5. 시간적 관계
- 영상에서 시간에 따른 일관성을 고려한 프레임의 재건 또는 생성을 이용하여 자기지도학습 수행
1) Optical Flow & SURF 특징점 기반의 추적 기법
- Optical Flow (광학 흐름): 2개의 연속된 영상 프레임 사이에 이미지 객체의 가시적 동작 패턴
- SURF 특징점: SIFT보다 빠르게 semantic한 특징 추출 가능한 특징점 기반 알고리즘
(Speed-Up Robust Feature)
- 영상 내 특정 패치를 단시간 추적하여 추적된 패치들과의 관계를 이용하여 학습에 이용
- 같은 패치로부터 추적된 패치들은 서로 positive 쌍, 다른 패치나 다른 영상으로부터 추출된 패치는 negative 쌍
- 양성 쌍 패치의 임베딩된 특징점 사이의 거리는 음성 쌍 패치의 거리보다 항상 작도록 triplet loss를 이용하여 학습 (대조 학습(Contrastive Learning))
- baseline인 anchor를 positive, negative input과 비교
- anchor input과 positive input 사이의 거리 최소화, negative input과의 거리 최대화 (유클리디안 거리)
- 임베딩 학습의 목적으로 유사성을 학습하는 데 사용

- 과정
- 원본 데이터셋에서 예제를 무작위로 추출하여 두 번 변환 (random cropping & random color distortion)
- representation 계산
- representation의 비선형 투영 계산
- 동일한 이미지의 다른 변형을 식별하는 데 도움이 되고, 유사한 개념(ex. chairs vs dogs)의 표현 학습
- 비선형 투영 계산 → representation 자체에서 대조 손실을 구하는 것보다 성능 좋음
- 큰 배치 사이즈 & 오래 학습 → negative 쌍을 더 많이 고려하게 되어 지속적으로 성능 향상

구조
- input: 같은 샘플로부터 다른 데이터 증강을 이용해 변형된 샘플
- 2개의 network (online network, target network)를 사용
- loss function: mean sqaured error function
- 각각의 network는 encoder + projector + predictor로 구성
- target network의 weight: online network의 weight의 exponential moving average(지수이동평균)에 의해 업데이트
→ online network가 배울 regression target 생성
(expotential moving average의 coefficient 값은 0.996부터 1에 가깝게 감)
- loss는 online network의 학습에만 사용
- 과정
- 2개의 network에 서로 다른 augmentation을 적용하여 feature vector(prediction)을 뽑기
- online network와 target network의 projection output에 l2 normalization (MSE)
- mean squared error를 최소화시키는 방향으로 online network를 학습
(online network와 target network의 output이 같아지도록 학습)
- loss의 대칭화를 위해 사용한 augmentation을 바꿔서 loss 한번 더 계산하여 두 loss의 합으로 학습
- 장점
- negative 쌍을 사용하지 않고 positive 쌍만 이용하여 SimCLR보다 2% 성능 향상
- 기존의 negative 쌍을 사용할 때 배치 크기가 매우 커야 학습이 잘 된다는 문제와 데이터 증강에 따른 성능 편차가 크다는 문제 해결
- representation을 잘 배우는 것이므로 학습이 끝나면 onlline network의 encoder 제외 나머지는 사용 안함
⇒ 과거의 online netwrok들이 target network 속으로 스며드는 느낌

4. 성능 측정

빨간 상자: pre-training을 self-supervise로 얻은 feature extractor
- 프리텍스트 태스크로 네트워크를 학습시키는 이유는 다음에 이어질 다운스트림 태스크를 잘 수행하기 위함
4-1. 태스크 일반화 (Task Generalization)
-
성능 측정을 위해 자기지도학습으로 네트워크를 pre-training 한 뒤 모든 가중치를 고정하고, 마지막 레이어에 linear classifier를 붙여 지도학습 방식으로 다운스트림 학습 진행
⇒ 가중치가 얼마나 특징을 잘 추출하고 representation을 잘 배웠는가?
(단순한 선형 레이어 하나만 붙여 학습 했을 때 좋은 성능을 내기 위해서는 feautre extractor가 얼마나 성능이 좋은 간접적으로 확인할 수 있는 방법)
ImageNet : Classification

- Conv1, Conv2, ..: 는 AlexNet의 해당 레이어까지 파라미터를 고정하고 뒷부분을 학습
- ImageNet labels: 일반적인 지도학습으로 모델을 학습 후 Conv 레이어를 고정시킨 뒤 각 Conv 레이어 뒤에 linear 레이어를 붙여 학습한 결과
- Random & Random rescaled: Conv 레이어들을 random initialization 한 뒤 linear 레이어 붙여서 학습한 결과 ⇒ feature extractor 아무런 정보도 담고 있지 않기 때문에 오직 linear 레이어에 의존하여 학습하므로 linear layer를 사용할 때의 lower bound 성능임
- Self-supervised: Conv 레이어들을 pre-training 한 뒤 고정하고 linear 레이어를 붙여서 학습한 결과
4-2. 데이터셋 일반화 (Dataset Generalization)
-
자기지도학습으로 ImageNet 데이터셋으로 pre-training 후, 다운스트림 태스크로 PASCAL VOC의 classification, object detection, segmentation task 이용
⇒ feature extractor의 품질이 아니라 pre-training 후 파인 튜닝을 했을 때 얼마나 성능이 좋은가?
PASCAL VOC : Classification, Object Detection, Segmentation Task

-
ImageNet labels: ImageNet pre-trained 가중치를 사용하여 다른 데이터셋에 학습한 결과
-
Random & Random rescaled: random 가중치로부터 학습한 결과 (= scratch로부터 학습)
→ 적은 epoch 진행: pre-training 가중치의 이점인 빠른 학습의 빠른 수렴 강조 (30 epoch)
5. 결론
- 레이블링이 없는 데이터로 프리텍스트 태스크를 정의하여 높은 수준의 semantic 이해를 위해 학습
- feature extractor를 사전 학습하고, 다운스트림 태스크로 전이
- ImageNet으로 학습할 수 없는 다른 도메인의 경우 pre-training 시킬 데이터셋의 대안이 될 수 있음
Reference
https://arxiv.org/abs/1811.11212
http://www.kisdi.re.kr/kisdi/common/download?type=DR&file=1|14840
https://www.youtube.com/watch?v=MaGudzppu3I&t=11567s
https://abursuc.github.io/slides/2020_tutorial_cvpr//self_supervised_learning.html#1
https://annotation-efficient-learning.github.io/slides/relja_cvpr2020_self_supervised.pdf
https://hoya012.github.io/blog/Self-Supervised-Learning-Overview/
https://www.youtube.com/watch?v=eDDHsbMgOJQ&list=PLk4Qf8NdfVem3BKLdI_oWb0kHuRFYqxVy&index=8&t=3s
https://wikidocs.net/22650
https://openaccess.thecvf.com/content_ICCV_2017/papers/Doersch_Multi-Task_Self-Supervised_Visual_ICCV_2017_paper.pdf
https://openaccess.thecvf.com/content_CVPR_2019/papers/Chen_Self-Supervised_GANs_via_Auxiliary_Rotation_Loss_CVPR_2019_paper.pdf
https://creamnuts.github.io/paper/CPCv2/
https://brunch.co.kr/@synabreu/76
https://yann-leguilly.gitlab.io/post/2019-09-29-representation-learning-with-contrastive-predictive-coding/
http://blog.naver.com/PostView.nhn?blogId=samsjang&logNo=220662493920&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220913997108&proxyReferer=https:%2F%2Fwww.google.com%2F
https://creamnuts.github.io/paper/MoCo/
https://tykimos.github.io/2019/07/29/Kears_BiGAN/
투빅스 14기 한유진
Self-Supervised Learning의 개념적인 부분을 배울 수 있었던 좋은 강의였습니다. Self-Supervised Learning가 왜 등장했고, 어떤 방법으로 사용되는지까지 차근차근 알수있어서 좋았습니다! 감사합니다