loading

다양한 Deep learning 학습법


Training strategies

Published on December 18, 2022 by JunYoung

AI deep learning training method transfer learning knowledge distillation multitask contrastive learning

24 min READ

이번 게시물은 딥러닝 네트워크를 학습시킬 수 있는 다양한 학습법에 대한 내용이다. 단순히 단일 task에 대한 학습법이 아니라 다양한 환경에서 적용될 수 있는 방법론에 대해서 다루기 때문에 이번 게시글에는 다양한 내용을 담게 되었다. 그래서 우선 글을 본격적으로 시작하기 전에 어떤 내용을 다룰 것인지 간단하게 소개를 하고 시작하도록 하겠다.

  1. Transfer learning : DL optimization in different tasks
  2. Knowledge distillation : Increase representation generalization with soft label
  3. Continual learning : Learn various representations without losing previous tasks’ performances
  4. Self-supervision : Learn representations with no/little supervision

딥러닝 학습이란?

딥러닝은 머신러닝의 여러 기법들 중 하나인 Neural Network를 대량의 데이터셋을 통해 보다 깊은 layer를 학습시키는 법을 gradient based로 제안하였다. 그렇기 때문에 ImageNet에서 우승했던 기본 classification 모델부터 시작해서 현재 급속한 발전을 이루었다.
결국 하고자 하는 말은 딥러닝이 학습하기 위해서는 Task가 정의되어야 하며, 해당 task를 해결하고자 할 때 사용될 modality에 의한 dataset이 필요하며, 이러한 dataset 형태에 따라 최적화하고자 하는 loss function, 그리고 gradient based로 학습시킬 때 적용할 optimization method로 귀결된다.


만능 인공지능을 만들 순 없을까?

그렇다면 결국 각 task가 정의되어야하고, 그 task에 최적화된 딥러닝 모델을 만들 수는 있으나 과연 정말 인간과 같이 말도 잘하고, 사물 구분도 잘하면서 어떠한 장면을 보고 질문에 대한 대답도 합리적으로 잘하면서 인지에 대한 실시간 대응이 가능한 네트워크를 구성할 수 있을까?
요즘 “그림 그리는 AI”나 “ChatGPT”가 유명해지며 사람들의 관심이 끌리기 시작했다. 그만큼 생성 AI의 성능이 무서울 정도로 성장세를 보이고 있고, 다양한 modality에 대해 적용 가능한 네트워크 구조가 많이 발전한 것은 사실이지만, 그럼에도 불구하고 여전히 효율적으로 모든 실생활의 문제에 적용 가능한 딥러닝은 개발되지 않은 상태다. 그렇다면 하나의 task에 대해 최적화된 딥러닝을 다른 task에 적용할 때는 어떤 방법들을 사용할 수 있는지 소개해보도록 하겠다.


Transfer learning(전이 학습)

cs231n에서도 소개되는 내용인 전이학습은(혹은 transfer learning), 현재 연구되고 있는 다양한 딥러닝 연구 전반에서 활용될 수 있는 기법이다.
전이학습의 정의는 ‘previous task’에 대해 딥러닝에 학습된 지식이나 기술이 ‘novel task’에서도 활용될 수 있을까 혹은 적용할 수 있을까?에 대한 접근법이다.
예를 들어 사람을 예시로 들어보자. Chess를 잘 두는 선수는 Checkers나 바둑과 같이 비슷한 게임에 더 적응을 잘할 수 있을 것이다.

다른 예시로는 수학을 잘하는 사람이 인공지능 공부를 더 잘하는 것이나, 코딩을 잘하게 되는 현상 그리고 tennis를 잘치는 사람이 탁구나 배드민턴을 금방 익히는 것과 비슷하다.
결국 길게 소개했지만 말하고자 하는 것은 '어떠한 task'에 대해 최적화된 네트워크에 학습된 parameter를 이용해서 ‘비슷하지만 살짝 다른 task’에 대해 적용할 수 있지 않을까이다.

일반적인 imageNet에 대해 학습된 네트워크는 학습된 필터들을 통해 이미지에서 유의미한 feature를 추출할 수 있다(General images). 이 네트워크를 보다 특성화된 downstream task인 classification에 적용하기 위해서 기존의 feature extractor를 가지고 파라미터 수정을 하게 된다. 처음부터 학습하는 것보다, 기존의 학습된 representation이 학습에 있어 안정적인 역할을 해줄 수 있다. 마지막으로는 support vector machine(SVM)을 사용, 기존 feature extractor를 그대로 사용하되 마지막 부분에 task-specified head를 사용하여 학습하는 것을 보여준다. 이처럼 tansfer learning 혹은 fine tuning을 하는 과정은 기존 task와 새롭게 접근할 task의 관계에 따라서 다른 전략으로서 정의된다. 물론 dataset의 크기도 중요한 척도가 된다.
이렇게 기존에 학습된 딥러닝 네트워크를 활용할 때 기준점이 되는 네트워크를 "pre-trained model"이라 부른다. 한국말로는 ‘사전 학습된 네트워크’라 부른다. 사전 학습된 모델에 접근하는 법을 크게 3개의 step으로 표현하면 다음과 같다.

  • Select source model : 가능한 네트워크 중에서 가장 잘 적용될 수 있는 구조를 고르는 작업. 현재 paper with code와 같은 플랫폼에서 다양한 연구 기관(Facebook AI, Google 등등)에서 출시한 pre-trained network나 pytorch, tensorflow에서 기본으로 제공하는 pre-trained model 등등 활용할 수 있는 network pool이 넓어졌다.
  • Reuse model : 위에서 고른 pre-trained network를 학습에 전반적으로 학습하는 과정이다. 일종의 'from scratch'사전 학습된 네트워크를 ‘초기화’상태로 두고 새로운 task에 적용하는 것이다. 흔히 모델의 일부분을 사용하거나 전체를 사용하는 등 모델링 기법에 따라 학습 전략은 달라진다.
  • Tune model : 경우에 따라 관심이 있는 새로운 task에 대해 input-output 관계로 네트워크를 tuning하는 것이다. 흔히 classifier 부분을 SVM으로 바꾸거나 낮은 learning rate로 학습하는 방법이 이 단계에 해당된다고 보면 된다.

