loading

Low shot learning에 대하여


Few shot, Zero shot learning

Published on December 20, 2022 by JunYoung

Meta learning Low shot Few shot Zero shot AI Deep learning

14 min READ

일반적으로 네트워크를 학습시킬 때, 대량의 데이터를 통해 최적의 parameter를 찾는 과정을 생각하게 된다. 그러나 만약 inference에 사용될 데이터셋에 대한 학습 데이터가 없거나 부족하다면, 네트워크는 적은 데이터로도 충분히 최적화될 수 있어야한다. 여기서 출발한 개념이 바로 ‘Low-shot learning’이며, 여기서의 ‘shot’은 네트워크에게 제공되는 학습 데이터셋을 의미한다.

Few shot learning

현재의 딥러닝 방법들은 few examples(적은 학습 데이터셋)을 기반으로 일반화가 불가능하다. 대부분 다량의 parameter를 업데이트하는 방법으로 충분히 많은 training sample을 통한 정규화에 초점이 맞춰져있으며, 특히 overfitting을 방지하기 위해 다양한 data augmentation과 같은 정규화 방식이 제안되고 있다. 그렇기 때문에 데이터가 없는 상황에서 특정 task에 대해 적용 가능한 최적화된 네트워크를 만드는 것은 어쩌면 불가능할 수 있다. 일반적인 few-shot learning(FSL)에는 다음과 같은 예시가 있다.

  • Character generation : 캐릭터를 생성하는 작업의 경우, 해당 캐릭터에 대한 example이 많이 존재해야하지만, 저작권 문제나 이런 저런 이슈들로 인해 충분한 샘플을 확보하지 못할 수 있다.
  • Advance Robotics
  • Training sample을 얻기 힘든 task : drug discovery, FSL translation, cold-start item recommendation

Machine learning에서는 computer program은 특정 task $T$로부터 나오는 $E$라는 experience를 학습하고, 학습 결과로 나오는 performance measure $P$에 대한 성능 향상을 이루는 것이 주 목적이다. 예를 들어 Image classification이라는 task가 있다면, 각 클래스 별로 존재하는 대용량의 labeled image(클래스 별로 구분된 이미지)가 곧 computer program이 경험할 수 있는 experience $E$가 되고, 네트워크로 하여금 예측된 각 이미지의 class에 대한 정확도(accuracy)가 측정 메트릭, performance가 된다. Few-shot learning에서는 바로 여기서 말하는 experience $E$가 현저히 부족한 상황에서의 문제를 이야기하며, 이를 딥러닝에서 사용하는 용어로 표현하자면 task $T$에 대한 supervision이 limited되었다고 할 수 있다.
FSL 방법은 주로 사용할 수 있는 supervision dataset $E$를 활용함과 동시에, 이미 가지고 있는 prior knowledge와 함께 결합하여 learning이 feasible하도록 유도하는 것이다. 예를 들어 character generation이라면 supervision은 각 캐릭터에 대해 존재하는 적은 샘플들을 의미하고, 같이 활용될 수 있는 prior knowledge로는 캐릭터를 생성함에 있어서 각 부분이나 관계에 대한 생성법이 될 수 있다. 또다른 예시로 drug toxicity discovery에 대해서는 새로운 분자 구조가 주어지는 환경에서, 이미 알고있는 유사한 형태의 분자 구조를 prior knowledge로 생각해볼 수 있다. 마지막으로 image classification의 경우에는 각 클래스별 라벨링된 데이터셋이 부족한 환경에서, 다른 classification task에 대해서 학습된 네트워크가 prior knowledge로 사용될 수 있다.
또한 이러한 few-shot learning에서의 특별한 케이스로, 학습 가능한 샘플의 수가 하나만 있는 one-shot learning, 그리고 task $T$에 대해서 참고할 만한 example이 아예 없는 zero-shot learning으로 구분될 수 있다. Zero-shot learning에서는 environment $E$가 다른 modality(attribute 혹은 word embedding 등)를 가지고 있어야 하고, 이를 통해 몇몇 supervised information을 transfer하여 inference가 가능하게끔 해야한다.

