페이지

2021년 8월 17일 화요일

소규모 데이터로 딥러닝을 이용한 이미지 분류를 시도할 때 고려할 점 – 2편

 사전 훈련 모델 이용

사전훈련 모델이란 ImageNet 과 같은 대용량 데이터세트의 이미지 분류 작업을 사전에 훈련시켜 놓은 모델을 뜻한다. 누군가가 이미 훈련시킨 가중치를 사용함으로써 소규모 데이터세트로도 좋은 성능을 낼 수 있다. 예를 들어, ImageNet 은 이미지들이 동물들이나 우리가 일상에서 볼 수 있는 자전거, 가구, 자동차 같은 1,000 가지 종류 class 로 구성된 백사십만개의 레이블 된 이미지들을 가지고 있는데, 여기에서 훈련된 모델을 목적을 달리하여, 가구 이미지를 분류하는 데 사용할 수 있다는 뜻이다. 만약 사전 훈련에 사용된 데이터가 상당히 크고 일반적인 이미지들이라면 (반드시 사전 훈련 데이터 규모가 충분히 커야 한다. 거꾸로 사전 훈련 모델의 훈련된 데이터세트가 작고 이를 다른 목적에 사용하는 모델의 데이터세트가 크다면 전이학습은 시도할 의미가 없다), 새로운 목적으로 구축할 모델 데이터 class 가 사전 훈련된 것과 다르다 하더라도 유용하게 이미지 분류 문제를 해결할 수 있다는 뜻이다. 1편에서 설명한 합성곱(convolutional) 신경망의 특징의 하나인, 사전 학습된 모델에서 학습된 패턴의 공간 계층성(spatial hierarchy)이 영상 인식의 일반화된 모델로서 효과적으로 작용한다.

ImageNet이 개와 고양이 등을 포함한 여러 동물 class 들을 포함하고 있는 것을 고려할 때, 개와 고양이 분류 문제에서 잘 동작할 것이라는 기대를 해볼 수 있다.

 

전이학습 절차

사전 학습된 모델을 통한 전이 학습을 고려할 때 아래와 같은 절차를 염두에 두는 것이 필요하다.

1.    사전 훈련 모델 선정: 우선 당면하고 있는 문제에 적당한 사전 훈련 모델을 선별하는 것이 필요하다. Keras 의 경우, VGG, Resnet, Inception, Mobilenet 등의 모델들을 사용할 수 있다. 여기를 눌러 Keras 에서 가능한 모델들을 살펴본다.

2.    데이터세트 크기와 유사도에 따른 전략 수립: 아래 그림1과 같이 데이터세트 크기와 유사도에 따라 4개의 전략이 가능하다. Class 당 약 1000~2000 개 이미지샘플은 소규모 데이터세트 크기에 속한다. 개와 고양이를 분류하는 것이라면 ImageNet 의 데이터세트와 유사한 데이터세트로 볼 수 있다. 만약 현미경 데이터나 암세포 이미지를 분류하는 경우에는 ImageNet 과 유사한 데이터세트로 보기 어렵다[1].

 



<그림 1. 데이터세트 크기와 유사도에 따른 분류>

 

3.    모델 파인 튜닝: 크기와 유사도에 따른 전략에 따라 어느 분면에 해당하는지에 따라, 아래 그림 2와 같은 파인 튜닝 접근법을 택할 수 있다.

대규모 데이터, 사전 훈련 데이터와 다름: 대규모 데이터를 보유하고 있다면, 처음부터 전체를 합성곱 신경망에 훈련할 수 있다. 사전 훈련 모델 데이터세트와 다르지만, 사전 훈련 모델을 활용하는 것이 유용하다.

대규모 데이터, 사전 훈련 데이터와 유사함: 대규모 데이터라 과적합 이슈는 없다. 데이터세트가 유사하므로 사전 훈련된 가중치를 이용하여 합성곱 층의 상층부 일부와 classifier 부분을 훈련시킨다.

소규모 데이터, 사전 훈련 데이터와 다름: 가장 곤란한 경우다. 합성곱의 훈련 층을 늘리면 과적합이 일어나고 훈련 층을 줄이면 학습이 불충분 해진다. 2사분면의 경우보다 합성곱 층의 훈련을 늘리고 데이터증식(Data Augmentation)을 고려해보는 것이 필요하다.

소규모 데이터, 사전 훈련 데이터와 유사함: 사전 학습 모델의 가중치를 그대로 사용하고 (훈련을 freeze 하고) 마지막 완전연결층의 훈련된 classifier를 제거하고 대신 새로운 classifier 로 교체한다.

 



<그림2. 사전 훈련 모델 파인 튜닝 유형>

 

사전 훈련 모델 선정