결국 네트워크를 새로운 task에 학습시킬 때 ‘학습하고자’ 하는 부분이나 방법에 대한 구분이 필요하다. 이에 대해 각 레이어에 대한 gradient optimization 여부를 다음과 같이 구분할 수 있다.

  • Re-train : 기존에 학습된 weights를 모두 버린 뒤 새로운 weight로 업데이트하는 것
  • Fine-tuning : 학습된 weight를 그대로 두고, 학습 데이터를 통해 파라미터 조정을 가하는 것
  • Frozen : 학습된 weight를 그대로 유지하고, 학습 과정에서도 이를 그대로 보존하는 것

일반적으로 fine-tuning은 기존에 학습될 때 사용하는 learning rate의 $1/10$배 혹은 $1/100$배의 크기를 적용한다. Learning rate이 곧 prediction과 ground truth 사이에 발생한 오차에 대해 얼만큼 weight update를 진행할 지에 대한 척도가 되는데, 이 값을 줄임으로써 기존에 학습된 weight를 어느 정도는 유지하고자 하는 것이다.


데이터셋의 유사도와 크기에 따른 transfer learning

앞서 말했던 것과 같이 사전학습된 모델을 고르고, 어떤 레이어는 처음부터 다시 학습시키거나(retrain), weight를 낮은 learning rate로 살짝 조정하거나(fine-tuning) 혹은 weight를 그대로 사용할 수 있다(frozen). 이러한 전략은 사전 학습된 모델과 새로 학습할 task의 유사도(dataset similarity), 그리고 학습 시에 사용될 새 데이터셋의 규모(dataset size)에 따라 4가지로 구분될 수 있다(위의 그림 참고).

데이터셋의 크기는 크지만, 기존 task와의 유사도는 떨어질 경우(Quadrant 1)

이럴 경우에는 기존의 task의 representation(학습된 weight가 implicit하게 가지고 있는 mapping 능력이라고 생각하면 된다)를 그대로 사용하는 것보다는 전체 네트워크를 학습하는 것이 성능 향상에 더 도움이 될 수 있다. 이유는 네트워크 parameter 전체를 전체적으로 다 학습할 정도로 충분한 양의 데이터셋이 있다는 가정 하에 overfitting이 일어나지 않을 것이고, 기존 task에 대해 최적화된 weight는 유사도가 낮은 새로운 task에서는 적용 가능성이 낮기 때문이다.

데이터셋의 크기도 크고, 기존 task와의 유사성도 충분할 경우(Quadrant 2)

사실 이럴 경우가 가장 좋긴한데, 여기서 딜레마가 발생한다. 사실상 데이터셋이 충분하다는 가정만 있다면 Quadrant 1과 같이 처음부터 학습하더라도 큰 문제는 없다. 그러나 기존에 학습된 parameter의 representation이 새로운 task에 대해서도 좋은 supervision을 제공할 수 있다면 초반에 local optimal에 빠지거나 optimizer가 무의미한 탐색을 하지 않고도 빠른 속도로 수렴 가능한 parameter를 찾을 수 있을 것이다. 따라서 이런 경우에는 주로 가장 최하층(feature extraction 뒤쪽과 classifier 부분)을 fine-tuning하거나 re-training하는 형태로 학습이 진행되며, 나머지 layer에 대해서는 학습된 parameter의 도움을 받기 위해 frozen(유지)하는 방법을 선택한다.

데이터셋의 크기도 작고, 기존 task와의 유사성도 떨어지는 경우(Quadrant 3)

4사분면 중 여기가 가장 까다롭다. 사실 해당 문제에 대해서는 정답이라고 명확하게 정의할 수 있는 방법은 없으며, 데이터셋이 적기 때문에 새로운 task에 대해 overfitting 없이 generalization하기 곤란하다. 보통 quadrant 2에서 다룬 것처럼 일부 레이어만 학습하는데, 여기서는 frozen하는 이유가 위의 경우와는 다르다.
Quadrant 2에서는 학습된 weight을 통해 최적화 속도를 높이거나 성능을 향상시키기 위해 일부 layer만 학습하게 되지만, Quadrant 3에서는 dataset에 specific한 네트워크를 만들기 위해서 모든 레이어를 학습하게 되면 비교적 적은 양의 데이터셋에 대해 네트워크가 학습될 수 밖에 없기 때문에 overfitting의 위험이 있다.

데이터셋의 크기는 작지만, 기존 task와의 유사성이 높은 경우(Quadrant 4)

이럴 경우에는 quadrant 3와 마찬가지로 학습했을 때의 overfitting 문제를 신경써야한다. 그렇기 때문에 보통 데이터셋의 크기가 작긴 하지만 사전 학습된 네트워크의 representation mapping이 novel task에 적용할 수 있다고 판단되는 경우(similar task) 굳이 classifier를 제외한 부분까지 학습시키지 않는다. 일반적으로 classifier 부분은 파라미터 수가 상대적으로 적거나 학습했을 때 task-specific하게 fine-tuning이 될 수 있으므로 적은 데이터셋으로 학습하기 용이하다.


