글 작성자: 만렙개발자

Transfer Learning

인공신경망 모델은 처음엔 한 문제를 풀기 위한 것으로 학습되었습니다. 내부는 black box라 불리며, 어떻게 동작하지는 잘 알 수 없었죠. 하지만, 점차 학습된 신경망이 갖는 지식에 대해 탐구하며, 그것이 갖는 구조에 대해서 분석하기 시작하였습니다. explainable 혹은 interpretable deep learning이라고 불리는 연구분야가 바로 그것입니다. 이미지를 분류하는 모델에서 학습된 레이어들의 가중치를 이용해 visualize하는 것이 가장 대표적입니다. 그렇게 했을때, convolution과 pooling으로 인해 여러 수준의 추상에 대응하는 표현을 학습합니다. 이러한 계층구조로부터 오는 특징 표현은 여러 변화에 강인함을 갖습니다. 입력부분에 가까운 모델의 앞부분에서는 gabor 특징과 비슷하게 나타납니다. gabor 특징은 이전에 컴퓨터 비전을 연구하는 학자들이 실험을 통해 찾아내고, 사용하던 것이었습니다. 그 다음 블록은 좀 더 복잡한 텍스쳐 특징을 학습합니다. 그 이후로는 패턴보다는 구조로서 의미를 갖는 학습을 점차하게 되고, 최종적으로는 우리가 분류하고자 하는 물체의 대상의 전체적인 속성을 충분히 나타내는 특징들을 학습합니다. 그리고 마지막 레이어에서는 앞선 값들을 통하여 분류를 해냅니다. 

 

그렇다면, 이렇게 학습된 모델이 갖는 지식은 재사용될 수 없는걸까요? 앞선 레이어들의 기초적인 패턴과 텍스처들에 대한 학습은 general하기 때문에 공유될 수 있다고 판단되었습니다. 후반부의 큰 구조적인, 물체 분류를 위한 한정적인 속성들은 문제에 한정되어 specific하기 때문에 배제하고, 특히 마지막 레이어인 분류 레이어는 무조건 제거합니다.

 

예를들어, 10종의 과일을 분류하도록 학습된 모델은 마지막 레이어에서 사과, 바나나, 배, 등을 분류할 수 있도록 학습이되어있을 것입니다. 이것을 7종의 동물로 분류하는 문제로 바꿔 사용하려면, 마지막 레이어는 갯수부터 맞지 않고, 분류하기 위해 판단해야할 지식이 다르기 때문에 배제해야합니다.

 

ref: https://towardsdatascience.com/a-comprehensive-hands-on-guide-to-transfer-learning-with-real-world-applications-in-deep-learning-212bf3b2f27a

이렇게 공유하는 특성으로서 모델은 트랜스퍼 러닝을 시작하게 됩니다. 트랜스퍼 러닝은 한 문제(혹은 task)를 풀기 위해 학습된 모델을 다른 문제를 풀기 위해 사용하는 것을 말합니다. 그 과정에서 문제에 직접적인 마지막 레이어와 같은 것은 재구성되며, 후반부의 레이어들의 가중치는 학습이 가능하도록하고, 전반부의 레이어들의 가중치들은 학습이 불가능하도록 freeze합니다. 그리고 문제에 맞는 데이터셋으로 학습을 합니다. 이렇게 레이어의 일부분만, 미세하게 조정하는 학습을 fine-tuning이라고 합니다. 이렇게 트랜스퍼 러닝을 활용한다면, general한 부분에서 강력한 성능을 갖는 모델이 있다면, 문제에 맞게 fine-tuning하는 것은 매우 쉬워집니다. 학습시간도 짧아지고, 비용도 덜 듭니다. 그래서 트랜스퍼 러닝을 위한 general한 모델을 만들기 위한 연구가 시작됩니다. 구글과 페이스북과 같은 회사에서 엄청난 규모의 데이터셋과 컴퓨팅 파워를 이용하여 훈련한 사전학습 모델들을 공개했습니다. 이런 사전학습된 모델들을 활용하는 것이 transfer learning의 장점을 극대화하는 것입니다.

 