일반적으로 사람은 자신이 알고 있던 배경 지식을 토대로 추정하고(고양이를 살면서 한 번도 본적이 없는 사람이 고양이를 보고 강아지라고 한다), 만약 이렇게 추정된 내용이 잘못되었다고 하면(친구가 그건 강아지가 아니라 고양이라고 알려줌) 즉각적으로 해당 object에 대한 지식을 얻게 되고(사실 강아지가 아니라 고양이었다는 사실을 알게됨), 다음 번에 다시 해당 object를 보게 되면(길고양이를 다시 마주함) 그때는 잘못된 추론이 아닌 제대로 된 정답을 낼 수 있다. 이를 딥러닝의 일련의 과정으로 나타내면 error를 통한 loss 발생이 한번에 해당 task에 대한 optimization으로 이어져서 한 번의 경험(데이터셋)으로도 일반화가 가능하다. 물론 이는 사람의 경우이고, 딥러닝에서는 단순히 이미지 하나에 대해서만 최적화를 하는 것은 optimal solution이 될 수 없다. 결국 이전에 우리가 진행했던 supervised learning에서의 학습법인 ‘learn from scratch’ 방식을 사용할 수 없다.

따라서 위와 같이 ‘support set’이라는 학습 가능한 하나의 에피소드를 구성하게 된다. 여기서 $N$-classes $K$-shots라 표현된 부분은, 학습에 사용될 support set의 클래스 개수가 $N$이고 각 클래스 별로 존재하는 샘플의 수가 $K$라는 것이다. 그리고 Query set은 이렇게 최적화된 네트워크를 통해 실제로 추론을 진행할 샘플이라고 보면 된다.

일반적인 supervised learning은 image classification에서 첫번째 이미지와 같이, 모든 클래스에 대해 $N$개의 샘플이 있다면 그 중에서 $K$개를 training, 나머지 $N-K$개를 testing에 사용한다. 그러나 few-shot learning에서는 이와는 약간 다르게 class중의 일부(위의 예시에서는 5개)를 pre-training 및 training dataset에 사용하고, 나머지 class 5개에 대해서 support set(사전 학습된 데이터셋과 겹치지 않는 class)를 구성하게 되고, task에 맞게 적은 샘플들로만(ex. $3$ samples) 구성한다. 그리고 학습될 때 사용되지 않는 데이터(ex. $N-3$ samples)는 query set으로 이후 few-shot training의 성능 평가에 사용된다. Few-shot learning의 접근법에는 다음과 같은 방식들이 있다.

  • Transfer learning
  • Data augmentation/Transformation/Synthesis
  • Meta Learning(learning to learn)
  • Metric based approach(Embedding Learning)
  • Multi-task Learning
  • Generative learning

여기서 transfer learning, multi-task learning과 관련된 부분은 앞서 게시글 중 다양한 딥러닝 학습법에서 다룬 내용과 같다. 이 중에서 이번 글에서는 ‘학습 전략을 위한 학습‘인 meta learning 그리고 ‘metric 기반 추론법‘인 embedding learning에 대해 살펴볼 것이다. 그리고 여력이 된다면 마지막 부분인 생성 모델을 활용한 방법에 대해서도 간략하게 정리를 해보도록 하겠다.


Utilizer prior knowledge for FSL(Few-Shot Learning)

다른 게시글에서도 언급했던 내용인데, transfer learning은 각 클래스 별로 적은 샘플만 가지고는 잘 작동하지 않는다. 그리고 fine tuning을 마지막 레이어에 대해서만 진행한다고 해도 학습에 사용되는 sample 개수가 너무 부족하기 때문에 overfitting의 위험성이 높다. 따라서 다른 유사한 problem들로부터 experience를 획득하고, 이렇게 얻은 prior knowledge를 활용하는 방식을 채택하게 된다. 이러한 prior-knowledge를 각 domain에서 얻는 방법으로는,

  1. Dataset으로부터 얻는 방법
  2. Similarity로부터 얻는 방법
  3. Learning으로부터 얻는 방법

크게 세 방법으로 구분될 수 있다.

Prior knowledge about data

Dataset으로부터 prior knowledge를 얻는 방법은 비교적 심플하며, 정말 말 그대로 support set의 augmented dataset을 통해 진행된다.