Knowledge distillation

그 다음으로 다룰 내용은 knowledge distillation이다. 기존에 학습된 네트워크를 활용하여 새로운 task에 적용하기 위한 방법으로 제시된 transfer learning과는 살짝 다르게, knowledge distillation은 단일 task에 대해 최적화되어 좋은 성능을 보이는 pre-trained model(teacher network)이, 보다 얕고 가벼운 light-weight network(student network)를 학습시키는데 보조적인 역할을 해줄 수 있다는 것이다. 지식을 전달한다는 의미의 knowledge distillation은 temperature($T$)라는 hyperparameter를 통해서 one-hot encoding에 비해 보다 합리적인 soft label을 만들어낼 수 있고(higher entropy), 이를 학습에 활용했을 때 hard label을 사용했을 때와 비교하여 ‘가벼운 모델로 하여금 최적화 성능을 높일 수 있다‘는 접근법이다.

즉 똑똑한 네트워크(Teacher network)의 output을 따라가게끔 Student network가 학습하는 과정을 의미하며, 이 학습법의 경우 굳이 convolutional neural network 구조가 아니어도 모든 형태의 deep network에서 활용될 수 있다는 범용성이 있다. 실제로 DeiT와 같은 transformer based approach에서도 사용될 수 있는 방법이다. 해당 논문에서는 inductive bias에 대한 의존성을 가진 convolutional neural network에 비해 적은 데이터로는 추론 능력이 떨어지는 transformer 모델을 학습하는 과정에서 CNN의 학습된 지식을 주는 형태로 knowledge distillation을 사용하였다.
최적화에 사용되는 loss는 다음과 같다. 학습하고자 하는 데이터셋과 hard label $(X,~Y)$과 temerature $T$에 대한 prediction student network $S(\cdot, T)$ 그리고 teacher network $R(\cdot, T)$에 대해서,

[ \mathcal{L} = T^2 \lambda \mathcal{L_t} + (1-\lambda) \mathcal{L_s} ]

위와 같이 나타낼 수 있고, 각각의 loss term(student loss, teacher loss는)

[ \mathcal{L_s} = \mathcal{L}_{CE}(Y, S(X, 1)) ]

[ \mathcal{L_t} = \mathcal{L}_{CE}(S(X, T),~R(X, T))
]

위와 같다. 여기서 temperature에 의한 prediction은 hard label을 soft label로 만들기 위한 과정으로, 다음과 같이 원래의 softmax 대신 temperature normalized softmax 값을 사용한다. [ q_i = \frac{exp(z_i/T)}{\sum_j exp(z_i/T)} ]

$z_i$가 네트워크의 prediction에 의한 logit값이 된다고 생각하면 된다.

위의 그림은 본인이 실제로 knowledge distillation 과제를 진행할 때 사용했던 CIFAR-10 데이터셋에 대한 teacher prediction(첫번째 이미지), 그리고 이 logit에 temperature $T = 40$을 적용했을 때의 soft label을 보여준다. 충분히 학습된 ResNet의 경우 CIFAR-10에 대해 95%가 넘는 정확도를 보여주었고, 이에 첫번째 이미지와 같이 엔트로피가 낮은 형태의 prediction을 보여주었다. 학습 시에는 이를 좀 더 누그러뜨린 엔트로피가 높은 형태의 prediction을 사용하기 위해 위와 같이 formulation해주게 된다.

Why knowledge distillation??

그러면 대체 왜 knowledge distillation을 사용해야하는 것이 실제 네트워크 학습에 도움이 되는 것일까? 단순히 classification이라면, 원래의 hard label에 대해 빡세게 트레이닝하는 것이 결국 성능을 높일 수 있는 방법이지 않을까 싶다.
Soft target의 효과를 설명하기 전에 우선 딥러닝에서 왜 knowledge distillation 방법이 제시가 되었는지 짚고 넘어가도록 하자. 딥러닝을 사용하며 모바일이나 임베디드 환경에서도 충분히 적용 가능한 최적화 네트워크를 구축하고 싶다. 즉, 다양한 edge device(핸드폰, 카메라, 게임기 등)에 딥러닝을 적용할 수 있기 위해서는 그만큼의 경량화 모델이 필요하고, 이는 이전에 다루었던 MobileNet 관련 게시글을 참고해보면 더 좋다.
아무톤 이런 방식으로 네트워크를 경량화하고자 하는 다양한 방법들이 소개가 되었으며, 단순히 성능이 좋은 무거운 네트워크를 학습하는 방법으로는 좋은 성능을 내기가 힘들다는 문제에 부딪히게 된다.

위의 두 개의 사진을 구분하는 task를 딥러닝이 해결한다고 생각해보자. 만약 단순히 binary classification 문제라면 네트워크는 ‘왼쪽은 고양이’, ‘오른쪽은 아기’라는 mapping을 학습하게 된다. 하지만 이러한 접근법은 low entropy, 즉 이미지에 대해 어떠한 연관성도 줄 수 없다는 것이다.

Attribute based soft label?

