본문 바로가기

딥러닝

10. Transfer Learning

1. 개념

 

 Transfer Learning을 번역하면 전이 학습 입니다. 기존에 학습 시킨 모델을 이용해서, 현재의 task에 이용하는 것 입니다. CNN을 배우시는 분들은 특히 익숙한 개념일텐데요. Imagenet이라는 거어어대한 학습 데이터셋에 수십, 수백개의 layer를 가진 모델을 학습 시키려면 상당히 많은 자원이 소요됩니다. 하드웨어 적으로는 GPU가 많이 필요할 수도 있고, 하드웨어가 빵빵하다고 하더라도 시간이 상당히 많이 소요 됩니다.

 

 Transfer learning의 작동원리를 대략적으로 설명해드리면, 딥러닝은 layer 하나하나가 feature를 출력해낸다고 할 수 있습니다. 잘 훈련된 이미지 분류 모델이 있다고 생각해보면, 그 모델은 각 layer 하나하나가 이미지의 특정한 feature를 추출해내고 있는 것 입니다. 새로 진행할 task가 이미지와 관련된 task라면, 이렇게 미리 훈련된 모델의 layer들을 가져오는게 훈련을 도와주는 방법이 될 수 있습니다.

 

2. 학습 방법

 

 Transfer Learning에는 정말 많은 학습방법이 있습니다. 왜냐하면 보통 새로 진행하려고 하는 task에서 사용되는 데이터셋은, pretrained model( 이글에서는 기존에 거대한 데이터셋에 학습한 모델을 말합니다.)을 훈련시켰던 데이터셋과는 다르고, task도 다르기 때문 입니다.

 

 그래서 크게 보면 세가지를 고려해야 합니다.

 

1. 새로운 task의 데이터의 갯수.

2. 새로운 task의 데이터와 pretrained model의 데이터 간의 유사성.

3. 새로운 task와 pretrained model이 수행한 task의 유사성.

 

 당연히 새로운 task, 데이터가 기존에 훈련된 task, 데이터와 유사할 수록 학습이 많이 필요하지 않고, 다를 수록 추가적인 학습이 많이 필요합니다. 이 와중에 데이터의 갯수가 적다면 overfitting의 위험이 존재하니 조금 더 고려사항이 추가됩니다.

 

 전이 학습을 공부할 때면 Fine tuning과 Bottleneck Feature라는 단어를 보게 됩니다.

 

 Fine Tuning은 번역하면 미세 조정인데, 미리 학습된 모델에 새로운 데이터셋을 넣어서 모델의 전체 파라메터를 업데이트를 하는 것을 말합니다. 이러한 Fine Tuning은 이러한 업데이트 과정에서 파라메터를 완전히 바꾸어버려 over fitting 등의 문제가 생길 수 있습니다. 그래서 단어 그대로 '미세' 하고 정교한 파라메터 업데이트를 위해 변수 초기화 과정에서 제약을 거는 등의 작업을 해주어야 합니다.

 

 Bottleneck Feature는 보통 CNN 계열의 모델에서 CNN을 적용한 가장 마지막 layer에서 나온 output을 의미 합니다. CNN layer를 거칠 때마다 이미지에서 feature가 추출 되겠죠? 그런 feature 중 가장 마지막 단계의 output을 생각하시면 됩니다. Transfer leraning을 할때 이러한 Bottleneck Feature를 생성하는 layer까지의 parameter를 고정합니다. 그리고 그 이후의 layer를 추가 학습하는 식으로 진행하는 경우도 많습니다.

 

 

3. 예제코드

 

 Transfer Learning 관련 예제 코드도 작성해봤습니다. Tensorflow 공식 튜토리얼의 코드를 참고 했습니다.

 

 예제 코드에서는 'Cats_vs_dogs' 라는 데이터 셋을 이용합니다. 이름 처럼 개와 고양이를 분류하는 용도의 데이터셋 입니다. 이 데이터셋 만을 이용해서 바로 분류 모델을 만들 수도 있겠지만, 기존에 학습되어 있는 모델을 불러와서 활용하기로 하였습니다.

 

 Pretrained model은 MobileNetV2 구조로 imagenet 데이터셋에 학습한 모델 입니다. Imagenet 데이터셋은 아시다시피 이미지를 정말 엄청난 양을 모아놓은 데이터셋 입니다. 모바일넷은 이름 그대로 Mobile 환경에서 잘 작동하도록 만든 모델 입니다.

 

 잠시 설명을 드리자면, 데이터셋을 왕창 모아서 거대한 모델에 훈련을 시키면 성능은 좋아집니다. 그러나 요즘에는 스마트폰, 외부 카메라 등 작은 디바이스에서도 작동하는 모델에 대해 큰 관심을 보입니다. 성능에 제한이 있는 환경들 입니다. 그래서 성능은 다소 떨어지더라도, 모델의 사이즈를 줄이고, 빠르게 작동하는 모델에 관심이 많이 있습니다. 이런 분야에 관심있는 사람들이 만들어낸 모델이라고 설명할 수 있습니다.

 

3.1 Feature Extraction 방식 

 

 Mobilenet을 활용하면, 160x160x3의 input 이미지가 5x5x1280 크기의 output 이미지가 됩니다. 이 이미지를 분류 하기 위해서 layer 두개를 적용시킵니다. Global Average Pooling과 Dense layer를 적용시켜서 최종 아웃풋 크기는 1, 그러니까 숫자가 하나 나오게 됩니다.

 

 튜토리얼에서 Cats vs dogs task 인데, 숫자 하나가 나온다는 것은, 이미지가 고양이일 확률 or 개일 확률을 출력한다고 보시면 됩니다.

 

 이런 방식은 Bottleneck Feature를 기존 모델에서 가져오고, task에 맞게 layer를 추가해서 학습하는 방식입니다. 모바일넷도 분류, 객체 인식등 이미지와 관련된 모델이고, 따라서 모바일넷의 layer는 이미지의 특성들을 뽑아내도록 학습이 된 모델입니다. 그래서 이 모델의 Bottleneck Feature를 가져오면 고양이와 개를 구별할 때 도움이 되는 것이죠.

 

 (보시면 Validation set의 정확도나 loss가 Training set에 비해 좋은 걸 볼 수 있습니다. 튜토리얼에서는 모델 구조에 batch normalization이나 dropout이 존재하기 때문이라고 합니다.) 그리고 아직 overfitting이 있는 것 같진 않아서 더 훈련 시키면 성능이 좋아질 것 처럼 보입니다.

 

3.2 Fine tuning

 

 위의 방식은 기존 모델의 파라메터는 고정 시키고, layer를 추가해서 훈련 시킨 방식입니다. Mobilenet의 task와 우리가 시행하려는 task가 유사하고, cats_vs_dogs의 데이터양도 적지 않기 때문에 fine tuning을 시도해볼 만 합니다. 

 Fine tuning을 위해서 Freezing 했던 layer들을 trainable하게 만들어주고, 미세한 조정을 위해서 learning rate를 기존의 1/10로 낮춰줍니다. 그리고 추가적인 훈련을 진행합니다. 전체의 파라메터를 학습하기 때문에 1 epoch를 훈련 시킬때 속도가 더 느려지고, 학습률을 낮췄기 때문에 상당히 천천히 학습 됩니다.

 추가 훈련을 시켰을 시에 특히 초반 1~2 epoch 동안 정확도는 상승하고, loss는 떨어지는 것을 볼 수 있습니다. 이와 같이 Fine tuning은 조건이 맞는다면 모델의 성능 향상을 볼 수 있죠.

 

 관련 코드는 Colab에 작성해두었습니다. 링크