앞에서 살펴본 바와 같이, 개와 고양이 이미지를 약 2,000개 이미지샘플을 가지고 딥러닝으로 시도하려는 경우는 그림14사분면에 해당한다. Class 당 약 1000~2000 개 이미지샘플은 소규모에 해당하고, 개와 고양이를 분류하는 것이라면 ImageNet의 데이터세트는 유사한 데이터세트로 볼 수 있다.

사전 훈련 모델로는 2014ImageNet 데이터세트를 기반으로 개발된 VGG16 구조를 선정한다. 비교적 오래된 구조지만 모델 크기도 크지 않고 새로운 구조적 발전에 대한 설명 없이도 단순해서 이해가 용이하다. 이러한 이유에서 ResNet, Inception, Xception 등이 있지만 교육용으로 많이 소개된다. 아래 그림3과 같이, VGG165개의 합성곱(Conv) 신경망과 5개의 max pooling 그리고 3개의 fully connected layer 로 이루어져 있고 모든 활성화함수는 ReLU 를 사용한다.

 



<그림 3. VGG16 구조>[2]

모델 파인 튜닝

  개와 고양이를 분류하는 우리의 경우는, 소규모 데이터에 사전학습 데이터세트와 유사한 유형인 4분면의 파인 튜닝으로 이 경우, 사전 학습 모델의 가중치를 그대로 사용하고 (훈련을 freeze 하고) 마지막 완전연결층의 훈련된 classifier를 제거하고 대신 새로운 classifier 로 교체한다.

이미지분류에 사용되는 합성곱 신경망(convnet)은 위의 그림3과 같이 일련의 pooling convolution 층으로 이루어지고 마지막으로 완전 연결된 분류기 층으로 구성된다. 아래 그림 4와 같이, 사전에 잘 훈련되어 가중치가 보존된 convolutional base 는 그대로 두고 여기에 연결 되어있는 기존 분류기 fc6, fc7, fc8 층은 사용하지 않는다. 대신 ① 과 같이 새로운 분류기로 대체한다. 이렇게 하는 이유는, convolutional base 에서 학습된 표현(representation)이 보다 일반적이고(generic) 따라서 재사용이 가능해서이다. 이렇게 학습된 표현을 특징 추출(feature extraction)이라고 한다. 반면 마지막 층의 분류자들 (classifiers)로부터 학습된 표현은 모델이 훈련된 해당 class에 대해서만 특별히 구체적이다. 전체 이미지들의 각각의 class들에 대한 존재여부의 확률분포 정보 만을 가지고 있어 입력 이미지의 물체가 어디에 위치하는가에 대한 정보가 없다.    



<그림 4. 합성곱 기반 위의 분류기 교체>

 

  합성곱(conv)층 들로부터 추출된 표현의 일반화 정도는 모델의 층(layer)의 깊이와 관계가 있다. 합성곱 층의 모델 초반에는 모서리, 색상, 질감과 같은 매우 일반적인 특성맵을 추출하고, 층이 위로 올라갈수록 고양이 귀 혹은 개의 눈과 같은 보다 요약된 개념을 추출한다. 따라서 현재 시도하려는 소규모 이미지 데이터세트가 사전 학습된 데이터세트와 class 가 많이 다르다면 특성 추출을 위해 사전 학습 모델의 처음 몇 개 층만 훈련을 시키는 것이 좋다.

우리의 개와 고양이 분류의 경우로 돌아와서, ImageNet이 여러 개의 개와 고양이 데이터세트들을 포함하고 있어서, 사전 훈련된 모델의 완전 연결층을 재사용해도 된다. 그러나 보다 일반적인 경우가 사전 훈련된 모델의 데이터세트가 소규모 데이터세트로 분류를 시도하려는 class와 다른 경우라고 보고, 이 경우를 중심으로 살펴보도록 한다.

 

사전 학습 모델을 통한 특성 추출

선정한 VGG16 사전 훈련 모델은 다른 모델들과 함께 Keras 라이브러리에 사전 패키지된 형태[3]로 제공된다. keras.application import 하여 사용한다. 우선 아래 그림5와 같이 VGG16 사전훈련 모델 호출 예시를 보자.



<그림 5. VGG16 사전 훈련 모델 convolutional base 정의>

 

우선 첫번쨰 argument weights 는 어느 모델로부터 weight checkpoint 할 것인가를 명시하므로 imagenet 이라고 적고, include_top 은 사전 훈련모델(VGG16)top fully connected layer 가 있는 분류기 층을 포함할까를 묻는 것임. True 를 하면(default) ImageNet1,000class 를 그대로 사용하는 것이 되기 때문에, 우리는 우리의 소규모 데이터세트 class 를 위한 새로운 classifier 를 쓸 예정이므로 False 로 입력. input_shape 는 심층네트워크에 입력할 이미지 텐서의 모양. 이 내용은 선택적이다(optional). 만약 입력하지 않으면, 네트워크가 알아서 임의의 크기로 처리한다. 우리는 우리가 입력한 이미지가 어떻게 convolution pooling layer 를 통하면서 요약되는지를 관찰하기위해 180x180 즉 가로 180 픽셀, 세로 180 픽셀 그리고 RGB 3 채널 값으로 입력한다.

