/deep_learning

딥러닝 공부 자료입니다.

Primary LanguageJupyter Notebook

Deep Learning (딥 러닝)

  • 인공 신경망 (Artificial Neural Network)의 층을 연속적으로 깊게 쌓아올려 데이터를 학습하는 방식이다.

  • 인간이 학습하고 기억하는 매커니즘을 모방한 기계 학습이다.

  • 인간은 학습할 때 뇌에 있는 뉴런이 자극을 받아들이며, 자극이 일정 수준 이상이 되면
    화학 물질을 통해 다른 뉴런과 연결되며 해당 부분이 발달한다.

  • 자극이 약하거나 기준치를 넘지 못하면 뉴런은 연결되지 않는다.

  • 입력한 데이터가 활성 함수에서 임계점을 넘으면 출력된다.

  • 초기 인공 신경망(Perceptron)에서 깊게 층을 쌓아 학습하는 딥 러닝으로 발전한다.

  • 딥 러닝은 Input Nodes Layer, Hidden Nodes Layer, Output Nodes Layer의 세 가지 층이 존재한다.




SLP (Single Layer Perceptron, 단층 퍼셉트론, 단일 퍼셉트론)

  • 가장 단순한 형태의 신경망으로서, Hidden Layer가 없고 Single Layer로 구성되어 있다.

  • 퍼셉트론의 구조는 입력 feature와 가중치, Activation Function, 출력 값으로 구성되어 있다.

  • 퍼셉트론에서의 가중치는 신경 세포에서 신호를 전달하는 축삭 돌기의 역할을 하며,
    입력 값과 가중치는 모두 인공 뉴런(활성 함수)으로 도착한다.

  • 가중치가 클수록 해당 입력 값이 중요하다는 뜻이고,
    인공 뉴런(활성 함수)에 도착한 각 입력 값과 가중치를 곱한 뒤, 그것들의 총 합을 구한다.

  • 인공 뉴런(활성 함수)은 보통 시그모이드 함수와 같은 계단 함수를 사용하며,
    합계를 확률로 변환하고, 이 때 임계치를 기준으로 0 또는 1을 출력한다.


  • 로지스틱 회귀 모델이 인공 신경망에서는 하나의 인공 뉴런으로 볼 수 있다.

  • 결과적으로, 회귀 모델과 마찬가지로 실제 값과 예측 값의 차이가
    최소가 되는 가중치를 찾는 과정이 퍼셉트론의 학습 과정이다.

  • 최초 가중치를 설정한 뒤, 입력 feature 값으로 예측 값을 계산하고,
    실제 값과의 차이를 구한 뒤 이를 줄일 수 있는 방향으로 가중치를 변경한다.

  • 퍼셉트론의 활성화 정도를 편향(bias)으로 조절할 수 있으며, 편향을 통해 어느 정도의 자극을 미리 주고 시작할 수 있다.

  • 뉴런이 활성화되기 위해 필요한 자극이 1,000이라고 가정하면, 500의 입력 값만 받아도 편향을 2로 주어 1,000으로 만들 수 있다.


  • 퍼셉트론의 출력 값과 실제 값의 차이를 줄여나가는 방향으로 계속해서 가중치를 변경하며, 이 떄 경사 하강법을 사용한다.




SGD (Stochastic Gradient Descent, 확률적 경사 하강법)

  • 경사 하강법 방식은 전체 학습 데이터를 기반으로 계산한다.

  • 하지만 입력 데이터가 크고 레이어가 많을수록 그만큼 많은 자원이 소모된다.

  • 일반적으로 메모리 부족으로 인해 연산이 불가능하기 때문에, 이를 극복하기 위해 SGD 방식이 도입되었다.

  • 이는 전체 학습 데이터 중 단 한 건만 임의로 선택하여 경사 하강법을 실시하는 방식을 의미한다.

  • 많은 건 수 중에서 한 건만 실시하기 때문에, 빠르게 최적점을 찾을 수 있지만 노이즈가 심하다.

  • 무작위로 추출된 샘플 데이터에 대해 경사 하강법을 실시하기 때문에 진폭이 크고 불안정해 보일 수 있다.

  • 일반적으로는 사용되지 않으며, SGD을 얘기할 때는 보통 미니 배치 경사 하강법을 의미한다.




