8장. 딥러닝

괴도소녀·2021년 8월 10일
1

TFMaster

목록 보기
9/9

이번 포스팅은 딥러닝에 대해서 이야기해보겠다.
딥러닝은 층을 깊게 한 심층 신경망이며, 지금까지 설명한 신경망을 바탕으로 뒷단에 층을 추가하기만 하면 만들 수 있지만, 문제점들을 몇가지 품고 있다.


[손글씨 숫자를 인식하는 심층 CNN]

지금까지 구현한 신경망들보다 깊은 것이 보인다.
풀링 계층을 추가하여 중간 데이터의 공간 크기를 점차 줄여나가기도 하며, 마지막의 완전연결 계층에서는 드롭아웃 계층을 사용하는 것도 보인다.

  • 3x3의 작은 필터를 사용한 합성곱 계층
  • 활성화 함수는 ReLU
  • 완전연결 계층 뒤에 드롭아웃 계층 사용
  • Adam을 사용하여 최적화
  • 가중치 초깃값은 He.

이 신경망의 정확도는 99.38%이다.

정확도를 더 높이려면?

<What is the class of this image?>라는 웹사이트는 다양한 데이터셋을 대상으로 그동안 논문 등에 발표한 기법들의 정확도 순위를 정리해두었으니 들어가서 보자.

순위 상위권의 대부분은 CNN을 기초로 한 기법들이 점령했으며,
2016년 10월 MNIST 데이터셋에 대한 정확도 1위는 99.79%이며, 이 기법도 CNN을 기초로 하였다.

상위 기법들을 참고하면 정확도를 더 높일 수 있는 기술이나 힌트를 발견할 수 있는데, 예를 들어 앙상블 학습, 학습률 감소, 데이터 확장 등등이 정확도 향상에 공헌하고 있다.
이 중에서 데이터 확장이 가장 손쉬운 방법임과 동시에 정확도 개선에 아주 효과적이다.

데이터 확장(data augmentation)은 입력이미지(train 이미지)를 인위적으로 확장한다.
입력 이미지를 회전시키거나 세로로 이동하는 등의 미세한 변화들을 주어 이미지의 개수를 늘리는 것이며, 이는 데이터가 몇 개 없을 때 특히나 효과적이다.

이미지의 일부를 자르는 crop과 좌우를 뒤집는 flip도 한 방법이 될 수도 있다.

깊게 하는 이유

'층을 깊게 하는 것'이 왜 중요한가에 대한 이론적인 근거는 아직 확실하지 않다.
층을 깊게하는 것의 이점을 몇가지 설명해보겠다.

  • 신경망의 매개변수가 줄어든다.
  • 학습 데이터의 양을 줄여 학습을 고속으로 수행할 수 있다.
  • 정보를 계층적으로 전달할 수 있다.

딥러닝의 초기 역사

지금처럼 딥러닝이 큰 주목을 받게 된계기는 2012년의 이미지 인식 기술을 다루는 대회인 ILSVRC에서 였다. AlexNet이 압도적인 성적으로 우승하면서 그동안의 이미지 인식에 대한 접근법을 뒤흔들었다.

이미지넷

이미지넷(ImageNet)은 100만 장이 넘는 이미지를 담고 있는 데이터셋이다.
다양한 종류의 이미지를 포함하고 있고, 각 이미지에는 레이블이 붙어 있다.

ILSVRC대회에서 몇가지 시험 항목이 있는데, 그 중 하나가 분류(classification)이다.
분류 부문에서 1,000개의 클래스를 제대로 분류하는지를 겨룬다.

이 분류 부문에서 2012년 이후에 항상 1등은 딥러닝 방식이 차지했으며, 2015년에는 150층이 넘는 심층 신경망인 ResNet이 오류율을 3.5%까지 낮췄다. 참고로 이 오류율은 인간보다 우수한 결과라고 합니다.

최근에는 많이 알고 있는 VGG, GoogLeNet, ResNet이 좋은 성적으로 딥러닝 업계에서 활약하고 있다.

VGG

합성곱 계층과 폴링 계층으로 구성되는 '기본적'인 CNN이다.
비중 있는 층(합성곱 계층, 완전연결 계층)을 모두 16층(혹은 19층)으로 심화한 게 특징이다.

출처 : https://www.geeksforgeeks.org/vgg-16-cnn-model/

VGG는 3X3의 작은 필터를 사용한 합성곱 계층을 연속으로 거친다는 게 특징이며,
합성곱 계층에 2 ~ 4회 연속 풀링 계층을 둬서 크기를 절반으로 줄이는 처리를 반복한다.
그리고 마지막엔 완전연결계층을 통과시키고 결과를 출력한다.

VGG는 아직도 많이 사용하고 있는 CNN이고 구성이 다른 친구들에 비해 간단해서 많은 분들이 응용해서 사용한다.

GoogLeNet

GoogLeNet의 특징은 세로 방향으로도 깊지만 가로 방향도 깊다는 것이 특징이다.
GoogLeNet에는 가로 방향에 '폭'이 있다. 이르 인셉션 구조라 하며 아래와 같다.