예를 들어 학습에 사용될 support set인 $D_{train}$이 있다고 해보자. 여기에서 추출할 수 있는 sample과 label pair에 해당되는 $(x_i,~y_i)$에 대해, 학습된 transformation function $t$를 적용해서 augmented support set $(t(x_i),~y_i)$를 ouput으로 얻을 수 있다. 이에 추가적으로 labeling이 부적합하거나 완료되지 못한 샘플 $(\bar{x},~-)$에 대해 $D_{train}$을 기반으로 라벨링을 진행한다. 즉, 예측값을 토대로 $(\bar{x},~t(\bar{x}))$와 같이 labeling을 하는 것이다. 또한 similar data sets로부터의 샘플 $(\hat{x}_j, \hat{y}_j)$를 aggregator $t$를 통해 조합한 output $(t( \hat{x}_j ),~t( \hat{y}_j))$를 도출하게 된다. 여기서는 mixup을 사용한다. 이처럼 transformer $t$가 prior knowledge로 사용되어 각 dataset category에 따른 output을 만들어낸다.

Prior knowledge about learning

Transfer learning은 사실 이 카테고리에 속하는 내용이다. 그러나 보다 좋은 방법이 바로 Meta learning이라는 방법이고, 학습 전략을 위한 학습법이다. 만약 task $T$를 해결하고 싶다면, meta-learning 알고리즘은 training task $T_i$의 여러 배치에 대해서 학습이 되며, 이때 중요한 것은 모든 $T_i$에 대해 [ T_i \cap T = \emptyset ] 임이 보장되어야 한다. 결국 이러한 다양한 task인 $T_i$에 대해서 학습되면서 정말 풀고자 하는 task $T$를 잘 학습하고자 하는 것이다. 쉽게 비유하자면 수능을 잘 풀기 위해서 모의고사를 많이 푸는 것이다. Training data에 대한 multiple task가 학습이 되고, 이러한 multiple task의 결과로 learning algorithm을 meta-learning한다. 이렇게 최적화된 learning algorithm을 사용해서 network를 학습시키고, 이렇게 최적의 방법으로 최적화된 model을 사용하여 실제 task에 대한 성능을 확인한다.

각 base set은 여러가지의 episode로 구성되고, 각각의 episode는 (support set, query set)으로 이루어져있다. 앞서 언급한 learning algorithm을 meta-learning하는 부분이 바로 이 base set을 사용하는 과정이다. 학습법에 대한 최적화가 끝나게 되면, 해당 방법을 통해 support set으로 네트워크를 학습한다. 이때는 실제 task에 대한 $N$-ways $K$-shots support set을 학습에 사용한 뒤 실제 task의 query set에 대한 예측 성능을 확인하게 된다. 모델은 여러 episode가 포함된 batch를 해결하면서 파라미터를 업데이트하고, 이러한 방법을 통해 새롭게 unseen few-shot classification task가 나왔을 때도 안정적이고 효과적으로 학습할 수 있는 학습법을 찾게 된다.

MAML(Model-Agnostic Meta-Learning)이 이러한 learning 알고리즘 중 하나로 소개되는데, meta learning을 활용하면서도 동시에 neural network를 두 가지의 backpropagation을 진행하면서 최적화한다. 가장 메인이 되는 컨셉은, neural network를 학습하는 과정에서 빠르고 적은 샘플로도 새로운 classification task에 적응 가능한 parameter를 가지게끔 학습하는 구조를 잡는 것이다.

따라서 MAML은 총 두 개의 neural network 구조를 가지고, 두 네트워크는 서로 같은 구조를 공유한다. 즉 하나의 네트워크를 통해 두가지의 역할을 수행하는데, 그 중 하나는 learner(학습자)로서 앞서 언급했던 것과 같이 새로운 task에 대해 잘 학습할 수 있는 학습법(meta-learning)을 학습하고, 나머지는 adapter(적응자)로서 각 task에 빠르게 적응할 수 있는 알고리즘을 학습한다. 서로 다른 task를 해결하는 과정이기 때문에, 각자의 task에 맞는 learning rate이 사용된다. 구체적인 학습 알고리즘을 각 step 별로 나타내면 아래와 같다.

  • Learner(학습자)를 랜덤하게 초기화한다.
  • meta-training에 사용되는 모든 episode에 대해 아래와 같은 과정을 반복한다. 반복은 특정 epoch 수만큼 진행되거나, meta-parameter가 안정화에 접어들 때까지 진행한다.

    • Meta-training에 사용될 episode의 batch를 샘플링한다.
    • Adapter의 parameter를 learner의 parameter로 초기화한다.
    • Inner training step이 정해진 횟수만큼 진행될 때까지, adapter를 batch의 support set에 대해서 학습시키고 loss 및 gradient based optimization을 진행한다.
    • 최적화된 adapter의 parameter를 사용하여 batch의 query set에 기반한 meta-loss를 계산한다.
  • meta-gradient를 계산한다. 위에서 batch의 query set에 기반한 meta-loss를 계산하였는데, 이를 토대로 meta-parameter를 최적화하고, learner의 parameter를 update한다.