Mini-Batch Gradient Descent (미니 배치 경사 하강법)

  • 전체 학습 데이터 중, 특정 크기(Batch 크기)만큼 임의로 선택해서 경사 하강법을 실시한다.
  • 이것 또한 확률적 경사 하강법이다.


  • 전체 학습 데이터가 1,000건, bacth size를 100건이라고 가정하면,
    전체 데이터를 batch size만큼 나눠서 가져온 뒤 섞고, 경사 하강법을 계산한다.
  • 이 경우, 10번 반복해야 1,000개의 데이터가 모두 학습되고, 이를 epoch라고 한다.
  • 즉, 10 epoch * 100 batch이다.




Multi Layer Perceptron (다층 퍼셉트론, 다중 퍼셉트론)

  • 보다 복잡한 문제를 해결하기 위해 입력층과 출력층 사이에 은닉층(Hidden Layer)이 포함되어 있다.
  • 퍼셉트론을 여러 층 쌓은 인공신경망으로서, 각 층은 활성 함수를 통해 입력을 처리한다.
  • 층이 깊어질수록 보다 정확한 분류가 가능해지지만, 너무 깊어지면 Overfitting이 발생한다.



Activation Function (활성화 함수)

  • 인공 신경망에서 입력값에 가중치를 곱한 뒤 전부 합한 결과를 적용하는 함수다.

  1. 시그모이드 함수
    • 은닉층이 아닌 최종 활성화 함수, 출력층에서 사용한다.
    • 은닉층에서 사용 시, 입력값이 양 또는 음의 방향으로 큰 값일 경우 출력에 변화가 없다.
    • 평균이 0이 아니기 때문에 정규 분포 형태가 아니며,
      방향에 따라 기울기가 달라져서 탐색 경로가 비효율적인(지그재그) 형태가 된다.


  1. 소프트맥스 함수
    • 마찬가지로 은닉층이 아닌 최종 활성화 함수(출력층)에서 사용한다.
    • 시그모이드와 유사하게 0 ~ 1 사이의 값을 출력하지만,
      이진 분류가 아닌 다중 분류를 통해 모든 확률 값이 1이 되도록 해준다.
    • 여러 개의 타겟 데이터를 분류하는 다중 분류의 최종 활성화 함수(출력층)로 사용된다.


  1. 탄젠트 함수
    • 은닉층이 아닌 최종 활성화 함수(출력층)에서 사용한다.
    • 은닉층에서 사용 시, 시그모이드와 달리 -1 ~ 1 사이의 값을 출력해서 평균이 0이 될 수 있지만,
      여전히 입력 값이 양 또는 음의 방향으로 큰 값일 경우 출력 값의 변화가 미비하다.


  1. 렐루 함수
    • 대표적인 은닉층의 활성 함수다.
    • 입력 값이 0보다 작으면 0을, 0보다 크면 입력 값을 그대로 출력하게 된다.




optimizer (최적화)

  • 최적의 경사 하강법을 적용하기 위해 필요하며, 최소값을 찾아가는 방법들을 의미한다.
  • loss를 줄이는 방향으로 최소 loss를 보다 빠르고 안정적으로 수렴할 수 있어야 한다.


Momentum

  • 가중치를 업데이트할 때마다 이전 값을 일정 수준 반영시키면서 새로운 가중치로 업데이트한다.
  • 지역 최소값에서 벗어나지 못하는 문제를 해결할 수 있으며,
    진행했던 방향만큼 추가적으로 더해서 관성처럼 빠져나올 수 있게 해준다.


AdaGrad (Adaptive Gradient)

  • 가중치 별로 서로 다른 학습률을 동적으로 적용한다.
  • 변화가 적은 가중치에는 보다 큰 학습률을 적용하고, 변화가큰 가중치에는 보다 작은 학습률을 적용한다.
  • 처음에는 큰 보폭으로 이동하다가, 최소값에 가까워질수록 작은 보폭으로 이동한다.
  • 과거의 모든 기울기를 사용하기 때문에 학습률이 급격히 감소하며, 분모가 커짐으로써 학습률이 0에 가까워진다.