고양이 사진에서의 특징을 나열해보면, 스핑크스가 아니라면 털이 복실복실하고, 귀엽고, 위의 사진과 같은 경우에서는 ‘모자’를 쓰고 있으며, 눈망울이 크고 똘망똘망하다는 것이다. 이러한 세부적인 attribute는 오른쪽 그림에서도 어느 정도 찾아볼 수 있으며, 이러한 특성을 모두 배제하고 단순히 '모 아니면 도'의 학습을 하는 것은 파라미터 수가 적은 network로 하여금 일반화 성능을 떨어뜨릴 수 있다는 것이다. 그렇기 때문에 teacher network의 예측을 보다 smoothing하여, 잘 학습된 네트워크에서 특정 이미지를 보고 예측했던 다른 class에 대한 logit을 학습에 활용하겠다는 의미가 된다. 결국 cross entropy loss는 one-hot encoding으로 학습되기 때문에 다른 class의 예측값들은 무시되는게 맞는데, 이걸 활용할 수 없을까?에 대한 해결책이 되는 것이다. 또다른 측면에서 바라보았을 때, soft target은 network의 prior knowledge를 대변하는 값이므로(사전 학습된 네트워크의 implicit한 함수의 결과값으로 생각할 수 있다) $S(X, T) \rightarrow R(X, T)$

Use pre-trained model

결론을 말하자면 transfer learning, knowledge distillation 모두 ‘사전 학습된 네트워크‘를 사용하는 학습법이다. 두 개의 차이점은 transfer learning은 하나의 네트워크를 다른 task에 적용하는 방법에 대해서였고, knowledge distillation은 두 개의 네트워크(deep neural network and shallow network)를 사용해서 단일의 task에 대한 성능 향상 및 학습 보조에 대한 내용이다.


Continual learning

잘 학습된 자율주행 모델이 있다고 생각해보자. 그러나 자율주행을 하기 위한 학습에 사용된 데이터셋에는 ‘갑자기 등장하는 고라니’ 라던지 ‘갑자기 등장하는 캥거루’와 같은 데이터셋이 없었다고 가정해보자. 즉, 차량이 조심해야 하는 anormal situation에 동물이 갑자기 등장하는 상황이 포함되어 있지가 않다.
그렇다면 차량 내부 시스템의 업데이트를 통해 해당 데이터셋에 대해 추가적으로 학습해야한다. 물론, 이런 내용에 대해서 기존에 학습된 네트워크에 단순히 데이터셋만 추가하면 된다고 생각할 수 있지만, 흔히 anormal한 상황은 학습된 네트워크를 기반으로 한다고 하더라도 특별한 상황이기 때문에 representation에 대해 만족할 만한 성능이 나온다는 보장을 할 수 없을 뿐더러, 실제 학습에 사용될 수 있는 데이터셋도 분명 한정적일 것이다.
기존에 학습된 딥러닝에 대해서 새로운 task(갑자기 등장하는 동물에 대한 차량 통제)를 처리할 수 있게 하고는 싶은데, 원래의 성능(일반적인 상황에서의 주행)을 악화시키고 싶지는 않다. 바로 이러한 접근이 ‘continual learning‘의 시작이다.
만족스러운 continual learning이 이루어지기 위해서는 다음과 같은 요구사항이 뒷받침된다.

  • 네트워크는 새로운 task에 대해 좋은 성능을 보여야한다.
  • 네트워크는 기존 task에 대해서 성능을 유지해야한다.
  • 네트워크는 기존 task의 데이터셋을 요구하지 않는다(memory efficiency).
  • 학습 및 추론 과정에서의 time complexity(FLOPs).
  • 네트워크의 storage complexity(학습 가능한 representation의 범위).

Regularization based method

Continual learning의 다양한 방법론과 그 접근법에 대해 살펴보도록 하자. 위에서 언급했던 것처럼 ‘사전 학습된 representation’을 사용하는 transfer learning을 remind 해보자. 만약 기존에 학습된 network의 parameter를 크게 바꾸지 않고 새로운 task에 적용 가능한 학습법을 사용한다면, 기존 task의 성능을 어느 정도 유지하면서도 새로운 task에 대해 최적화가 가능할지도 모른다. 바로 이러한 방법을 ‘Regularized based method’라 부른다. 보통 복잡한 모델은 적은 learning rate를 통해 정규화하면서 기존 task 성능을 유지한다는 측면에서 이런 이름이 지어졌으며, 대표적인 방법으로는 ‘fine tuning‘이 있다.

Rehearsal based method

이러한 방법도 있다. 기존 taks의 data에 대한 sample을 buffer에 기록하고, 지금 task를 학습시키기 위한 dataset과 동시에 활용하는 것이다. 이러한 방식으로 접근하게 되면 기존 task의 supervision을 지속적으로 제공하면서도 새로운 task에 대해 최적화가 가능하다는 장점이 있다. 대표적인 방법으로는 ‘Learning without forgetting(LWF)‘이 있다.

Architecture based model

다음 방법으로는 학습 구조에 대한 의존성을 주는 부분이다. 이미 학습된 task의 성능을 그대로 유지한 채로 다른 task를 학습하고자 하면, 단순히 네트워크를 확장시키거나 auxiliary head를 활용한 학습을 고려해볼 수 있다. Rehearsal based method와 거의 유사하지만 차이가 있다면 이 task의 경우에는 네트워크의 구조를 여러 task에 맞게끔 바꾸는 것이 주된 목적이기 때문에 기존 task의 dataset도 요구한다는 점이 될 수 있다. 대표적인 방법으로는 ‘Multitask learning‘이 있다.


Feature extraction

앞서 간단하게 continual learning의 여러 접근 방식에 대해 살펴보았다. 이러한 방법들의 가장 근간이 되는 baseline인 feature extraction은 매우 간단하다. 다만 시작하기 전에 notation을 정리하고 넘어가도록 하자.

  • $\theta_s$ : Shared parameters
  • $\theta_o$ : Task-specific weights for previously(old) trained tasks
  • $\theta_n$ : Randomly initialized task-specific parameters for new tasks.