각 task에 대해서 구체적인 과정을 살펴보면 다음과 같다. 먼저 meta-learning에 있어 학습된 learner $M$을 복사한 adapter $f$를 만들고, $f$의 parameter를 learner의 parameter인 $\Theta$로 초기화한다. 그런 뒤 meta-training support set으로 adapter $f$를 빠르게 fine-tuning한다. 이렇게 특정 task의 support set에 대해 최적화가 끝난 adapter $f$에 query set을 적용하고, 이 과정에서 추출된 meta-learning loss를 사용하여 $\Theta$와 함께 meta-learning parameter를 최적화한다. Meta-training 과정에서는 MAML은 initialization parameter를 학습하게 되며, 각 network(adapter)가 새로운 few-shot task에 대해 빠르게 학습 및 최적화될 수 있도록 학습된다. 그리고 Inference에는, meta-trained model을 사용하여 meta-test set를 예측하고, 여기서 중요한 점은 query set에 대한 추가적인 gradient는 있지만 직접적으로 learner의 parameter는 이를 통해 바뀌지 않는다. 즉 학습된 초기화 지점은 고정으로, adapter 및 meta learning 과정만 학습하는 것이다. MAML 방식은 어떠한 neural network에서도 활용될 수 있기 때문에 model agnostic하다고 할 수 있다.

Prior knowledge of similarity

해당 내용에 대한 알고리즘은 compact representation(일종의 embedding으로의 mapping)을 학습하고자 하는 것이고, 여기서 data vector는 intra-class variation에 대해 크게 영향을 받지 않으며 각 class 간의 관계를 잘 유지할 수 있는 space를 구성하게끔 만드는 것이 주된 목적이다. 이를 다른 말로 metric(embedding) learning approach라 부른다. 모델링에 있어, similarity function 혹은 metric을 각 샘플에 대해 적용하여 similar sample의 경우는 closer, 상이한 sample은 take apart하는 형태로 학습한다. 이전에 다뤘던 contrastive 개념과 유사하다. 대표적인 방법으로는 Siamese Network가 있다. 이외에도 Matching network, Prototype network 그리고 Relation network 등등이 있다. 간단하게 위의 그림을 참고해서 support set에 ‘3-way and 3-shots’ sample이 있다고 가정해보자. 총 9개의 샘플에 대해 encoder $E$를 통과시킨 결과 embedding($g$)를 획득할 수 있다. 이렇게 획득한 총 9개의 임베딩을 실제 mappind된 embedding space에서 보게 되면, 서로 같은 class에 속하는 샘플 3개씩은 모여있어야 하고, 그와 동시에 서로 다른 class는 일정 거리만큼 떨어져 있는 것이 이상적이다. 이런 식으로 학습된 네트워크에 query set image를 encoder $E$에 통과시킨 결과 embedding($f$)를 얻을 수 있고, 이렇게 매핑된 query embedding이 가장 가까운 거리(nearest neighbour)를 보이는 class가 바로 이 query image가 예측되는 class가 되는 방식이다.
Siamese network는 두 개의 쌍둥이 형태의 sister network를 구성하고, 두 네트워크는 같은 weight를 공유한다. 해당 네트워크를 최적화하는 과정에서 다음과 같은 contrastive loss function을 계산한다.