RMSProp (Root Mean Square Propagation)

  • AdaGrad의 단점을 보완한 기법으로서, 학습률이 지나치게 작아지는 것을 막기 위해
    지수 가중 평균법(Exponential Weighted Averages)을 통해 구한다.
  • 지수 가중 평균법이란, 데이터의 이동 평균을 구할 때
    오래된 데이터가 미치는 영향을 지수적으로 감쇠하도록 하는 방법이다.
  • 이전의 기울기들을 똑같이 더해가는 것이 아니라,
    훨씬 이전의 기울기는 약간만 반영하고, 최근의 기울기는 보다 많이 반영한다.
  • feature마다 적절한 학습률을 적용하여 학습을 효율적으로 진행할 수 있고, AdaGrad보다 학습을 오래 할 수 있다.

Adam (Adaptive Moment Estimation)

  • Momentum과 RMSProp, 두 가지 방식을 결합한 형태로,
    진행하던 속도에 관성을 주고 지수 가중 평균법을 적용한 알고리즘이다.
  • 가장 많이 사용되는 최적화 알고리즘으로, 수식은 아래와 같다.



TensorFlow (텐서플로우)

  • 구글이 개발한 오픈소스 소프트웨어 라이브러리이며,
    머신러닝과 딥러닝을 쉽게 사용할 수 있도록 다양한 기능을 제공한다.
  • 주로 이미지 인식이나 반복 신경망 구성, 기계 번역, 필기 숫자 판별 등을 위한 각종 신경망 학습에 사용된다.
  • 딥러닝 모델을 만들 때, 기초부터 세세하게 작업해야 하기 때문에 진입장벽이 높다.


Keras (케라스)

  • 일반 사용 사례에 "최적화, 간단, 일관, 단순화" 된 인터페이스를 제공한다.
  • 손쉽게 딥러닝 모델을 개발하고 활용할 수 있도록 직관적인 API를 제공한다.
  • Tensorflow 2버전 이상부터 Keras가 포함되어 있기 때문에, Tensorflow를 통해 사용한다.
  • 이제는 기존 Keras 패키지보다 Tensorflow에 내장된 Keras를 사용하는 것이 권장된다.


Grayscale, RGB

  • 흑백 이미지와 컬러 이미지는 각각 2차원과 3차원으로 표현될 수 있다.
  • 흑백 이미지는 0 ~ 255 사이의 값을 가지는 2차원 배열 (높이 * 너비)이고,
    컬러 이미지는 R, G, B 라는 2차원 배열 3개를 가지는 3차원 배열 (높이 * 너비 * 채널)이다.

Grayscale Image Matrix

  • 검은색에 가까운 색은 0에, 흰색에 가까운 색은 255에 가깝다.
  • 모든 픽셀이 feature다.




Sequential API, Functional API

Sequential API

  • 간단한 모델을 구햔하기에 적합하며, 단순하게 층을 쌓는 방식으로 쉽고 간단하게 사용할 수 있다.
  • 단일 입력 및 출력만 있기 때문에, 레이어를 공유하거나 여러 입력 또는 출력을 가질 수 있는 모델은 생성할 수 없다.

Functional API

  • Sequential API로는 구현하기 어려운 복잡한 모델들을 구현할 수 있다.
  • 여러 개의 입력 또는 출력을 가지는 모델을 구현하거나 층 간의 연결 및 연산을 수행하는 모델 구현 시 사용한다.

성능 평가