Transfer Learning의 종류는 다음과 같습니다.

 

1. Domain Adaptation

 

도메인 적응은 소스 도메인과 타겟 도메인간의 marginal probability이 다른 경우를 말합니다. 학습을 이전하기 위해 필요한 소스 및 대상 도메인의 데이터 분포에 관한 '적응'입니다. 예를들어 객체를 분류하는 문제를 생각해봅시다. 과일에 대한 도메인으로 학습한 모델을 야채에 대한 도메인에 적용할 수 있을까요? 이렇게 도메인이 바뀌는 상황에서의 전이 학습을 도메인 적응이라고 합니다. fine-tuning은 supversied domain adaptation이라고 부르기도 합니다. 

 

2. Multitask Learning

 

소스 도메인과 타겟 도메인이 구분되어져 있거나, 먼저 학습된 무언가의 지식을 전이한다기보다는 동시에 여러 task에 대하여 학습하는 것을 multitask learning이라고 합니다. 동시에 여러 task에 대해서 학습하기 때문에 그 안에서 knowledge sharing이 일어난다고 합니다. 예를들어 간판을 인식하는 task와 간판을 생성하는 task, 한국의 교통 간판을 미국의 교통 간판으로 변환하는 task 등 knowledge sharing이 일어날 수 있도록 모델과 task를 잘 설계하는 것은 매우 중요합니다. 

 

3. Few-shot / One-shot / zero-shot Learning

 

객체 인식을 학습하기 위해서는 객체에 대해서 수백 혹은 수천개의 학습 샘플들이 필요합니다. 하지만 연구를 통해 하나의(혹은 소수의) 이미지에서 객체의 카테고리에 대한 더 많은 정보를 배울 수 있다는 연구가 이루어졌습니다. 예를들어, 베이지안을 활용하여 객체의 카테고리는 확률 모델로 표현되고, 이러한 모델들의 매개 변수에 대한 사전지식은 확률 밀도 함수로 표현되어 객체 분류를 위한 학습을 합니다. 학습 데이터셋이 부족한 경우는 비용의 문제도 있겠지만, 인식해야 하는 대상이 크게 변하거나, 이전에 학습할 수 없는 상황인 경우도 그러합니다. 인간의 경우 대상이 조금 변하더라도 여전히 인식할 수 있으며, 이전에 보지 못했던 것들 조금만 보고도 빠르게 판단한다던가, 한번도 보지 못했던 것에 대해서도 어느정도 예측을 하고 판단을 합니다. 예를들어 자동차를 인식한다고 했을 때, 정면에 대한 학습 데이터셋만 있다면 측면에 대해서는 인식하기가 어렵습니다. 혹은 김밥 한 줄에 대해서 학습을 했다면, 김밥을 자른 단면은 인식할 수 없겠죠. 심지어 부서진 김밥을 보고도 우리는 김밥이라는 것을 알아차릴 수 있습니다. 이렇듯 우리가 인식해야하는 대상은 변할 수 있습니다. 하지만, 기존의 인공신경망 기반 인공지능들은 충분히 학습되지 못한 것에 대해서는 예측의 성능이 너무나도 불안정하였습니다. 따라서 이러한 경우를 위해 학습을 조금(few)하고도, 한번(one)하고도, 한번도 하지 않고(zero)도 신뢰성있는 예측을 하고자 N-shot Learning에 대한 연구가 이루어지기 시작했습니다. zero-shot learning은 극단적으로 학습할 레이블이 하나도 없는 경우에 대한 전이학습의 변형입니다. 모델은 조건부 확률 분포를 학습하도록 훈련되고, 타겟 언어에 대한 레이블이 없는 기계 번역에서 유용하게 사용됩니다. Few-shot Learning, One-shot Learning, Zero-shot Learning 과 같은 용어를 한번쯤은 접해보셨을 겁니다. 기본적으로 이와같은 것들은 학습데이터셋이 부족한 경우를 위해 계속 연구되어왔습니다. 대표적인 트랜스퍼 러닝의 방법 중 하나이죠. 위의 3개는 N-shot Learning으로 뭉뚱그려 표현하기도 합니다. N-shot learning의 대표적인 모델로 Siamese Network, Matchin Network, Prototypical Network가 있습니다. N-shot Learning은 위와 같은 모델들이 사용하는 metric learning을 시작으로 발전하여 최근에는 Graph를 이용한 Graph Neural Network까지 연구가 이어지고 있습니다.