인셉션 구조는 크기가 다른 필터(와 풀링)를 여러 개 적용하여 그 결과를 결합한다.
이 인셉션 구조를 하나의 빌딩 블록(구성 요소)로 사용하는 것이 GoogLeNet의 특징이다.

GoogLeNet은 1 X 1 크기의 필터를 사용하는 합성곱 계층을 많은 부분에서 쓰고 있으며,
이 1 X 1의 합성곱 연산은 채널 쪽으로 크기를 줄여서 매개변수 제거와 고속 처리에 기여한다.

ResNet

ResNet(Residual Network)은 마이크로 소프트의 팀이 개발한 네트워크 이며, 지금까지 보다 층을 더 깊게 할 수 있는 특별한 '장치'에 특징이 있다.

층을 무조건 깊게 해야 성능이 그에 비례하게 향상되는 것은 아니며, 딥러닝 학습에서 층이 지나치게 깊으면 오히려 학습이 잘 안되고 성능이 떨어지는 경우도 더러 있다.

ResNet은 이런 문제를 해결하기 위한 장치인 스킵 연결 skip connection을 도입했다. (스킵 연결을 도입했다고 해서 층을 무조건 겁나 깊게 한다고 성능이 비례하게 계속 좋아지는 건 아니며 한계가 있다.)

스킵 연결이란 입력 데이터를 합성곱 계층을 건너뛰고 출력에 바로 더하는 구조를 말한다.

위의 그림을 보면 입력 x를 연속한 두 합성곱 계층을 건너뛰고 출력에 바로 연결하는 것을 볼 수 있다.

건너뛰지 않으면 출력이 F(x) 이지만, 건너뛴 것도 더해서 출력이 F(x) + x 가 되는 것을 볼 수 있다.
이렇게 해서 역전파 때 스킵 연결이 신호 감쇠를 막아줘서 층이 깊어져도 학습을 효율적으로 할 수 있게 해줍니다.

스킵 연결은 입력 데이터를 '그대로' 흘려서 역전파 때도 상류의 기울기를 그대로 하류로 보내게 한다. 상류의 기울기에 아무 수정도 가하지 않고 '그대로' 흘리는 것이다. 그래서 스킵 연결로 기울기가 작아지거나 지나치게 커질 걱정 없이 앞 층의 의미 있는 기울기가 전해지게 하는 것입니다. 층을 깊게 할수록 기울기가 작아지는 소실 문제를 스킵 연결이 줄여주는 것이다.

우웩

ResNet은 합성곱 계층을 2개 층마다 건너뛰면서 층을 깊게 하며, 실험 결과 150층 이상으로 해도 정확도가 오르는 모습을 확인할 수 있다. 2015년 대회에서 오류율이 3.5%라는 엄청난 결과를 보여줬다.

딥러닝 고속화

빅데이터와 네트워크의 발전으로 딥러닝에서는 대량의 연산을 수행해야 한다. 딥러닝 프레임워크 대부분은 GPU를 활용하여 대량의 연산을 고속으로 처리할 수 있다. 최근 프레임워크에서는 학습을 복수의 GPU와 여러기기로 분산 수행하기 시작하였다.

GPU를 활용한 고속화

GPU느 ㄴ원래 그래픽 전용 보드에서 이용해 왔지만 최근에는 그래픽 처리 뿐만 아니라 범용 수치 연산에도 이용된다. GPU는 병렬 수치 연산을 고속으로 처리할 수 있다.
그래서 딥러닝 연산에서 GPU를 이용하면 CPU를 쓸 때보다 빠르게 결과를 얻을 수 있는 것이다.

분산학습

딥러닝 계산을 고속화하고자 다수의 GPU와 기기로 계산을 분산한다. 최근에는 다수의 GPU와 컴퓨터를 이용한 분산 학습을 지원한 딥러닝프레임워크들이 나타나고 있다. 거대한 데이터센터의 저지연, 고처리량 네트워크 위에서 이 프레임워크들이 수행하는 분산 학습은 놀라운 효과를 보이고 있다.

딥러닝의 활용

사물 검출

이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술이다.
사물 검출은 사물 인식보다 어려운 문제이다.
지금까지 본 사물 인식은 이미지 전체를 대상으로 했는데, 사물 검출 에서는 이미지 어딘가에 있을 사물의 위치까지 알아내야 한다.

CNN을 이용하여 사물 검출을 수행하는 방식은 여러가지가 있는데, 그 중에서도 R-CNN(Regions with Convolutional Neural Network)이 유명하다.

먼저 사물이 위치한 영역을 찾아내고, 추출한 각영역에 CNN을 적용하여 클래스를 분류하는 것이다.
후보 영역 추출(사물처럼 보이는 물체를 찾아 처리)에는 컴퓨터 비전 분야에서 발전해온 다양한 기법을 사용할 수 있고, R-CNN 논문에서는 Selective Search 기법을 사용했다. 최근에는 이 후보 영역 추출까지 CNN으로 처리하는 Faster R-CNN 기법도 등장했다.

분할