Callback API

  • 모델이 학습 중에 충돌이 발생하거나 네트워크가 끊기면 모든 훈련 시간이 낭비될 수 있고,
    과적합을 방지하기 위해 훈련을 조기 종료해야 할 수도 있다.
  • 모델이 학습을 시작하면 학습이 완료될 때까지 어떤 제어도 하지 못하게 되고,
    신경망 훈련을 완료하는 데에는 몇 시간에서 최대 며칠이 걸릴 수도 있기 때문에, 모델을 모니터링 및 제어하는 기능이 필요하다.
  • 훈련 시(fit()) Callback API를 등록시키면 반복 내에서 특정 이벤트가 발생할 때마다 등록된 callback이 호출되어 수행된다.

ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weight_only=False, mode='auto')

  • 특정 조건에 따라 모델 또는 가중치를 파일로 저장한다.
  • filepath: "weights.{epoch:03d}-{val_loss:.4f}-{acc:.4f}.weights.hdf5"와 같이 모델의 체크포인트를 저장한다.
  • monitor: 모니터링할 성능 지표를 작성한다.
  • save_best_only: 가장 좋은 성능을 보인 모델을 저장할지에 대한 여부
  • mode: {auto, min, max} 중 한 가지를 작성한다. monitor의 성능 지표에 따라 적합한 것을 선택한다.
    monitor의 성능 지표가 감소해야 좋은 경우는 min, 증가해야 좋은 경우는 max,
    monitor의 성능 지표명으로부터 자동으로 유추하고 싶다면 auto를 기재한다.

ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', min_lr=0)

  • 특정 반복 동안 성능이 개선되지 않을 때, 학습률을 동적으로 감소시킨다.
  • monitor: 모니터링할 성능 지표를 작성한다.
  • factor: 학습률을 감소시킬 비율, 새로운 학습률 = 기존 학습률 * factor
  • patience: 학습률을 줄이기 전 monitor 할 반복 횟수
  • mode: {auto, min, max} 중 한 가지를 작성한다. monitor의 성능 지표에 따라 적합한 것을 선택한다.
    monitor의 성능 지표가 감소해야 좋은 경우는 min, 증가해야 좋은 경우는 max,
    monitor의 성능 지표명으로부터 자동으로 유추하고 싶다면 auto를 기재한다.

EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')

  • 특정 반복동안 성능이 개선되지 않으면 학습을 조기 종료한다.

  • monitor: 모니터링할 성능 지표를 작성한다.

  • patience: Early Stopping을 적용하기 전 monitor할 반복 횟수

  • mode: {auto, min, max} 중 한 가지를 작성한다. monitor의 성능 지표에 따라 적합한 것을 선택한다.
    monitor의 성능 지표가 감소해야 좋은 경우는 min, 증가해야 좋은 경우는 max,
    monitor의 성능 지표명으로부터 자동으로 유추하고 싶다면 auto를 기재한다.




    CNN (Convolutional Neural Network, 합성곱 신경망)

  • 실제 이미지 데이터는 분류 대상이 이미지에서 고정된 위치에 있지 않은 경우가 대부분이다.

  • 실제 이미지 데이터를 분류하기 위해서는 이미지의 각 feature들을 그대로 학습하는 것이 아닌,
    CNN으로 패턴을 인식한 뒤 학습해야 한다.


  • 이미지의 크기가 커질수록 굉장히 많은 Weight(가중치)가 필요하기 때문에 분류기에 바로 넣지 않고,
    이를 사전에 추출 및 축소해야 한다.
  • CNN은 인간의 시신경 구조를 모방한 기술로서, 이미지의 패턴을 찾을 때 사용한다.
  • Feature Extraction을 통해 각 단계를 거치면서, 함축된 이미지 조각으로 분리되고
    각 이미지 조각을 통해 이미지의 패턴을 인식한다.


  • CNN은 분류하기에 적합한 최적의 feature를 추출하고,
    그 feature를 추출하기 위한 최적의 Weight와 Filter를 계산한다.




Filter

  • 보통 정방 행렬로 구성되어 있으며, 원본 이미지에 슬라이딩 윈도우 알고리즘을 사용하여
    순차적으로 새로운 픽셀값을 만들면서 적용한다.
  • 사용자가 목적에 맞는 특정 필터를 만들거나 기존에 설계된 다양한 필터를 선택하여 이미지에 적용한다.
    하지만, CNN은 최적의 필터값을 학습하여 스스로 최적화한다.


  • 필터 하나 당, 이미지의 채널 수만큼의 Kernel이 존재하고,
    각 채널에 할당된 필터의 커널을 적용하여 출력 이미지를 생성한다.
  • 출력 feature map의 개수는 필터의 개수와 같다.