Metric Learning

강력한 general한 모델을 만들기 위해서 제안된 방법 중 하나는, 두 대상이 갖는 특성이 '다르다'라는 것에 집중하는 것입니다. 학습할 때 '분류'를 하는 것이 아니라, 같다/다르다를 나타내는 distance를 계산하는 metric을 사용하는 방식으로 문제를 바꿉니다. 이러한 방법을 이용한 학습을 metric learning이라고 하며, 그 시초는 triplet loss를 활용한 것이었습니다. triplet loss는 anchor를 기준으로 positive와 negative를 이용해 3개의 값으로 loss를 계산하기에 triplet loss라고 합니다. 입력된 값이 true이면 positive를 minimized, 입력된 값이 false이면 nagative를 maximize하는 방식으로 학습을 합니다. 

 

ref: FaceNet

 

결과적으로 예전에는 구분선을 잘 찾는 것이 문제였다면, 이제는 클러스터를 잘 형성하는 문제로 바꾼 것이됩니다.

 

이미지를 기준으로 예시를 설명하면, 개와 고양이를 비교하는 것으로 생각해봅시다. 현재 anchor 이미지가 개라고 한다면, positive는 개, negative는 고양이가 될 것입니다. 이렇게 3개의 이미지가 입력이 되고, 네트워크를 통해 어떠한 임배딩이 계산될 것입니다. 보통은 이 임배딩이 마지막 분류를 위한 fully-connected layer에 들어가 학습이됩니다. metric learning에서는 triplet loss를 계산하게됩니다. anchor와 positive를 통과한 녀석들의 distance는 0이 되도록(가깝게), anchor와 negative를 통과한 녀석들의 distance는 1이 되도록(멀게) 하는것입니다. 즉, 개 이미지 1(anchor)과, 개 이미지 2(positive)는 같은 '개'라는 것을 알려주어, 신경망이 두 이미지에 대한 특징들을 같은 '개'로서 인식할 수 있도록 학습하는 것입니다. 반면에 개 이미지1(anchor)과 고양이 이미지 1(negative)은 다른 종이라는 것을 알려주어 특성들이 서로 멀어지도록 학습하도록 하는 것입니다. 이렇게 학습된 모델은 개와 고양이를 분류할 수 있는 능력을 갖게됩니다.

 

사실 Metric Learning은 얼굴 인식에서 상당히 많은 연구가 진척되고 활용되고 있습니다. 그 이유는 그것을 분류하는 것이 verification에 중요하기 때문입니다. 다수의 인물의 구분이 잘 되도록 embedding이 학습되면, 그 embedding은 얼굴의 특징을 구별적으로 잘 표현할 것입니다. 그렇게되면 특정한 인물에 대해서만 반응하도록 만들기가 쉬워지죠. 몇십만명에 대한 얼굴을 학습한 general한 모델을 이용해서, 특정 인물들, 예를들어 정치인들만 비교한다던가, 범죄자를 인식한다던가 등의 얼굴인식 문제에 transfer learning하는 것은 매우 쉬운 문제가됩니다.

 

그런데 구현의 측면에서 triplet은 쉽지가 않습니다. 구현의 부분에서 이전과 다른 점이 두가지 있습니다.

 