Feature extraction은 shared parameters(보통 ocnvolutional layers는 모두 해당된다)를 기존 task 그대로 사용하되, 새로운 head를 붙여 new task에 대해 학습하는 것을 의미한다. 즉 앞서 소개했던 transfer learning의 용어로 보면, feature extractor인 convolutional network($\theta_s$)는 frozen(고정)된 상태로, new task($\theta_n$)를 최적화하는 구조가 된다. 물론 head가 서로 다르기 때문에 old task에 대한 framework($\theta_s + \theta_o$)에 영향을 주지 않기 때문에 old task에 대한 성능을 그대로 유지할 수 있다는 장점이 있으며, 단점은 feature extractor가 새로운 task에 대해 최적화될 수 없기 때문에 new task에 대한 성능 향상이 한정적이라는 것이다.


Fine tuning

미세 조정이라는 의미대로, fine tuning은 작은 learning rate을 기반으로 기존 parameter를 미세하게 최적화하는 것을 의미한다. feature extraction보다 많은 parameter에 대해 최적화가 가능하기 때문에 new task의 성능을 더 끌어올릴 수 있다는 장점이 있으나, 만약 새로운 task가 기존의 task와 상이한 경우 기존 task의 성능이 급격하게 낮아질 수 있다는 문제가 있다. Feature extraction에서는 parameter $\theta_s + \theta_o$ 전체가 freeze된 상태였지만, fine tuning에서는 $\theta_s(:k) + \theta_o$(여기서 $k$는 fine tuning하고자 하는 convolutional layer의 첫 인덱스를 의미한다.) 부분만 fixed된 상태고, 나머지 weight 모두 영향을 받기 때문에 문제가 될 수 있다. 물론 fine-tuning에서 fully connected layer만 하게 되는 경우에는 기존의 feature extraction과 동일한 방법으로 취급된다.


Multitask learning(MTL)

Multitask learning은 우선 학습하고자 하는 모든 task의 데이터셋이 존재하는 경우 사용할 수 있는 방법이다. 기존 방식과는 다르게 $\theta_s,~\theta_o$ 그리고 $\theta_n$이 모두 jointly optimized된다. 일반적으로 feature extraction 부분은 공유가 되면서, head 부분만 각 task에 맞게 조정된다.

Multitask learning의 목적은 training과 관련된 여러 유사한 domain specific information들을 종합적으로 활용하여 single task generalization(일반화) 성능에 도움을 주기 위함이다. 예를 들어 자율주행에서 가장 주가 되는 task는 운전 손잡이를 상황에 따라 어느 방향으로 틀어야 하는가이고, 여기에 부수적으로 길가에 있는 표지판이나 신호, 교통상황에 따라 엑셀이나 브레이크를 밟는 것이 auxiliary task가 된다. 추가적으로 auxiliary task는 주가 되는 task와 함께 학습될 때 L2 regularization을 통해 weight가 상이하지 않도록 조절된다. 또한 단순히 single task의 성능을 높이는 것과 더불어 auxiliary task 및 main task를 포함한 모든 task의 성능을 동시에 올리는 구조가 된다.
앞서 설명했던 것에 이어서 MTL이 가질 수 있는 네트워크 공유 구조에 대한 variation은 다음과 같다. 만약 여러 task에 대해 일반화를 진행하는 학습 과정이라면 ‘굳이’ feature extraction parameter가 공유될 필요는 없다(아래 그림 참고).

물론 위와 같이 모든 파라미터를 공유하는 형태의 학습이 존재하고, 이를 ‘hard parameter sharing’이라고 부른다. 단일 feature extraction network가 모든 task에 대해서 학습이 되기 때문에 overfitting의 위험성이 적고, task마다 parameter를 가져가는 것에 비해 파라미터 수가 $N$배 적기 때문에 그만큼의 overfitting 방지 효과를 획득할 수 있다. 이와는 다르게 각 task마다 네트워크 parameter를 서로 다르게 가져가는 형태도 존재한다. 다음 그림을 보면,

위와는 다르게 Task A, B, C가 서로 다른 네트워크를 통과하는 형태다. 그러나 여기서는 cross-talk라는 regularization term이 있게 되는데, 바로 앞서 설명했던 L2 regularization을 통해 weight를 서로 비슷하게 유지해준다는 것이 이 부분이다. 전반적으로 모든 task가 서로 다른 최적화 과정을 거치게 하되, 각 layer마다의 parameter가 유사하게끔 학습되는 것이다.

여기에 추가로, 서로 다른 task의 activation map이 교차되면서 학습되는 cross-stitch 방식도 존재한다. 논문 제목에서 알 수 있듯이 두 activation map이 서로 교차되어 input activation map과 곱해지게 된다.

[ \begin{bmatrix} \tilde{x_A}^{ij} \newline \tilde{x_B}^{ij} \end{bmatrix} = \begin{bmatrix} \alpha_{AA} & \alpha_{AB} \newline \alpha_{BA} & \alpha_{BB} \end{bmatrix} \begin{bmatrix} x_A^{ij} \newline x_B^{ij} \end{bmatrix} ]

이러한 MTL 방식은 모든 network와 dataset이 동시에 GPU에 올라가야 학습이 가능하기 때문에 메모리 소모가 심하다. 그러나 여러 task에 대해서 동시에 최적화가 가능하기 때문에 이를 통해 얻을 수 있는 이점도 있다.
Multitask-learning에서 사용되는 loss는 모든 task loss를 합해서 사용하게 되는데, 이때 task 종류에 따라 쉬운 task의 경우 상대적으로 적은 gradient를 가지게 되므로 학습 불균형이 발생한다. 따라서 이를 적절하게 조절해주기 위해 weighted sum loss를 사용하게 된다.