Kernel

  • 필터 안에는 1 ~ n개의 커널이 존재한다.
  • 커널의 개수는 반드시 이미지의 채널 수와 동일해야 한다.
  • Kernel Size는 가로 * 세로를 의미하며, 가로와 세로는 서로 다를 수 있지만 보통은 일치시킨다.
  • Kernel Size가 크면 클수록 입력 이미지에서 더 많은 feature 정보를 가져올 수 있지만,
    큰 사이즈의 커널로 Convolution Backbone을 할 경우, 그만큼 더 많은 연산량과 파라미터가 필요하다.

Stride

  • 입력 이미지에 Convolution Filter를 적용할 때 Sliding Window가 이동하는 간격을 의미한다.
  • 기본 Stride는 1이지만, 2를 적용하면 입력 feature map 대비 출력 feature map의 크기가 절반 정도 줄어든다.
  • Stride를 키우면, feature 정보를 손실할 가능성이 높아지지만,
    오히려 불필요한 특성을 제거하는 효과를 가져올 수 있고 Convolution 연산 속도를 향상시킨다.

Padding

  • 필터를 적용하여 Convolution 수행 시, 출력 feature map이 입력 feature map에 비해 계속해서 작아지는 것을 막기 위해 사용한다.
  • 필터 적용 전 입력 feature map의 상하좌우 끝에 각각 열과 행을 추가한 뒤,
    0으로 채워서 크기를 증가시킨다.
  • 출력 이미지의 크기를 입력 이미지의 크기와 동일하게 유지하기 위해 직접 계산할 필요 없이,
    "same"이라는 값을 통해 입력 이미지의 크기와 동일하게 맞출 수 있다.

Pooling

  • Convolution이 적용된 feature map의 일정 영역별로 하나의 값을 추출하여 feature map의 사이즈를 줄인다.
  • 보통은 Convolution → Relu Activation → Pooling 순으로 적용한다.
  • 비슷한 feature들이 서로 다른 이미지에서 위치가 달라지면서 다르게 해석되는 현상을 중화시킬 수 있고,
    feature map의 크기가 줄어들기 때문에 연산 성능이 향상된다.
  • Max Pooling과 Average Pooling이 있으며, Max Pooling은 중요도가 가장 높은 feature를 추출하고,
    Average Pooling은 전체를 버무려서 추출한다.




🚩정리

  • Stride를 증가시키는 것과 Pooling을 적용하는 것은 출력 feature map의 크기를 줄이는 데 사용하는 방법이다.
  • Convolution 연산을 진행하면서 feature map의 크기를 줄이면,
    위치 변화에 따른 feature의 영향도도 줄어들기 때문에 과적합을 방지할 수 있다는 장점이 있다.
  • Pooling의 경우, 특정 위치의 feature 값이 손실되는 이슈 등으로 인해
    최근 Advanced CNN에서는 많이 사용되지 않는다.
  • Classifier에서는 Fully Connected Layer의 지나친 연결로 인해 많은 파라미터가 생성되므로 오히려 과적합이 발생할 수 있다.


  • Dropout을 사용함으로써 Layer 간 연결을 줄일 수 있고, 과적합도 방지할 수 있다.




CNN Performance

  • CNN 모델을 제작할 때, 다양한 기법을 통해 성능 개선 및 과적합 해소가 가능하다.

Weight Initialization (가중치 초기화)

  • 처음 가중치를 어떻게 줄 것인지 정하는 방법이며, 처음 가중치를 어떻게 설정하느냐에 따라 모델의 성능이 크게 달라진다.
  1. 사비에르 글로로트 초기화
  • 고정된 표준편차를 사용하지 않고, 이전 층의 노드 수에 맞게 현재 층의 가중치를 초기화한다.
  • 층마다 노드 개수를 다르게 설정하더라도, 이에 맞게 가중치가 초기화되기 때문에
    고정된 표준편차를 사용하는 것보다 이상치에 민감하지 않다.
  • 활성화 함수가 ReLU일 경우, 층을 통과할수록 활성화 값이 고르지 못하게 되는 문제가 있기 때문에 출력층에서만 사용한다.

  1. 카이밍 히 초기화
  • 고정된 표준편차를 사용하지 않고, 이전 층의 노드 수에 맞게 현재 층의 가중치를 초기화한다.
  • 층마다 노드 개수를 다르게 설정하더라도, 이에 맞게 가중치가 초기화되기 때문에
    고정된 표준편차를 사용하는 것보다 이상치에 민감하지 않다.
  • 활성화 함수가 ReLU일 때 추천하는 초기화 방식으로서, 층이 깊어지더라도 모든 활성화 값이 고르게 분포된다.

