본문 바로가기

Data Science/Deep Learning

[밑바닥부터 시작하는 딥러닝 1] Ch 8. 딥러닝

지금까지 신경망에 대해 자세히 공부하였다.

 

이번 포스팅은 "밑바닥부터 시작하는 딥러닝 1"의 마지막 장으로 "딥러닝"에 대한 설명을 해보도록 하겠다.

 

간단하게 설명하면 딥러닝이란 층을 깊게 한 심층 신경망이다.

 

대규모 일반 사물 인식의 경우, 문제가 엄청나게 복잡하므로 층을 깊게 하면 정확도를 크게 끌어올릴 수가 있다.

 

이러한 이유 때문에 "딥러닝"이 각광받고 있는 것이다.

 

또한 딥러닝 모델의 정확도를 향상시키는 방법으로 "앙상블 학습, 학습률 감소, 데이터 확장" 등이 있다.

 

여기서 "데이터 확장"이란 입력 이미지(학습 이미지)를 알고리즘을 동원하여 인위적으로 확장하는 것을 의미한다.

 

데이터 확장의 예시

 

데이터 확장 방법으로는 대표적으로 6가지가 존재한다.

 

  1. Flip
    • 이미지를 랜덤하게 좌/우 또는 상/하 반전시키는 방법
    • 이미지의 대칭성을 고려하지 않아도 되는 경우에만 사용 가능!!
  2. Rotation
    • 이미지를 회전시키는 방법
  3. Crop
    • 이미지의 일부를 잘라내는 방법
  4. Scaling
    • 이미지를 확대 또는 축소시키는 방법
  5. Cutout
    • 이미지의 일부를 사각형 모양으로 검은색을 칠하는 방법
  6. Cutmix
    • 두 이미지를 합쳐놓고 이미지의 Label을 학습시킬 때, 각각의 이미지가 차지하는 비율만큼 학습시키는 방법

 

 

 

앞서 층을 깊게 하면 정확도가 높아진다고는 했으나, 층을 깊게 하는 것이 왜 중요한가에 대한 이론적 근거는 아직 많이 부족하다.

 

그래도 지금까지의 연구 결과를 바탕으로 층을 깊게 하는 것이 왜 중요한지에 대해 설명해보겠다.

 

  • 적은 매개변수로 같은(혹은 그 이상) 수준의 표현력을 달성함
  • 학습 데이터의 양을 줄여서 고속 학습이 가능함 (즉, 학습의 효율성이 높아짐)
  • 정보를 계층적으로 전달할 수 있음

 

 

 

다음으로 몇 가지 유명한 신경망에 대해 간략히 소개하고자 한다.

 

  • VGG
    • 합성곱 계층과 풀링 계층으로 구성되는 기본적인 CNN임
    • 비중 있는 층(합성곱 계층, 완전연결 계층)을 모두 16층(혹은 19층)으로 심화한 것이 특징임
    • 3 x 3의 작은 필터를 사용한 합성곱 계층을 연속으로 거침
    • 구성이 간단하여 응용하기 좋음

VGG

 

  • GoogLeNet
    • 세로 방향 깊이 뿐만 아니라 가로 방향도 깊다는 점이 특징임
    • 또한 가로 방향에 "폭"이 존재하며, 이를 인셉션 구조라 함
      • 인셉션 구조란 크기가 다른 필터와 풀링 여러 개를 적용하여 그 결과를 결합하는 것임
      • 이러한 인셉션 구조를 하나의 빌딩 블록으로 사용
    • GoogLeNet에서는 1 x 1 크기의 필터를 사용한 합성곱 계층을 많은 곳에서 사용하는데, 이는 매개변수 제거와 고속 처리에 기여함

GoogLeNet

 

GoogLeNet의 인셉션 구조

 

  • ResNet
    • 딥러닝 학습에서는 층이 지나치게 깊으면 학습이 잘 되지 않고 오히려 성능이 떨어지는데, ResNet은 이런 문제를 "스킵 연결"로 해결함
      • 스킵 연결이란 입력 데이터를 합성곱 계층을 건너뛰어 출력에 바로 더하는 구조를 뜻함
    • 층의 깊이에 비례해서 성능을 향상시킬 수 있는 것이 ResNet의 핵심임
      • 스킵 연결은 층이 깊어져도 학습을 효율적으로 할 수 있도록 도와주는데, 이는 역전파 때 스킵 연결이 신호 감소를 막아주기 때문
      • 즉, 층을 깊게 할수록 기울기가 작아지는 기울기 소실 문제를 스킵 연결이 줄여주는 것

ResNet의 스킵 연결 예시

 

ResNet

 

<참고>

  • 전이 학습(Transfer Learning)
    • 학습된 가중치(혹은 그 일부)를 다른 신경망에 복사한 다음, 그 상태로 재학습(fine tuning)을 수행하는 방법임
    • 보유한 데이터 셋이 적을 때 특히 유용

 

 

 

다음은 "딥러닝 고속화"에 대한 내용을 설명하고자 한다.

 

현재 대부분의 딥러닝 프레워크는 GPU를 활용하여 대량의 연산을 고속으로 처리해주며, 학습을 복수의 GPU와 여러 기기로 분산 수행한다.

 

CPU연속적인 복잡한 계산을 잘 처리하는 반면, GPU대량 병렬 연산에 특화되어 있다.

 

즉, GPU는 작은 단위로 계산하기보다는 큰 덩어리를 한 번에 계산할 때 유리하다는 말이다.

 

또한 메모리 용량버스 대역폭 등이 딥러닝 고속화에 걸림돌이 될 수 있으므로, 네트워크로 주고받는 데이터의 비트 수는 최소로 만드는 것이 바람직하다. (즉, 비트 정밀도 감소)

 

일반적으로 딥러닝16비트 반정밀도만 사용해도 학습에 문제가 없다고 알려져 있다.

 

 

 

지금까지 딥러닝(신경망)에 대해 꽤나 많은 양의 내용을 공부하고 정리하였다.

 

딥러닝은 사물 인식 뿐만 아니라 사물 검출과 분할에도 이용할 수 있으며, 응용 분야로는 사진의 캡션 생성, 이미지 생성, 강화학습 등이 있다.

 

또한 최근에는 자율 주행 연구도 활발히 이루어지고 있어서 조만간 자율 주행 가능한 차가 나오지 않을까 하는 기대도 하게 된다.

 

이처럼 딥러닝의 기술을 활용할 수 있는 분야는 무궁무진하다고 생각된다.

 

"밑바닥부터 시작하는 딥러닝 1"에서는 CNN을 메인으로 다뤘다면, "밑바닥부터 시작하는 딥러닝 2"는 RNN에 대해 중점적으로 다룬다.

 

조만간 "밑바닥부터 시작하는 딥러닝 2"를 공부하고 정리해보는 시간을 갖도록 하겠다.

 

 

★ 참고 자료

- 밑바닥부터 시작하는 딥러닝 교재