분할(segmentation)이란 이미지를 픽셀 수준에서 분류하는 문제이다.
픽셀 단위로 객체마다 채색된 지도(supervised)데이터를 사용해 학습한다.
그리고 추론할 때 입력 이미지의 모든 픽셀을 분류한다.

픽셀 수준으로 적용하기 위해 가장 단순한 방법은 모든 픽셀을 각각 추론하는 것이다.
예를들어 직사각형 영역의 중심 픽셀의 클래스를 분류하는 신경망을 만들어서, 모든 픽셀을 대상으로 추론작업 실행하는 것인데 이것은 픽셀 수만큼 forward 처리해야해서 시간이 오래걸린다.

그래서 낭비를 줄이기 위해 FCN(Fully Convolutional Network)가 고안되었으며, 이는 단한번의 forward 처리로 모든 픽셀의 클래스를 분류 해준다.

일반적인 CNN이 완전연결 계층을 이용하는 반면, FCN은 이 완전연결 계층을 '같은 기능을 하는 합성곱 계층'으로 바꿉니다.

  • 신경망은 중간 데이터의 볼륨을 1차원으로 바꿔 한줄로 늘어선 노드로 처리햇으나,
    FCN은 공간볼륨 유지한채로 마지막 출력까지 처리할 수 있다.
  • 마지막에 공간 크기를 확대하는 처리를 도입했다.(이중 선형 보간-bilinear interpolation)

사진 캡션 생성

컴퓨터 비전과 자연어를 융합한 연구 중, 사진을 주면 그 사진을 설명하는 글(사진 캡션)을 자동으로 생성하는 연구가 있다.

캡션 생성하는 대표적인 방법으론 NIC(Neural Image Caption)모델이 있다.
NIC는 심층 CNN과 자연어를 다루는 순환신경망(RNN)으로 구성된다.
RNN은 순환적관계 갖는 신경망으로 자연어, 시계열데이터등의 연속 데이터를 다룰때 많이 사용된다.

동작 방식은 CNN으로 사진에서 사진 특징 추출하고, 그 특징을 RNN에 넘긴다.
그리고 RNN은 CNN이 추출한 특징을 초깃값으로 해서 텍스트를 '순환적'으로 생성한다.
사진이나 자연어 같은 여러 종류의 정보를 조합하고 처리하는것을 멀티모달 처리(mutlimodal processing) 라고 하며, 최근 주목받는 분야 중 하나이다.

딥러닝의 미래

이미지 스타일(화풍)변환

이미지생성

아무런 입력 이미지 없이도 새로운 이미지를 그려내는 연구도 활발히 진행되고 잇다.
먼저 대량의 이미지를 사용하여 학습하긴 하지만, 학습이 끝난 후에는 아무런 입력이미지 없이도 새로운 그려낸다.

DCGAN(Deep Convolutional Generative Adversarial Network) 기법으로 생성한 침실 이미지들이다.

위는 진짜 사진이 아닌 새로 생성한 이미지이다.
DCGAN 기술의 핵심은 생성자와 식별자로 불리는 2개의 신경망을 이용하는 것이다.
생성자가 이미지 생성하고 식별자로 진짜인지 판정하는 방식이다.
이런식으로 계속 학습시키는 방식이 GAN(Generateive Adversarial Network) 기술이다.

자율주행

주위 환경 사물인식을 하여 자율주행 하는것인데 이것또한 딥러닝 기술이 들어간다.

SegNet이라는 CNN기반 신경망은 밑에 그림과 같이 주변 환경을 정확하게 인식해낸다.

Deep Q-Network(강화학습)

사람처럼 시행착오 과정을 거치며 스스로 학습하게 하려는 분야이며, '가르침'에 의존하는 '지도 학습'과는 다른 분야로 강화학습(reinforcement learning) 분야가 있다.
강화 학습은 에이전트라는 것이 환경에 맞게 행동을 선택하고, 그 행동에 의해서 환경이 변한다는 것이 특징이다.

여기서 보상은 정해진 것이 아니라 '예상 보상' 이라는 것이다.
강화학습중 Deep Q-Network(DQN) 이라는 방법을 살펴보자.
Q 학습이라는 강화학습 알고리즘을 기초로 하며, Q 학습에서는 최적 행동 가치 함수로 최적인 행동을 정한다.

이 함수를 딥러닝(CNN)으로 비슷하게 흉내 내어 사용하는 것이 DQN이다.

정리

  • 수많은 문제에서 신경망을 더 깊게 하여 성능을 개선할 수 있다.
  • 이미지 인식 기술 대회인 ILSVRC에서는 최근 딥러닝 기반 기법이 상위권을 독점하고 있으며, 그 깊이도 더 깊어지는 추세다.
  • 유명한 신경망으로는 VGG, GoogLeNet, ResNet이 있다.
  • GPU와 분산학습, 비트 정밀도 감소 등으로 딥러닝을 고속화 할 수 있다.
  • 딥러닝(신경망)은 사물 인식뿐 아니라 사물 검출과 분할에도 이용할 수 있다.
  • 딥러닝의 응용 분야로는 사진의 캡션 생성, 이미지 생성, 강화학습 등이 있다. 최근에는 자율 주행에도 딥러닝을 접목하고 있다.

0개의 댓글