Batch Normalization (배치 정규화)

  • 입력 데이터 간 값의 차이가 발생하면, 그에 따라 가중치의 비중도 달라지기 때문에 층을 통과할수록 편차가 심해진다.
    이를 내부 공변량 이동(Internal Convariant Shift)이라고 한다.
  • 가중치의 값의 비중이 달라지면, 특정 가중치에 중점을 두면서 경사 하강법이 진행되기 때문에
    모든 입력값을 표준 정규화하여 최적의 파라미터를 보다 빠르게 학습할 수 있도록 해야한다.
  • 가중치를 표준화할 때 민감도를 감소시키고, 학습 속도를 증가시키며, 모델을 일반화하기 위해 사용한다.

  • BN을 활성화 함수 앞에 적용하면, Weight(가중치) 값은 평균이 0, 분산이 1인 상태로 정규분포가 된다.
  • ReLU가 activation 파라미터로 적용되면, 음수에 해당하는 부분(절반 정도)이 0이 된다.
  • 이러한 문제를 해결하기 위해 γ(감마)와 β(베타)를 활용해서 음수 부분이 모두 0이 되는 것을 막아준다.

Batch Size

  • Batch Size를 작게 설정하면 적절한 noise가 생겨서 overfitting을 방지하게 된다.
    이는 모델의 성능을 향상시키는 계기가 될 수 있지만, 그렇다고 해도 너무 작아지면 안된다.
  • Batch Size를 너무 작게 설정했을 경우, Batch 하나 당 샘플 수가 줄어들기 때문에
    그만큼 훈련 데이터를 학습하는 데에는 부족해질 수 있다.
  • 따라서 매우 크게 주는 것보다는 매우 작게 주는 것이 낫지만, 너무 작게 주면 안 된다.
  • 논문에 따르면, Batch Size는 8 ~ 32 사이로 주는 것이 효과적이라고 한다.

Global Average Pooling

  • 이전의 Pooling은 면적을 줄이기 위해 사용했지만,
    Global Average Pooling은 면적을 없애고 채널 수 만큼의 값이 나오게 한다.
  • feature map의 가로 * 세로의 특정 영역을 Sub Sampling하지 않고 채널 별 평균 값을 추출한다.
  • 보통 feature map의 채널 수가 많을 때(512개 이상) 적용하는 방식이며, 채널 수가 적을 때는 Flatten을 적용한다.
  • Flatten 이후 Classification Dense Layer로 이어지면서
    많은 파라미터들로 인한 overfitting 유발 가능성 및 학습 시간 증가로 이어지기 때문에,
    맨 마지막 feature map의 채널 수가 크다면 Global Average Pooling을 적용하는 것이 더 나을 수도 있다.


Weight Regularization (가중치 규제), Weight Decay (가중치 감소)

  • Loss Function은 loss 값이 작아지는 방향으로 가중치를 업데이트한다.
  • 하지만, loss를 줄이는 데에만 신경쓰게 되면 특정 가중치가 지나치게 커지면서 결과는 오히려 악화될 수 있다.
  • 기존 가중치에 특정 연산을 수행하여 loss function의 출력 값과 더해주면
    loss function의 결과를 어느 정도 제어할 수 있게 된다.
  • 보통 파라미터 수가 많은 Dense Layer(분류기)에서 많이 사용되며,
    가중치보다는 loss function에 규제를 걸어 가중치를 감소시키는 게 원리다.
  • kernel_reguarlizer 파라미터에서 l1, l2 중 하나를 선택하여 사용한다.