[ L_{total} = \sum_i w_i(t) L_i ]

여기서 중간에 $t$ term은 epoch를 의미하고, 각 task마다 수렴 속도가 다르기 때문에 이를 동적으로 할당해주는 loss를 의미한다. 해당 loss의 specialized version이 단순한 weighted loss라고 보면 된다.


Learning without forgetting(LWF)

만약 학습 과정에서 모든 데이터셋을 동시에 학습시키기 힘든 상황이라면 어떨까? 그러면서 동시에 old task에 대한 representation을 유지하면서 학습하고 싶다고 해보자. 이러한 관점에서 제시되는 방법이 바로 LWF(Learning without forgetting)이다. 해당 방법을 사용하게 되면 feature extraction 및 fine tuning보다 new task에 대한 적응력도 좋으면서, old task에 대한 성능도 유지할 수 있다. 또한 MTL에서는 기존 데이터셋에 대한 최적화도 함께 진행해야하므로 학습 속도가 느리다는 단점이 있지만 LWF에서는 그럴 필요가 없기 때문에 학습 속도도 향상된다. 무엇보다 학습 framework가 비교적 간단하다는 장점이 있다.
학습 과정을 여러 단계로 분류해서 나타내면 다음과 같다.

  • Pre-train network $F_{\theta_s,\theta_o}$ with old task. $\theta_s$ means a parameter that can be trained in a shared network, and $\theta_o$ means a parameter that can be trained in a classifier specialized in the old task.
  • Generate soft label $y’$ based on pre-trained network $F_{\hat{\theta_s},\hat{\theta_o}}(x_n)$. Soft label can be generated as $y_o’ = \frac{(y_o^{(i)})^{1/T}}{\sum_j (y_o^{(j)})^{1/T}}$ and $y_o^{(i)} = F_{\hat{\theta_s},\hat{\theta_o}}(x_o^{(i)})$.
  • Freeze $\hat{\theta_s},~\hat{\theta_o}$ and train new task classifier $\theta_n$ with new task supervision $(x^i_n,~y^i_n),~i=1,~\cdots,~l$ and criterion of cross-entropy loss $CE(y_n, F_{\theta_s,\theta_n}(x_n))$.
  • Jointly train $\theta_s,~\theta_o,~\theta_n$ with low learning rate with soft label of old task supervision and new task supervision. The training criterion is $\lambda_o\mathcal{L_{old}}(y_o’, \hat{y_o’})+\mathcal{L_{new}}(y_n, \hat{y_n})+\lambda_r \mathcal{L}_2$.

과정을 전부 영어로 썼는데 간단하게 풀어서 말해보면, 우선 old task에 대해 사전 학습된 네트워크가 있다고 가정해보자. 학습된 네트워크를 통해 new task dataset $x_n$에 대한 soft label을 추출한다. 그렇다면 이 soft label은 old task에 대해 최적화된 네트워크로부터 나온 representation을 그대로 유지하고 있게 된다. 그 다음에 학습 과정에서는 이렇게 추출된 soft label과 prediction 사이에 대한 loss와, 실제 ground truth와 prediction 사이의 loss를 계산한 뒤에 이를 weighted summation하여 최적화한다. 여기에 L2 regularization을 통해 weight가 안정적으로 학습될 수 있도록 해준다.


각 접근법의 한계점

앞서 크게 총 세가지의 접근법을 언급하였다. 첫번째로, 정규화 방법으로 사용된 fine-tuning의 경우 새로운 task에 대한 최적화에 있어서는 좋은 효과를 보였지만, 기존의 task의 성능을 거의 잊어버리는 결과를 가져왔다. 특히 복잡한 형태의 multitask를 해결하기에는 불가능한 학습법이라고 할 수 있다.
두번째로 언급했던 구조적인 접근을 했던 MTL(Multi-Task learning)은 네트워크가 학습되는 상황에서의 task identity를 요구하기 때문에, 실제로 class incremental(분류해야하는 class의 수가 늘어나는 경우)와 같은 상황이나 task-agnostic setting(task가 같이 학습되는 구조에서 상이하면 퍼포먼스가 저하됨)과 같은 부분에서 한정적일 수밖에 없는 것을 알 수 있다. 물론, 메모리 문제가 항상 이슈가 된다.
마지막으로 LWF(Learning without forgetting) 방법으로 소개된 rehearsal based는 작은 buffer size에서는 사용될 수 없으며(new task에 대한 old representation의 labeling이 필요), 무엇보다 데이터셋에 보안 문제가 있다면 사용될 수 없다는 단점이 있다.


Self-supervised learning

전공 공부를 할 때를 떠올려보자. 만약 전자회로나 전자기학을 수강 중인데, 예제 문제에 풀이가 없다면 우리는 당장 체그..랑 구글링을 시작한다. 그런데도 도저히 해당 문제에 대답을 찾을 수 없을 때도 있으며, 원하는 정답이 아닌 이상한 답변만 가득 적혀있는 경우가 많은 적이 종종 있다(나만 그런거 아니지??).