[ (1-Y)\frac{1}{2}(D_W)^2 + (Y)\frac{1}{2} (\max (0, m-D_W))^2
] 여기서 $Y = (0, 1)$은 서로 다른 클래스인지 여부에 대한 T/F value가 된다. 만약 두 개의 input이 같은 class라면 $0$을, 다른 class라면 $1$이 된다. 일종의 클래스 종류에 대한 exclusive 'OR'이라고 생각하면 된다. Margin m은 0보다 큰 값으로, Euclidean distance metric $D_W$가 특정 값 이상인 두 샘플에 대해서는 고려하지 않는다. 학습은 similar pair $((x_i,~x_j), 0)$와 dissimilar pair ((x_i,~x_k), 1)을 네트워크에 통과시킨다. Similar pair와 Disimilar pair가 서로 같은 비율일 때가 학습이 가장 안정적이다. 이렇게 획득된 pair에 대해서 loss를 계산하고, 이에 weight를 최적화하는 과정을 거친다. 클래스별 Shot 개수 $E$, class의 개수 $C$에 대해 similar sample과 different sample의 개수를 수식으로 표현하면 다음과 같다.

[ N_{same} = \left( \begin{matrix} E \newline 2 \end{matrix} \right)C ]

[ N_{diff} = \left( \begin{matrix} EC \newline 2 \end{matrix} \right)- \left( \begin{matrix} E \newline 2 \end{matrix} \right)C ]

다음은 matching network이다. 앞서 언급했던 내용과 유사하게 support set은 $(x_i,~y_i)$가 있고, 각각의 $y$는 class별로 표현된 one-hot label vector가 된다. 그리고 $f$, $g$는 embedding function이라고 하자. Classifier는 weighting factor $a$(softmax)와 query sample $\hat{x}$에 대해서,

[ \hat{y} = \sum_{i=1}^k a(\hat{x}, x_i)y_i = P(\hat{y} \vert \hat{x},~S)
]

이처럼 나타내어진다. 여기서 weighting factor를 적용하여 support set에 대해서 query sample의 attention을 계산하는 것이다. Attention kernel은,

[ a(\hat{x},~x_i) = e^{c(f(\hat{x},~g(x_i)))} / \sum_{j=1}^k e^{c(f(\hat{x},~g(x_j)))}
] 이처럼 표현되며 이는 contrastive loss에서 표현되는 similarity term과 동일하다. 위의 수식에서 $c$는 cosine similarity로, 두 샘플이 유사한 확률로 간주할 수 있다.

이러한 방식을 통해 계산한 term이 곧 similarity에 기반한 nearest neighbor가 된다. 앞서 언급한 Siamese network에서의 $D_W$는 Euclidean distance였지만 matching network에서는 cosine distance(similarity)라는 점이 차이가 될 수 있겠다. Matching network는 결국 support set $S$에 기반한 query $x$의 output class $y$를 예측하는 classifier network $P$의 log likelihood를 최대화하는 방향이 된다.

[ \theta = \arg \max_\theta \mathbb{E}_{L \sim T}\left(\mathbb{E}_{S \sim L,~B \sim L} \left(\sum_{(x,~y) \in B} \log P_\theta (y \vert x,~S) \right) \right)
]


Zero-shot learning

앞서 소개했던 방법들은 샘플의 수가 최소한 1개 이상일 경우 사용할 수 있는 방법이고, 다음에 볼 내용은 zero-shot learning에 대한 부분이다.

사람의 경우, 살면서 얼룩말은 한번도 본적이 없다고 하더라도 말에 대한 지식을 알고 있으며, 얼룩말은 단순히 말과 비슷하게 생겼으나 무늬가 stripe로 구성된 형태라는 말만 듣고서도 충분히 얼룩말을 구분해낼 수 있다. ZSL(Zero-shot learning)은 이렇게 이미 알고 있는(seen) class에 대한 존재를 기반으로 이에 의존하는 inference를 제시하며, 이렇게 사전 학습된 knowledge 혹은 attribute를 통해 어떤 식으로 unseen class에 대응할 수 있는지에 대한 task가 된다. Attribute는 일종의 category vector로 표현된다.
ZSL에서 데이터셋은 다음과 같은 구성을 가진다.

  • Seen classes : 학습 과정에서 labeling된 이미지
  • Unseen classes : 학습 과정에서 볼 수 없었던 class를 가진 이미지
  • Auxiliary information : 각 클래스에 대한 묘사/semantic attributes 혹은 word embedding을 의미. Seen class와 Unseen class 사이에 유의미한 관계를 이어줄 다리 역할을 하게 된다.