Data Augmentation (데이터 증강)

  • 이미지의 종류와 개수가 적으면, CNN 모델의 성능이 떨어질 수 밖에 없다.
  • 또한, 몇 안되는 이미지로 훈련시키면 과적합이 발생한다.
  • CNN 모델의 성능을 높이고 과적합을 개선하기 위해서는 이미지의 종류와 개수가 많아야 한다.
    즉, 데이터의 양을 늘려줘야 한다.
  • 이미지 데이터는 학습 데이터를 수집하여 양을 늘리기 쉽지 않기 때문에,
    원본 이미지를 변형시킴으로서 양을 늘릴 수 있다.
  • Data Augmentation을 통해 원본 이미지에 다양한 변형을 주면,
    학습에 사용하는 이미지 데이터를 늘리는 것과 유사한 효과를 볼 수 있다.
  • 원본 학습 이미지의 개수를 늘리는 것이 아닌, 매 학습마다 개별적으로 원본 이미지를 변형해서 학습을 수행한다.


공간 레벨 변형

  • 좌우 또는 상하 반전, 특정 영역만큼 확대, 축소, 회전 등으로 변형시킨다.


픽셀 레벨 변형

  • 밝기, 명암, 채도, 색상 등을 변형시킨다.




Pretrained Model (사전 훈련 모델)

  • 모델을 처음부터 학습시키려면 많은 시간을 소비해야 한다.
  • 이를 위해 대규모 학습 데이터를 기반으로 사전에 훈련된 모델을 활용한다.
  • 대규모 데이터 세트에서 훈련되고 저장된 데이터로서, 일반적으로 대규모 이미지 분류 작업에서 훈련된 것을 의미한다.
  • 입력 이미지는 대부분 244 * 244 크기지만, 모델 별로 차이가 있다.
  • 자동차나 고양이 등을 포함한 1000개의 클래스,
    총 약 1400만개의 이미지로 구성된 ImageNet 데이터 세트로 사전 훈련되었다.


ImageNet Large Scale Visual Recognition Challenge (ILSVRC)

  • 2017년까지 대회가 주최되었으며, 이후에도 좋은 모델들이 등장했고 앞으로도 계속 등장할 것이다.
  • 메이저 플레이어들(구글, 마이크로소프트)이 만들어놓은 모델도 등장했다.


VGGNet

  • 옥스포드 대학 연구팀이 만든 모델이다.
  • 2014년 ILSVRC에서 만든 GoogleNet이 1위. VGG는 2위를 차지했다.
  • GoogleNet의 오류율은 6.7%, VGG의 오류율은 7.3%로, 0.6%의 차이밖에 나지 않았다.
  • 간결하고 단순한 아키텍처임에도 불구하고, 1위인 GoogleNet과 큰 차이 없는 성능을 보여줘서 주목을 받게 되었다.
  • 네트워크 깊이에 따른 모델 성능의 영향에 대한 연구에 집중하여 만들어진 네트워크다.
  • 신경망을 깊게 만들수록 성능이 좋아지는 것을 확인했지만, 커널 사이즈가 클수록 이미지 사이즈가 급격하게 줄어들기 때문에
    층을 더 깊게 만들기 어렵고 파라미터 개수와 연산량도 더 많이 필요하다는 것을 알게 되었다.
  • 따라서 커널 크기를 3 * 3으로 단일화했으며, padding과 strides 값을 조정하여 단순한 네트워크를 구성하였다.
  • 2개의 3 * 3 커널은 5 * 5 커널 1개와 동일한 크기의 feature map을 생성하기 때문에
    3 * 3 커널로 연산하면 더 많은 층을 쌓을 수 있게 된다.


Inception Network (GoogleNet)

  • 여러 사이즈의 커널들을 한꺼번에 결합하는 방식을 사용하며, 이를 묶어서 Inception Module이라고 한다.
  • 여러 개의 Inception Module을 연속적으로 이어서 구상하고,
    여러 사이즈의 필터들이 서로 다른 공간을 기반으로 feature들을 추출한다.
  • Inception Module을 결합하면서, 보다 풍부한 Feature Extractor Layer를 구성하게 된다.
  • 하지만, 여러 사이즈의 커널을 결합하게 되면, Convolution 연산을 수행할 때
    파라미터 수가 증가하게 되고, 이는 과적합으로 이어진다.
  • 이를 극복하고자 연산을 수행하기 전에 1 * 1 Convolution을 적용해서 파라미터 수를 획기적으로 감소시킨다.
  • 1 * 1 Convolution을 적용하면, 입력 데이터의 특징을 함축적으로 표현하면서
    파라미터 수를 줄이는 차원 축소 역할을 수행하게 된다.