이런 상황에서 잘 알아차리고 ‘정답이 잘못되었구나‘라는 사실을 잘 인지할 수 있거나 혹은 문제에 대한 정답을 우리가 직접 풀어서 알지 못한다면, 이상한 답변을 학습하거나 혹은 문제에 대한 답을 알지 못해서 시험을 조질 것이다 ㅠㅠ.
딥러닝도 마찬가지다. 우리가 지금까지 정의한 문제는 결국 input에 대해 원하는 output이 있는 경우에만 다루었던 것. 만약 다량의 이미지가 있고, 이 모든 이미지에 대해 사람이 하나씩 분류해서 라벨링을 해야 한다면, 이는 생각보다 힘든 작업이 될 것이다. 사람이 편하자고 인공지능을 만들었는데, 그걸 학습시키기 위해 인간이 고생하는 아이러니한 상황이 빚어지는 것.

다들 무신사에서 옷을 사본 적이 있는가? 무신사는 현존하는 온라인 편집숍 중 가히 대학생들의 성지 뿐만 아니라 남녀노소 많이 이용하는 플랫폼이라 할 수 있다. 무신사에서 물건을 사면 후기를 남길 수 있는데, 이게 또 전신이 나와야하고, 후기를 남길 때의 조건에 따라 적립금을 줄 수 없는 대상(미지급 대상)을 선정하게 된다. 이걸 직접 사람이 하나하나 하기에는 노가다성이 짙고, 그러자고 딥러닝 모델을 학습시키자니, 이걸 하나하나 라벨링하기엔 고생스럽다. 해당 내용에 대해 무신사 데이터솔루션 팀에서 작성한 글이 있다. 혹시 관심이 생긴다면 해당 글을 읽어보는걸 추천한다.
사실 갑자기 무신사를 홍보하려고 했던 것은 아니고, 이런 식으로 현업에서도 딥러닝을 사용할 때 supervision 구하기가 힘든 경우가 많다는 것이다. 이러한 측면에서 제시되는 것이 사람의 간섭 없이도 modality에 대한 representation을 잘 학습할 수 있는 방법인 self-supervised learning이다. 그렇다면 결국 label 없이도 이미지에서 feature를 잘 뽑아낼 수 있게 학습해야하는데, 그러면 보통 가지고 있는 (image, label) 페어에서 label이 없이 image만으로도 학습을 해야한다는 의미가 된다. 이를 pre-text task라고 부르고, 이렇게 학습된 representation으로 여러 downstream task를 수행할 수 있게 된다.


Examples of pre-text task

가장 간단한 방법은 이미지를 회전(augmentation) 시키고, 회전 각도를 예측하는 형태로 학습하는 것이다. 회전 각도를 인지하기 위해서는 이미지의 object를 파악하거나 feature를 활용해야하고, 그렇게 학습되다보면 임의의 이미지를 넣어도 representation이 잘 출력될 수 있지 않을까라는 컨셉이다.

그 다음으로는 퍼즐 맞추기와 같이 patch의 위치를 예측하는 task가 있다. 이미지 상에서 랜덤으로 하나의 patch를 고른다. 그런 뒤 첫번째 패치를 기준으로 주변에 $3 \times 3$ 크기의 grid를 가정하여 나머지 8개의 patch 위치를 잡아낸다. Model은 8개의 주변 patch들의 위치를 예측하는 task를 해결하면서 representation 학습을 하게 되는 것이다.


Contrastive learning이란?

Self-supervised learning 방법으로 제시되는 논문 중, contrastive 방식이 아닌(clustering) 경우도 있다.

이러한 방식의 경우 supervision을 얻는 대신, 데이터 간의 관계를 사용하여 task를 해결하려는 알고리즘이다. 그러나 이러한 방식에 있어서 한계가 존재하기 때문에, 지금부터 설명할 내용들은 모두 contrastive learning 방식을 활용한 self-supervised learning이라고 생각하면 될 것 같다.

Contrastive learning의 개념은, 간단하게 설명해서 비슷한 샘플들끼리는 모이게 하고 서로 다른 샘플들끼리는 멀어지게 하는 것이다. 위의 그림을 참고해보면 이해가 쉬울 것 같다. 서로 같은 class라면(positive pair) 가까워지게끔, 서로 다른 class라면(negative pair) 멀어지게끔 구성한다. 따라서 Contrastive learning에서는 positive, anchor 그리고 negative라는 개념이 정의된다. ‘Anchor’는 일종의 샘플 query를 의미하고, 예를 들어 새 이미지가 있다면 이에 대응하는 또다른 새 이미지는 ‘Positive’, 같은 class에 속하지 않는 비행기 이미지는 ‘Negative’로 간주한다. 여기서 언급되는 positive pair(anchor, positive)의 샘플 쌍을 의미하며, 반대로 negative pair(anchor, negative) 샘플 쌍을 의미한다.
그런데 다들 알다시피 self-supervised learning에서는 각 샘플들의 label을 알 수 없다. 결국, contrastive image pair를 만들기 위해서는 비슷한지 혹은 상이한지에 대한 knowledge 및 supervision이 있어야하는데, 결국 여기서 또다시 모순이 생겨버리는 것이다. 이걸 해결하는 방법은 다음과 같다.
만약 $N$개의 이미지가 있다면, $N$개의 서로 다른 이미지는 서로 다른 $N$가지의 클래스로 구분된다고 하자. 그렇게 되면 모든 샘플들에 대해서 triplets(positive, negative pair)를 구성할 수 있게 된다.

Triplet의 예시.. 아무튼 모든 샘플에 대해 세 요소인 negative, positive, anchor를 구성할 수 있게 되는 것이다. 그렇다면 ‘negative pair’는 그냥 서로 다른 이미지를 갖다 붙이면 되는거고, ‘positive pair’는 과연 어떻게 구성해야할까??


Data augmentation pipeline