conv_base VGG16으로 훈련된 모델의 convolutional base 만의 가중치를 활용하는 것으로서 2 가지 접근법으로 사용될 수 있다.

첫째, conv_base output 을 디스크에 Numpy 배열로 저장하여 별도의 완전연결층의 분류자에 입력으로 사용하는 방식이다. 이 방식은 모든 형태의 입력 이미지에 대해 가장 값비싼 convolutional base 만을 사용하는 방식이라는 점에서 빠르고 저렴한 방식이다. 그러나 데이터증식을 고려할 수 없다는 점이 단점이다.

둘째, 앞의 그림4와 같이, conv_base 에 더해서 상층부에 새로운 데이터를 위한 완전연결층의 분류자를 교체하고 사전 학습된 convolutional base 의 가중치는 훈련되지 않도록 동결하는 방식이다. 이렇게 동결하지 않으면, 어렵사리 사전 훈련된 가중치가 같이 훈련된다. 상층부에 교체한 완전연결층의 분류자는 임의값으로 초기화되기 때문에 매우 큰 가중치 변경이 네트워크를 통해 전파되고 사전에 힘들게 훈련되었던 표현들이 파괴되는 우를 범하게 된다.  

  이렇게 사전훈련학습을 통한 특성 추출과 데이터증식을 함께 사용한 경우의validated accuracy는 아래 그림6과 같이 95.6% 임을 확인. 1편에서 데이터증식과 dropout 을 통해 80~85% 의 정확도를 보이는 것에 비해 많은 향상을 이뤘다.



<그림 6. VGG16 conv base 에 새 분류자 추가한 경우의 val_accuracy>

 

Convolutional 층의 파인 튜닝

  또다른 파인 튜닝 방법은 합성곱 층 상층부 일부와 새롭게 교체하는 classifier 를 훈련시키는 것이다. 아래 그림 8과 같이 VGG16 4번째 합성곱 신경망 구역까지 trainable = False 로 하여 훈련을 freeze 시키고 ①번의 5번째 합성곱 구역을 trainable = True 로 훈련에 참여시키고 ②번의 완전연결층의 분류자 구역도 함께 훈련하는 것이다.

신경망을 파인 튜닝하는 절차는 다시 정리하면 아래와 같다.

1.    사전 훈련된 모델 상단에 새로운 분류자 추가

2.    합성곱 base 는 동결

3.    새로 추가한 부분을 포함해서 훈련 시행

4.    합성곱 기반의 일부 층을 훈련에 참여 (만약 batch normalization 층이 있으면 제외)

5.    훈련을 허용한 일부 합성곱 층과 함께 새로 추가한 부분을 같이 훈련 시행

지금까지 앞의 3단계까지 완료된 상태. 4단계인 일부 층을 훈련에 참여시키기 위해 5번째 합성곱 구역을 훈련에 참여시킨다 (trainable = True). 앞에서 설명한 바와 같이, 합성곱 신경망 기반 중 초기 층은 보다 일반적이고 재사용이 가능한 특성을 가지는 반면 상층부는 보다 구체적 특성을 인코딩하기에, 새로운 데이터세트를 통해 보다 구체적인 특성을 다루는 부분을 파인 튜닝하는 것이 유용하다 또 다른 고려사항은, 소규모 데이터 기반에서 더 많은 합성곱 구역을 훈련할수록 파라미터가 증가하여 과적합(overfitting)이 일어날 위험이 증가한다.



<그림 8. VGG16 Convolution base의 파인튜닝>

 

이 경우, 옵티마이저를 사용할 때 매우 낮은 학습률로 설정해 줘야한다.  이렇게 하는 이유는 파인 튜닝하는 합성곱 상단의 3개 층의 표현의 변동 폭을 제한하기 위함이다. 합성곱 층의 파인튜닝을 한 결과, 아래 그림 9와 같이 validation accuracy 96~97% 범위를 나타낸다.



<그림 9. 훈련 및 검증 정확도 및 손실>

 

결언

  2,000 개의 개와 고양이 이미지샘플을 가지고 딥러닝 이미지 분류를 수행할 경우의 고려할 점을 살펴보기 위해 1편에서 처음부터 Keras 라이브러리를 사용하여 모델을 작성해보았고75% 수준의 validation 정확도를 보였다. 데이터증식으로 85% 수준까지, 그리고 2편에서 데이터증식과 특성 추출을 통하여 95.6%, 그리고 합성곱 층 일부 파인 튜닝 과 데이터증식을 통하여 97% validation 정확도 성능을 확인하였다.



[1] https://cs231n.github.io/transfer-learning/

[2] https://bit.ly/3hlerMJ

댓글 없음:

댓글 쓰기