Semantic vectors

그렇다면 Semantic vector는 어떠한 방식으로 구할까? 이를 테면 위의 그림은 Attribute vector의 한 예시이다. 말 그대로 visual appearance를 각 property에 대해 매핑하는 과정이다. 이렇게 되면 ‘고양이’라는 class를 한번도 본 적이 없더라도 ‘꼬리가 있고, 털이 있다’ 등의 attribute로 예측이 가능하다.

또한 다른 방법으로는 word vector가 있다. NLP 기술을 활용해서 attribute에 대한 정보를 자동적으로 학습하는 것이다.

이렇듯 image feature를 실제로 semantic feature에 대입하기 위해서는 deep learning network를 활용해야한다. 이렇게 image feature와 semantic attribute가 같이 공존하는 embedding 공간을 common embedding space라 부르게 된다. 일종의 만남의 광장같은 느낌이다. Common embedding space는 high level vision의 visual space가 될 수도 있고, low level vision의 semantic space가 될 수도 있으며, 혹은 새롭게 학습된 중간 space가 될 수도 있다. 학습은 간단하게도 semantic vectors $v$를 seen data $x$에 대한 supervision으로 삼아서 projection function $f$를 $v = f(x)$와 같이 학습하게 된다. Inference를 진행할 때는 새로운 class dataset $(x^*,~y^*)$에 대해 class specified semantic vector $v^*$를 정의하고, semantic vector space에 mapping된 $f(x^*)$를 기준으로 가까운 neighborhood로 예측을 하게 된다. Attribute에 대해서 제대로 학습이 된 embedding space라면 새로운 class에 대한 attribute도 합리적으로 mapping할 수 있기 때문에, 해당 space에서 구분하면 학습에 사용되지 않았던 class에 대해서도 discrimination이 가능하다.
Task의 종류에 따라 zero-shot learning 그리고 generalized zero-shot learning으로 구분할 수 있는데, 학습에서 사용된 class에 대해서도 함께 구별하는 task가 generalized zero-shot learning이며 그와는 다르게 test에서만 사용되는 new class에 대해서 discrimination하는 zero-shot learning이 있다.


Generative model based methods

그러나 embedding method에 대해서 발생하는 단점이 있는데, 바로 BiasDomain shift이다. Mapping 함수 $f(\cdot)$는 seen class에 대해서만 학습을 하기 때문에 output을 추출하는데 있어 기존에 학습될 때 본 sample들에 대해서 biasing되는 문제가 생긴다. 그리고 test modality에 대한 domain shift에 의해, $f(\cdot)$가 unseen class image feature를 semantic vector로 제대로 mapping한다는 보장이 없기 때문에 단점이 존재한다. 풀어서 설명했지만 간단하게 말하자면 test sample에 대해서도 semantic vector를 잘 뽑아내어야 위의 방법이 의미가 있는데, 결국 zero-shot이라서 unseen class에 대한 보장이 안되기 때문에 곤란하다는 뜻. 따라서 이런 단점을 보완하고자, zero-shot classifier가 seen/unseen class 모두에 대해서 학습 과정에서 guidance를 받을 수 있는 방법이 필요하다.

그래서 고려를 한 방법이 generative network에 고양이 이미지에 대한 ‘attribute vector’를 conditional GAN 형태로 넣어주며, fake image가 이러한 out-of-distribution sample의 역할을 대신할 수 있게끔 하는 것이다. 이를 통해 GAN이 unseen class에 대한 semantic feature를 보완해줄 수 있는 효과를 기대하는 것이다.

Conditional GAN이 학습되고 나서는 generator의 weight를 고정한 채 unseen class의 attribute를 input으로 전달하여 image feature를 뽑게 한다(이미지 자체를 넣는게 아니라 cGAN이 생성한 feature를 예측에 사용하는 것). 그렇게 되면 GAN이 생성하는 이미지의 퀄리티는 어떨진 모르겠지만, image를 직접적으로 사용하는 방법과 다르게 class agnostic한 학습에 사용될 수 있다는 점이 concept으로 사용되었다고 볼 수 있다.

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