1 * 1 Convolution

  • 행과 열의 크기 변환 없이 채널 수를 조절할 수 있고, weight 및 비선형성을 추가하는 역할을 한다.
  • 행과 열의 사이즈를 줄이고 싶다면 Pooling을 사용하면 되고,
    채널 수만 줄이고 싶다면 1 * 1 Convolution을 사용하면 된다.


ResNet (마이크로소프트)

  • VGG 이후 더 깊은 네트워크에 대한 연구가 많아졌지만,
    네트워크의 깊이가 깊어질수록 오히려 정확도가 떨어지는 문제가 있었다.
  • 이는 층이 깊어질수록 기울기가 계속해서 0에 가까워지는 Gradient Vanishing이 발생하기 때문이다.


  • 이 문제를 해결하고자 층을 만들되, Input 데이터와 Output이 동일하게 나올 수 있도록 하는 층을 연구하기 시작했다.
    이를 함수로 나타내면 H(x) = x이다.
  • 하지만 활성화 함수를 통과한 값을 기존 Input과 동일하게 만드는 것은 굉장히 복잡했기 때문에
    H(x) = F(x) + x일 때, F(x)를 0으로 만드는 것에 포커스하게 되었다.
  • Input은 x이고, Model인 F(x)라는 일련의 과정을 거치면서, 자신인 x가 더해져서
    Output으로 F(x) + x가 나오는 구조가 된다.




Transfer Learning (전이 학습)

  • 이미지 분류 문제를 해결하는 데 사용했던 모델을
    다른 데이터 세트 또는 다른 문제에 적용시켜 해결하는 것을 의미한다.
  • 즉, 사전 학습 모델을 다른 작업에 이용하는 것을 의미한다.
  • 사전 훈련 모델의 Convolutional Base 구조(Conv2D + Pooling)을 그대로 두고,
    분류기(Fully Connected Layer)를 붙여서 학습시킨다.

  • 사전 학습 모델의 용도를 변경하기 위한 층별 미세 조정(Fine Tuning)은
    데이터 세트의 크기와 유사성을 기반으로 고민하여 조정한다.
  • 2018년 FAIR(Facebook AI Research) 논문에서 실험을 통해 '전이 학습이 학습 속도 면에서 효과가 있다'라는 것을 밝혀냈다.




Scaling Preprocessing

  • 0 ~ 1, -1 ~ 1, z-score 변환 중 하나를 선택하여 범위를 축소하는 작업을 의미한다.
  • 사전 훈련 모델은 주로 TensorFlow와 PyTorch 프레임워크 방식을 사용한다.
  • TensorFlow는 -1 ~ 1, PyTorch는 z-score 방식으로 변환하는 것이 각 프레임워크의 전통이다.




Fine Tuning (미세 조정)

  • ImageNet으로 학습된 사전 훈련 모델을 다른 목적이나 용도로 활용할 때
    Feature Extractor(CNN)의 Weight(가중치)를 제어하기 위한 기법이다.
  • 특정 Layer들을 Freeze시켜 학습에서 제외시키고, Learning Rate를 점차 감소시켜 적용한다.
  • ImageNet과 유사한 데이터 세트거나, 클래스 별 데이터 건 수가 적을 경우 사용하는 것을 권장한다.
  • 학습시간 단축이 주 목적으로, 위 상황이 아닌 경우에는 Sequence까지만 진행하는 것이 좋다.
  • Fine Tuning이 언제나 모델의 성능을 향상시키는 것은 아니기 때문에, 적절한 상황에 사용할 수 있어야 한다.
  • 먼저 Classification Layer(분류기)만 학습시킨 뒤 전체를 학습시키는 순서로 진행하며,
    이를 위해 fit을 최소 2번 이상 실행한다.
  • 층별로 Freeze 또는 Unfreeze 여부를 결정하기 위해 미세 조정을 진행할 때,
    학습률이 높으면 이전에 학습한 것을 잃을 위험이 있기 때문에 학습률은 작게 설정한다.