1. 입력 값이 다수

 

이전에는 loss를 계산하기 위해서 맞다/틀리다 와 같이 2개만 들어가는 경우가 많았지만, 입력값이 다수이기 때문에 구현에서 고려해야할 부분이 생깁니다.

 

2. 입력 값에 정답 레이블이 포함

 

학습하는데 문제의 정답이 필요합니다. positive와 negative label 이 필요하기 때문입니다. 학습의 과정에 답을 집어넣는 것은 잘 이해가 되지 않을 수 있습니다. 지금 학습에 설계된 문제가 최종적으로 풀고자 하는 문제가 아니기 때문에,문제를 푸는 것이 최종적인 목표가 아니라는 것이 아니라 모델을 학습하는 것이 최종적인 목표라는 것을 생각하면 좋을 것 같습니다. 따라서 구별할 수 있는 특징을 표현하는, embedding하는 능력을 갖게하고자 하는 것이 목표입니다.

 

맨 처음에 프레임워크가 개발되고 설계될 때에는 이러한 부분을 고려할 것이라 생각하지 못한 것 같습니다. 따라서 구현에 있어서 이전에 배우지 않았던 패턴들이 사용됩니다. 

 

 

샴 네트워크(Siamese Network)는 가중치를 공유하는 두개의 트윈 네트워크로 구성되며, 마찬가지로 트리플렛 네트워크는 공유 가중치를 갖는 네트워크 3개로 이루어져있습니다. 이러한 모델을 학습하기에는 이전과는 다른 손실 함수가 필요합니다.

 

샴 네트워크는 few-shot learning을 위해 주로 설계된 초기 시도 중 하나입니다. 두 개의 입력을 받고, 각각에 대해서 인공신경망 모델을 통과시킵니다. 그렇게 얻은 값은 특징 표현이라고도 하지만, 입력 데이터를 특정한 형태로 정보를 내장하고 있다고 하여 임베딩이라고도 합니다. 두 개의 입력에 대한 두 개의 임베딩 사이의 거리를 구합니다. 그리고 거기에 l1 distance를 적용하고, weighted distance를 학습하기 위해 fully connected-layer를 추가합니다. 논문에서는 여기에 regularized cross entropy를 손실함수로 사용했습니다. 그래서 두 입력 샘플이 같으면 1로, 다르면 0으로 예측하도록 하게합니다.

 

또 다른 접근 법은 동일한 클래스의 입력이 다른 클래스의 입력보다 더 가까운 임베딩 공간에서 맵핑을 학습하는 것입니다. 샘플이 같은 클레스에서 왔을 때 거리를 줄이며, 다르면 마진으로 거리를 늘립니다. 이 마진의 역할은 가깝게 보이지만 다른 샘플들에 집중하기 위해서 마진보다 큰 거리를 갖는 샘플들을 무시하기 위해서 입니다.

 

이보다 더 좋은 방법은 triplet 손실을 이용하는 것입니다. 가중치를 공유하는 세개의 네트워크를 갖고, anchor, positive, negative 샘플을 입력하여 3개의 출력이 나오게합니다. 그 출력으로 triplet loss를 계산하여 anchor와 positive가 가깝게하면서 anchor와 negative는 멀게하도록 학습합니다. 죽, 이러한 학습을 진행할수록 모델은 같은 것은 가깝게, 먼 것은 멀게 학습하도록 노력하게됩니다. 

 

아래는 triplet_loss의 간단한 구현입니다.

 

def triplet_loss(y_true, y_pred, alpha = 0.4):

	anchor, positive, negative = y_pred[0], y_pred[1], y_pred[2]

    pos_dist = K.sum(K.square(anchor-positive),axis=1)
    neg_dist = K.sum(K.square(anchor-negative),axis=1)

    basic_loss = pos_dist-neg_dist+alpha
    loss = K.maximum(basic_loss,0.0)
 
    return loss