바로 여기서 사용할 수 있는 것이 data augmentation이다. 단순하게도, 한 이미지에 augmentation 변형을 적용한 이미지는 결국 원본 이미지와는 다르지만 같은 객체에 대한 정보를 담고 있기 때문에 encoding된 결과가 유사해야한다.

유명한 논문 중 하나인 SimCLR에서 언급된 내용은 이와 같다. 중간에 stochastic한 augmentation module인 $A(x)$ 혹은 $T$가 있고, 서로 다르게 augmented된 이미지인 $x_i$ 그리고 $x_j$는 서로 유사한 인코딩 값을 뽑게끔 학습되어야한다. 다만 SimCLR에서 주장했던 것은 이러한 object의 pose 및 alignment를 유사하게 만들게끔 학습하게 되면 representation 학습에 있어서 다양한 샘플을 얻을 수 없다는 문제가 발생하기에, 여기에 추가적으로 Linear layer(Representation extraction)을 통해 추출한 $z_i,~z_j$를 유사하게 만드는 학습법을 제안하였다. 따라서 위의 그림에 대해서 언급하자면 $h_i,~h_j$에 대한 유사도를 메트릭으로 삼게 되면 마치 앞단의 encoder가 spatial transformer network와 같이 동작해서 downstream task를 해결하는데 있어 일반화가 어려워진다는 것. 즉 뒤쪽에 붙은 representation extraction 부분이 일종의 affine 필터(STN) 역할을 해준다고 볼 수 있다.

Contrastive predictive coding(CPC) 논문에서 제시된 augmentation은 다음과 같다. 이미지에 color fitter, random grayscale 그리고 random flip과 같이 흔히 볼 수 있는 data augmentation 기법을 적용한 뒤에 image를 overlaying sub patches로 분할한다. 패치 중 하나를 anchor로 삼고, 나머지 패치 중에서 positive pair로 삼게 될 패치 하나와, 자기 자신과 다른 이미지에서 생성된 패치 중 하나를 negative pair로 삼는다.

이외에 AMDIM, SimCLR 그리고 Moco와 같이 대부분의 유명한 논문들에서 사용하는 augmentation은 위와 같다. 이미지에 jitter, flip과 같이 일반적으로 볼 수 있는 data augmentation을 적용하는 것까진 동일한데, 패치로 나누는 형태가 아니라 같은 이미지에 서로 다른 data augmentation을 적용한 쌍을 positive pair, 서로 다른 이미지에 대해 각각 data augmentation을 적용한 쌍을 negative pair로 삼는다.

앞서 설명했던 모든 pair에 대해서 이미지를 latent space로 mapping하고, 이렇게 추출된 feature map을 기반으로 contrastive loss를 최적화한다.

CPC의 경우 latent space에서의 future를 prediction한다고 표현된다. 이는 image patch를 일종의 timeline으로 삼아서, top-left 부터 bottom-right 까지 순서대로 구성되었다고 보고, 이를 auto-regressive하게 풀어냈기 때문이다.

AMDIM에서는 두 개의 augmented sample를 생성하고, 각 이미지에 대해 같은 encoder를 통과시킨 feature map을 서로 다른 feature level 단에서 비교하게 된다. 따라서 spatial scale에 따라 비교가 이루어진다는 장점이 있다.


Loss function with similarity measure

Latent space, feature map 등 다차원의 벡터에 대해 유사도를 구하는 법은 여러가지가 있지만, 다음과 같은 코사인 유사도를 사용하거나 혹은 내적(inner product)를 사용한다. Cosine similarity가 결국 normalized inner product와 같기 때문에 두 metric을 서로 동일하게 취급 가능하다.

[
\begin{aligned} \cos \theta =& \frac{\vec{a}\cdot \vec{b}}{\parallel \vec{a} \parallel \parallel \vec{b} \parallel} \newline \parallel \vec{a} \parallel =& \sqrt{a_1^2 + a_2^2 + \cdots + a_n^2} \newline \parallel \vec{b} \parallel =& \sqrt{b_1^2 + b_2^2 + \cdots + b_n^2} \end{aligned} ]

이렇게 구한 유사도는 특정 범위 내에서 두 벡터가 서로 유사할 확률과 같이 해석되므로, 여기에 그대로 negative log likelihood를 토대로 optimize할 수 있다. 바로 이렇게 유도한 식이 Negative contrastive estimation loss(NCE loss)가 된다.

[ NCE_{Loss} = -\log \left( \frac{\exp (sim(g(x), g(x^+)))}{\exp (sim(g(x), g(x^+))) + \sum_{k=1}^K \exp (sim(g(x), g(x^-_k)))} \right) ]

이렇게 학습된 representation을 기반으로 위와 같이 downstream task(분류, 검출 등등)을 fine-tuning해서 사용하게 된다. 그런데 SimCLR에서는 위의 NCE loss가 아닌 NT-Xent(Normalized temperature-scaled cross entropy loss)를 사용하였다.

[ 1_{i,j}= -\log \frac{\exp (sim(z_i, z_j)/ \tau )}{ \sum^{2N}_{k=1} 1_{(k \neq i)}\exp (sim(z_i, z_j) / \tau)} ]

참고로 SimCLR에서 언급했던 내용 중, random crop + random jitter이 self-supervised learning의 representation 학습에는 큰 도움이 되었으며, 앞서 언급했던 것과 같이 nonlinear projection을 통한 spatial transform 그리고 batch 내에 negative sample 수를 늘리거나 더 큰 네트워크를 사용하기, 혹은 더 긴 epoch 만큼 학습시키기와 같은 scaling up 방법이 성능 향상에 도움이 되었다고 한다.

A n o t h e r p o s t i n c a t e g o r y