오늘은 셀프슈퍼바이즈드 러닝!
에 대해 정리할 것이다.
간단하고 짧게 요약본 느낌!
Self-Supervised learning
unsupervised learning 이라고도 볼 수 있지만, label 없이 input 내에서 target으로 쓰일만 한 것을 정하여! 즉 self로 task를 정해서 supervision 방식으로 모델을 학습한다.
pretext task는 SSL에서의 task를 말한다. 하지만! 우리의 목적은 downstream task를 잘 푸는 것이 목적이다.
contrasitve learning
batch내의 data sample들 사이의 관계를 예측하는 task이고, negative smple을 가지며 positive pair끼리는 같게, negative pair끼리는 다르게 구분하여 모델을 학습하는 방식이다.
→ 일반적으로 contrastive larning의 성능이 좋으려면
- 좋은 퀄리티를 가져야함.
- 충분히 많은 양의 negative pair가 필요함
SimCLR
각 이미지에 서로 다른 두 data augmentation들을 적용하여, 같은 이미지로부터 나온 결과들은 positive로 정의하고 서로 다른 Image로 부터 나온 결과는 negative로 정의 하는 형태이다.
변환된 이미지들은 CNN기반의 네트워크 f를 통과하는데 여기서 f는 base encoder라고 불리는 representation vectorf를 생성한다.
다음은 g를 통과하는데, MLP기반의 projection head를 통과하여 contrastive loss를 계산한다. 여기서 projection head는 두 개의 linear layer사이에 ReLU 함수를 넣은 구조라고 한다.
encoder 및 projection head는 batch단위로 학습함. 만약 N의 batch size를 이용하게 된다면 data augmentation을 거쳐서 2N개의 sample을 얻을 수 있는 것이ㅏㄷ.⇒ 근데 충분히 많은 양의 negative pair가 있으면 좋으니까 batch size를크게 해야겠지!
→ 한 쌍의 positive pair와 2N-2쌍의 negative pair를 구성할 수 있게 된다.
- data augmentation
데이터 셋 이미지들이 서로 다른 크기를 가지고 있어서 crop/size 과정을 거쳐서 변환해주고,
더하여 한 쪽 branch에는 테스트해보고자 하는 다른 augmentation 방법을 추가하고 다른 한 쪽 branch에는 그대로 둔 채 학습을 진행하여 성능을 비교함.
→ 이러한 비대칭적인 구성은 다른 방법보다 성능이 낮을 수 있는데도 공정한 비교를 위해 이러한 방식을 선택했대 (?) - optimizer
SGD나 Momentum 이 아니라 큰 크기의 batch size로 학습할 때 적절하다고 알려진 LARS optimizer를 이용하여 muti-device(분산학습)으로 학습함. - Batch normalization
device별로 평균과 표준편차를 계산하여 적용하는 것이 아닌, 모든 device에서의 평균과 표준편차 값들을 통합해서 적용했다.
→ 이렇게 하면 positive sample이 포함된 device와 negative sample만으로 구성된 device들 간의 분포를 같게 normalize하게 되어 batch norm과정에서 발생하는 손실을 최소화 할 수 있다.
- projection head
projection head의 output vector는 base encoder의 output보다 rotation이나 gaussian nosie 등의 정보를 많이 담고 있지 않음. → 정보 소실
- 그럼 왜 써?
downstream task에 이용할 vector는 따로 저장해두어야 하는데, contrastive loss 를 계산해야하니까?
MoCo
→ simCLR의 한계점을 극복함!
한계: negative sample에 대한 의존성과 큰 batch size가 있어야만 좋은 성능이 나온다!
contrastive learning의 관점에서 dictionary를 사용하자! queue + encoder
근데 여기서 좋은 dictionary를 갖는 것이 중요해! 어떤 조건이 필요하냐면
- large
→ continuous, 고차원 공간에서 sampling을 잘 하기 위해서 size가 커야해 근데 queue의 사이즈는 mini batch size에 독립적이라! - consistency
FIFO 특성에 의해 queue에서 가장 오래된 sample batch가 나가게 되서 sample들이 가장 최근의 것으로 유지하게 되어 consistency를 유지하게 해줌!
dictionary의 key가 일관되어야 query와의 비교 또한 일관되므로!- queue의 개수 (negative sample 개수)가 많으면 많을수록 성능이 좋아!
매 mini batch마다 encoded된 key들은 dictionary에 enqueue되고, dictionary가 꽉차면 오래된 순서로 key가 dequeue된다. 이를 통해 이전 mini-batch들의 key들을 재사용할 수 있게되고, dictionary의 크기와 mini-batch의 크기를 분리할 수 있다. 즉! mini-batch size보다 더 큰 dictionary를 사용할 수 있게되어 더 많은 pair를 비교할 수 있다! - momentum encoder처음에는 단순히 query encoder를 매번 복사해서 key encoder로 사용하는 방법을 시도했어! 근데 이 경우 학습이 잘 안됐다.. → 이는 key encoder가 매번 급격히 변화하면 dictionary의 key 들의 representation에 일관성이 없어지기 때문…
m=0.999로 설정 → k_parameters가 많이 반영, encoder에서 나온 q_parameters는 조금 반영됨. → 즉 k값에 대해서 consistent를 유지하면서 진행되는 것.
- queue의 개수 (negative sample 개수)가 많으면 많을수록 성능이 좋아!
내가 공부하고 궁금한 부분들만
나만의 말투(?)로 적었는데
생각나는댜로 끄적여서
정리되진 않았읍니다 히히
모각코 화이팅!
'모각코' 카테고리의 다른 글
[모각코 6주차] 데이터베이스 SQL 고급 (2) | 2024.05.01 |
---|---|
[모각코 5주차] inductive bias (0) | 2024.04.03 |
[모각코 4주차] Style transfer (1) | 2024.03.27 |
[모각코 3주차] Convolution Neural Network (0) | 2024.03.21 |
[모각코 1주차] VAE를 공부하면서! (2) | 2024.03.06 |