본문 바로가기
프로그래밍 놀이터/머신러닝, AI, 딥러닝

[머신러닝] #8 딥러닝

by 돼지왕 왕돼지 2018. 7. 10.
반응형

[머신러닝] #8 딥러닝



"Deep Learning from Scratch” 책을 보고 제가 필요한 내용만 정리한 내용입니다.

자세한 내용은 책을 구매해서 보세요~

16비트 반밀도, Bilinear interpolation, binarized neural networks, classification, cnn 특징 계산, CNTK, computational network toolkit, cpu gpu 딥러닝, CUDA, cuDNN, Data Augmentation, dcgan, deep convolutional generative adversarial network, fater r-cnn, fcn, fine tuning, fully convolutional network, gan, generative adversarial network, generator discriminator, google 딥러닝, googlenet, gpu 컴퓨팅, half-precision, iamgenet large scale visual recognition challenge, ilsvrc, imagenet, maxwell, ms 딥러닝, multimodel processing, neural image caption, nic, r-cnn, receptive field, recurrent neural network, regions with convolutional neural network, residual network, resnet, RNN, scale out, segmentation, selective search, skip connection, svm, transfer learning, vgg, vgg16, vgg19, 계층적 정보, 깊은 층 장점, 넓은 수용 영역, 넘파이 16비트 반정밀도 부동소수점, 단일 곱셈 누산, 대규모 이미지 인식 대회, 더 깊은 신경망, 데이터 확장, 딥러닝, 딥러닝 고속화, 딥러닝 병목, 딥러닝 앤비디아 amd, 딥러닝의 미래, 딥러닝의 초기 역사, 딥러닝의 활용, 마이크로소프트 딥러닝, 멀티 모달 처리, 메모리 용량, 멕스웰, 버스 대역폭, 분산 학습, 분할, 비선형, 사물 검출, 사진 캡션 생성, 서포트 백터 머신, 수치 정밀도, 수평 확장, 스킵 연결, 시행착오, 심층 신경망, 앙상블 학습, 역합성곱, 연산 정밀도와 비트 줄이기, 의미 있는 기울기, 이미지넷, 이중 선형 보간, 인셉션 구조, 전이 학습, 정확도 향상, 지도 학습, 층의 깊이와 정확도, 텐서플로, 파스칼, 학습 효율성, 학습된 가중치, 학습률 감소, 합성곱 계층 개선, 합성곱 계층만으로 구성된 네트워크, 활성화 함수 비선형, 후보 영역 추출, 훈련 이미지 인위적 확장


-

딥러닝은 층을 깊게 한 심층 신경망이다.

심층 신경망은 지금까지 설명한 신경망을 바탕으로 뒷단에 층을 추가하기만 하면 만들 수 있지만, 커다란 문제가 몇 개 있다.





8.1. 더 깊게


8.1.1. 더 깊은 신경망으로


-

심층 신경망을 학습시키는 데는 시간이 오래 걸린다.

그러나 정확도는 올라간다.




8.1.2. 정확도를 더 높이려면


-

MNIST 데이터셋에 대해서는 층을 아주 깊게 하지 않고도 최고 수준의 결과나 나온다.

이는 손글씨 숫자라는 문제가 비교적 단순해서 신경망의 표현력을 극한까지 높일 필요가 없기 때문이라고 생각된다.

그래서 층을 깊게 해도 혜택이 적다고 할 수 있다.

반면, 나중에 소개하는 대규모 일반 사물 인식에서는 문제가 훨씬 복잡해지므로 층을 깊게 하면 정확도를 크게 끌어올릴 수 있다.



-

앙상블 학습, 학습률 감소, 데이터 확장 등의 기법으로 정확도 향상을 꾀할 수 있다.

데이터 확장은 손쉬운 방법이면서도 정확도 개선에 아주 효과적이다.



-

데이터 확장(data augmentation)은 입력 이미지(훈련 이미지)를 알고리즘을 동원해 ‘인위적’으로 확장한다.

입력 이미지를 회전하거나 세로로 이동하는 등 미세한 변화를 주어 이미지의 개수를 늘리는 것이다.

이는 데이터가 몇 개 없을 때 특히 효과적인 수단이다.


데이터 확장은 다양한 방법으로 이미지를 확장할 수 있다.

crop 이나 flip, 회전, 이동 등이 있다.

일반적인 이미지에는 밝기 등의 외형 변화나 확대, 축소 등의 스케일 변화도 효과적이다.


어쨋든 데이터 확장을 동원해 훈련 이미지의 개수를 늘릴 수 있다면 딥러닝의 인식 수준을 개선할 수 있다.

쉬운 트릭으로 가볍게 생각할 수 있지만, 멋진 결과를 가져오는 경우가 많다.




8.1.3. 깊게 하는 이유


-

“층을 깊게 하는 것”이 왜 중요한가에 대한 이론적인 근거는 아직 많이 부족하다.

그러나 연구와 실험 결과를 바탕으로 설명할 수 있는 것들이 있다.



-

층을 깊게 하는 것의 중요성은 ILSVRC 로 대표되는 대규모 이미지 인식 대회의 결과로부터 파악할 수 있다.

이 대회에서 최근 상위를 차지한 기법 대부분은 딥러닝 기반이며, 그 경향은 신경망을 더 깊게 만드는 방향으로 가고 있다.

층의 깊이에 비례해 정확도가 좋아지는 것이다.



-

층을 깊게 할 때의 장점 중 하나는  신경망의 매개변수 수가 줄어든다는 것이다.

층을 깊게 한 신경망은 깊지 않은 경우보다 적은 매개변수로 같은(혹은 그 이상) 수준의 표현력을 달성할 수 있다.



-

작은 필터를 겹쳐 신경망을 깊게 할 때의 장점은 매개변수 수를 줄여 넓은 수용 영역(receptive field)을 소화할 수 있다는 데 있다.(수용 영역은 뉴런에 변화를 일으키는 국소적인 공간 영역이다.)

게다가 층을 거듭하면서 ReLU 등의 활성화 함수를 합성곱 계층 사이에 끼움으로써 신경망의 표현력이 개선된다.

이는 활성화 함수가 신경망에 “비선형” 힘을 가하고, 비선형 함수가 겹치면서 더 복잡한 것도 표현할 수 있게 되기 때문이다.



-

층이 깊어지면 학습 효율성도 좋아진다.

층을 깊게 함으로써 학습 데이터의 양을 줄여 학습을 고속으로 수행할 수 있다는 뜻이다.

CNN 을 리마인드 해보면, 합성곱 계층이 정보를 계층적으로 추출하고 있었던 것을 보았다.

앞단의 합성곱 계층에서는 에지 등의 단순한 패턴에 뉴런이 반응하고 층이 깊어지면서 텍스터와 사물의 일부와 같이 점차 더 복잡한 것에 반응한다.


얕은 신경망 기준에서 “개” 를 인식한다고 하면, 한번에 개의 특징의 많은 부분을 이해해야 한다.

결과적으로 학습 시간이 오래 걸린다.

그러나 층이 깊어지면 학습해야 할 문제를 계층적으로 분해할 수 있다.

각 층이 학습해야 할 문제를 더 단순한 문제로 대체할 수 있는 것이다.

예를 들어 처음 층에서는 에지 학습에 전념하고, 그 다음은 얼굴의 특징을 찾고 등이다.



-

층을 깊게 하면 정보를 계층적으로 전달할 수 있다.

예를 들어 에지를 추출한 층의 다음 층은 에지 정보를 쓸 수 있고, 더 고도의 패턴을 효과적으로 학습하리라 기대할 수 있다.

층이 깊어지면서 학습해야 할 문제를 “풀기 쉬운 단순한 문제” 로 분해할 수 있어 효율적으로 학습하리라는 것을 기대할 수 있다.





8.2. 딥러닝의 초기 역사


-

딥러닝이 지금처럼 큰 주목을 받게 된 계기는 이미지 인식 기술을 겨루는 ILSVRC (ImageNet Large Scale Visual Recognition Challenge)의 2012년 대회였다.

그 해의 대회에서 딥러닝에 기초한 기법, 일명 AlexNet 이 압도적인 성적으로 우승하면서 그동안의 이미지 인식에 대한 접근법을 뿌리부터 뒤흔들렸다.

그 때부터 딥러닝이 주축이 되어 발전해왔다.



8.2.1. 이미지넷


-

이미지넷(ImageNet)은 100만 장이 넘는 이미지를 담고 있는 데이터셋이다.

다양한 종류의 이미지가 있고, 각 이미지에는 레이블(클래스 이름)이 붙어 있다.

매년 열리는 ILSVRC 는 이 데이터셋을 이용해서 자웅을 겨루는 대회이다.


이 대회에는 시험 항목이 몇 가지 있는데, 그 중 하나가 분류(classification)이다.

1,000개의 클래스를 제대로 분류하는지를 겨룬다.


2012년부터 딥러닝이 우승을 하기 시작했고,

이때부터 VGG, GoogLeNet, ResNet 등이 연달아 우승을 하고 에러율도 엄청나게 낮추었다.




8.2.2. VGG


-

VGG 는 합성곱 계층과 풀링 계층으로 구성되는 기본적인 CNN 이다.

다만, 비중 있는 층(합성곱 계층, 완전연결 계층)을 모두 16층(혹은 19층)으로 심화한 게 특징이다.

층의 깊이에 따라 VGG16 과 VGG19 로 구분하기도 한다.



-

VGG 에서 주목할 점은 3 X 3 의 작은 필터를 사용한 합성곱 계층을 연속으로 거친다는 것이다.

합성곱 계층을 2~4회 연속으로 풀링 계층을 두어 절반으로 줄이는 처리를 반복한다.

그리고 마지막에는 완전연결 계층을 통과시켜 결과를 출력한다.



-

VGG 는 2015년 대회에서 2위를 했다. 성능 면에서는 1위인 GoogLeNet 에 뒤지지만, VGG 는 구성이 간단하여 응용하기 좋다.

그래서 많은 기술자가 VGG 기반의 신경망을 즐겨 사용한다.




8.2.3. GoogLeNet


-

기본적으로는 CNN 과 다르지 않지만, GoogLeNet 은 세로 방향 깊이뿐 아니라 가로 방향도 깊다는 점이 특징이다.

GoogLeNet 에는 가로 방향에 “폭” 이 있다. 이를 인셉션 구조라 한다.



-

인셉션 구조는 크기가 다른 필터와 풀링을 여러 개 적용하여 그 결과를 결합한다.

이 인셉션 구조를 하나의 빌딩 블록으로(구성요소)로 사용하는 것이 GoogLeNet 의 특징이다.

또 이 녀석은 1X1 크기의 필터를 사용한 합성곱 계층을 많은 곳에서 사용한다.

이 1X1 의 합성곱 연산은 채널 쪽으로 크기를 줄이는 것으로, 매개변수 제거와 고속 처리에 기여한다.




8.2.4. ResNet


-

ResNet(Residual Network)은 마이크로소프트의 팀이 개발한 네트워크이다.

그 특성은 지금까지보다 층을 깊게 할 수 있는 특별한 ‘장치’에 있다.


지금까지 층을 깊게 하는 것이 성능 향상에 중요하다는 건 알고 있었다. 그러나 딥러닝의 학습에서 층이 지나치게 깊으면 학습이 잘 되지 않고, 오히려 성능이 떨어지는 경우도 많았다.

ResNet 에서는 그런 문제를 해결하기 위해서 스킵 연결(skip connection)을 도입한다.

이 구조가 층의 깊이에 비례해 성능을 향상시킬 수 있게 한 핵심이다. (여전히 층을 깊게 하는 데 한계는 있다.)



-

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

이 구조가 역전파 때 신호 감소를 막아주어 층이 깊어져도 학습을 효율적으로 할 수 있게 해준다.



-

스킵 연결은 입력 데이터를 ‘그대로’ 흘리는 것으로, 역전파 때도 상류의 기울기를 그대로 하류로 보낸다.

여기서의 핵심은 상류의 기울기에 아무런 수정도 가하지 않고 ‘그대로’ 흘린다는 것이다.

그래서 스킵 연결로 기울기가 작아지거나 지나치게 커질 걱정 없이 앞 층에 '의미 있는 기울기’가 전해지리라 기대할 수 있다.

층을 깊게 할수록 기울기가 작아지는 소실 문제를 이 스킵 연결이 줄여주는 것이다.



-

ResNet 은 VGG 신경망을 기반으로 스킵 연결을 도입하여 층을 깊게 했다.

ResNet 은 합성곱 계층을 2개 층마다 건너뒤면서 층을 깊게 한다.

실험 결과 150층 이상으로 해도 정확도가 오르는 모습을 볼 수 있었고, ILSVRC 대회에서 톱-5 오류율이 겨우 3.5% 라는 경이적인 결과를 냈다.



-

이미지넷이 제공하는 거대한 데이터셋으로 학습한 가중치 값들이 실제 제품에 활용해도 효과적이고, 또 많이들 그렇게 이용하고 있다.

이를 전이 학습(transfer learning)이라고 해서, 학습된 가중치(혹은 그 일부)를 다른 신경망에 복사한 다음, 그 상태로 재학습을 수행한다.

예를 들어 VGG 와 구성이 같은 신경망을 준비하고, 미리 학습된 가중치를 초깃값으로 설정한 후, 새로운 데이터셋을 대상으로 재학습(fine tuning)을 수행한다.

전이 학습은 보유한 데이터셋이 적을 때 특히 유용한 방법이다.






8.3. 더 빠르게 (딥러닝 고속화)


-

과거에는 딥러닝의 연산을 주로 CPU 가 담당했으나, 현재는 대부분 GPU(Graphics Processing Unit)을 활용해 대량의 연산을 고속으로 처리할 수 있다.

최근 프레임워크에서는 학습을 복수의 GPU 와 여러 기기로 분산 수해하기 시작했다.




8.3.1. 풀어야 할 숙제


-

AlexNet에서는 오랜 시간을 합성곱 계층에서 소요한다.

실제로 합성곱 계층의 처리 시간을 다 더하면 GPU 에서는 전체의 95%, CPU 에서는 전체의 89% 까지 달한다.

그래서 합성곱 계층에서 이뤄지는 연산을 어떻게 고속으로 효율적으로 하느냐가 딥러닝의 과제이다.



-

합성곱 계층에서 수행하는 연산은 단일 곱셈-누산이다.

그래서 딥러닝 고속화라는 주제는 대량의 단일 곱셈-누산 을 어떻게 고속으로 효율적으로 계산하느냐이다.




8.3.2. GPU 를 이용한 고속화


-

GPU 로 범용 수치연산을 수행하는 것을 GPU 컴퓨팅이라고 한다.

딥러닝에서는 대량의 단일 곱셈-누산(또는 큰 행렬의 내적)을 수행해야 한다.

이러한 대량 병렬 연산은 GPU 의 특기다. ( 반대로 CPU 는 연속적인 복잡한 계산을 잘 처리한다. )

그래서 딥러닝 연산에서는 GPU 를 이용하면 CPU 만 쓸 때보다 놀라울 정도로 빠르게 결과를 얻을 수 있다.



-

테스트 결과 CPU 에서 40일 걸리는 일이 GPU 에서는 6일까지 단축될 수 있다.



-

GPU 는 주로 엔비디아와 AMD 두 회사가 제공한다.

두 회사의 GPU 모두 범용 수치 연산에 이용할 수 있지만, 딥러닝과 더 친한 쪽은 아직까지는 엔비디아이다.

실제로 대부분의 딥러닝 프레임워크는 엔비디아 GPU 에서만 혜택을 받을 수 있다.

CUDA 라는 엔비디아의 GPU 컴퓨팅용 통합 개발 환경을 사용하기 때문이다. ( cuDNN 이 CUDA 위에서 동작하는 딥러닝에 최적화된 함수가 구현된 라이브러리 )



-

합성곱 계층에서 행하는 연산은 im2col 을 이용해 큰 행렬의 내적으로 변환할 수 있었다.

이러한 im2col 의 방식은 GPU 로 구현하기에도 적합하다.

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

im2col 로 거대한 행렬의 내적으로 한 번에 계산하여 GPU 의 잠재력을 끌어내는 것이다.




8.3.3. 분산 학습


-

GPU 로 딥러닝 연산을 꽤 가속할 수 있었지만, 그래도 심층 신경망에서는 학습에 며칠 혹은 몇 주가 걸리기도 한다.

그리고 딥러닝은 많은 시행착오를 동반한다.

뛰어난 신경망을 만들려면 시험을 수없이 반복해야 하고, 그러려면 1회 학습에 걸리는 시간을 최대한 단축하고 싶다는 요구가 필연적으로 생겨난다.

그래서 딥러닝 학습을 수평 확장(scale out)하자는 아이디어(‘분산 학습’)가 중요해진다.



-

딥러닝 계산을 더욱 고속화하고자 다수의 GPU 와 기기로 계산을 분산하기도 한다.

최근 다수의 GPU 와 컴퓨터를 이용한 분산 학습을 지원한 딥러닝 프레임워크들이 나타나고 있다.

그 중에서도 구글의 텐서플로와 마이크로소프트의 CNTK(Computational Network Toolkit)는 분산 학습에 역점을 두고 개발하고 있다.

거대한 데이터센터의 저지연, 고처리량(low latency, high throughput) 네트워크 위에서 이들 프레임워크가 수행하는 분산 학습은 놀라운 효과를 보인다.



-

분산 학습에서 ‘계산을 어떻게 분산시키느냐’는 몹시 어려운 문제이다.

컴퓨터 사이의 통신과 데이터 동기화 등, 쉽게 해결할 수 없는 문제를 얼마든지 끌어안고 있다.

그래서 이런 어려운 문제는 텐서플로 같은 뛰어난 프레임워크에 맡기는 것이 좋다.




8.3.4. 연산 정밀도와 비트 줄이기


-

계산 능력 외에도 메모리 용량과 버스 대역폭 등이 딥러닝 고속화에 병목이 될 수 있다.

메모리 용량 면에서는 대량의 가중치 매개변수와 중간 데이터를 메모리에 저장해야 한다는 것을 생각해야 하고, 버스 대역폭 면에서는 GPU(혹은 CPU)의 버스를 타고 흐르는 데이터가 많아져 한계를 넘어서면 병목이 된다.

이러한 경우를 고려하면 네트워크로 주고받는 데이터의 비트수는 최소로 만드는 것이 바람직하다.


컴퓨터에서는 주로 64비트나 32비트 부동소수점 수를 사용해 실수를 표현한다.

많은 비트를 사용할수록 계산 오차는 줄어들지만, 그만큼 계산에 드는 비용과 메모리 사용량이 늘고 버스 대역폭에 부담을 준다.



-

딥러닝은 높은 수치 정밀도(수치를 몇 비트로 표현하느냐)를 요구하지 않는다.

이는 신경망의 중요한 성질 중 하나로, 신경망의 견고성에 따른 특성이다.

예를 들어 신경망은 입력 이미지에 노이즈가 조금 섞여 있어도 출력 결과가 잘 달라지지 않는 강건함을 보여준다.

이런 견고성 덕분에 긴경망을 흐르는 데이터를 ‘퇴화’ 시켜도 출력에 주는 영향은 적다.



-

컴퓨터에서 실수를 표현하는 방식으로 32비트 단정밀도(single-precision)과 64비트 배정밀도(double-precision) 부동소수점 등의 포맷이 있지만, 지금까지의 실험으로는 딥러닝은 16비트 반정밀도(half-precision)만 사용해도 학습에 문제가 없다고 알려져 있다.

실제로 엔베디아의 최신 GPU 인 파스칼(Pascal)아키텍처는 이 포맷을 지원하여, 이제는 반정밀도 부동소수점이 표준적으로 이용되리라 전망된다.



-

엔비디아의 맥스웰(Maxwell)세대 GPU 는 반정밀도 부동소수점 수를 스토리지로 지원하고 있었지만, 연산 자체는 16비트로 수행하지 않았다.

이것이 파스칼 세대에 와서 연산 역시 16비트로 하기 시작하여, 이전 세대보다 2배 정도 빨라질 것으로 기대한다.



-

파이썬에서는 일반적으로 64비트 double precision 부동소수점 수를 사용한다.

하지만 넘파이는 16비트 반정밀도 부동소수점도 지원하며, 이를 사용해도 정확도가 떨어지지 않는 것을 쉽게 확인할 수 있다.(단, 스토리지로서 16비트라는 틀이 있을 뿐 연산 자체는 16비트로 수행하지 않는다.)



-

딥러닝의 비트 수를 줄이는 연구가 진행되고 있다.

최근에는 가중치와 중간 데이터를 1비트로 표현하는 Binarized Neural Networks 라는 방법도 등장했다.

딥러닝을 고속화하기 위해 비트를 줄이는 기술은 앞으로 주시해야 할 부분이며, 특히 딥러닝을 임베디드용으로 이용할 때 중요한 주제이다.





8.4. 딥러닝의 활용


-

딥러닝은 사물 인식뿐 아니라 온갖 문제에 적용할 수 있다.

이미지, 음성, 자연어 등 수많은 분야에서 딥러닝은 뛰어난 성능을 발휘한다.



8.4.1. 사물 검출


-

사물 검출은 이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술이다.

사물 검출은 사물 인식보다 어려운 문제이다.


사물 인식은 이미지 정체를 대상으로 했지만, 사물 검출에서는 이미지 어딘가에 있을 사물의 위치까지 알아내야 한다.

데가가 한 이미지에 여러 사물이 존재할 수도 있다.



-

R-CNN(Regions with Convolutional Neural Network) 가 사물 검출에 유명한 네트워크이다.

R-CNN 은 “후보 영역 추출” 과 CNN 특징 계산이라는 특징이 있다.

먼저 사물이 위치한 영역을 찾아내고, 추출한 각 영역에 CNN 을 적용하여 클래스를 분류하는 것이다.

여기서 이미지를 사각형으로 변형하거나 분류할 때 서포트 백터 머신(SVM)을 사용하는 등 실제 처리 흐름은 다소 복잡하지만, 큰 틀에서는 이들 두 처리(후보 영역 추출과 CNN 특징 계산)로 구성된다.



-

후보 영역 추출(사물처럼 보이는 물체를 찾아 처리)에는 컴퓨터 비전 분야에서 발전해온 다양한 기법을 사용할 수 있고, R-CNN 논문에서는 Selective Search 기법을 사용했다.

최근에는 이 후보 영역 추출까지 CNN 으로 처리하는 Faster R-CNN 기법도 등장했다.

Faster R-CNN 은 모든 일을 하나의 CNN 에서 처리하기 때문에 아주 빠르다.




8.4,2. 분할


-

분할(segmentation)이란 이미지 픽셀 수준에서 분류하는 문제이다.

픽셀 단위로 채색된 지도(supervised)데이터를 사용해 학습한다.

그리고 추론할 때 입력 이미지의 모든 픽셀을 분류한다.



-

신경망을 이용해 분할하는 가장 단순한 방법은 모든 픽셀 각각을 추론하는 것이다.

예를 들어 어떤 직사각형 영역의 중심 픽셀의 클래스를 분류하는 신경망을 만들어서, 모든 픽셀을 대상으로 하나씩 추론 작업을 실행한다.

이런 식으로는 픽셀의 수만큼 forward 처리를 해야 하여 긴 시간이 걸리게 된다.(합성곱 연산에서 많은 영역을 쓸데없이 다시 계산)

이러한 낭비를 줄여주는 기법으로 FCN (Fully Convolutional Network)가 고안되었다.

이는 단 한번의 forward 처리로 모든 픽셀의 클래스를 분류해주는 놀라운 기법이다.


FCN 은 직역하면 “합성곱 계층만으로 구성된 네트워크” 이다.

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

FCN 에서는 공간 볼륨을 유지한 채 마지막 출력까지 처리할 수 있다.



-

FCN 에서는 마지막에 공간 크기를 확대하는 처리를 도입했다는 것도 특징이다.

FCN 의 마지막에 수행하는 확대는 이중 선형 보간(bilinear interpolation)에 의한 선형 확대이다.

FCN 에서는 이 선형 확대를 역합성곱(deconvolution) 연산으로 구현해내고 있다.



-

완전연결 계층에서는 출력이 모든 입력과 연결된다. 이와 같은 구성을 합성곱 계층으로도 구현할 수 있다.

가령 입력 크기가 32X10X10 인 데이터에 대한 완전연결 계층은 필터 크기가 32X10X10 인 합성곱 계층으로 대체할 수 있다.

만약, 완전연결 계층의 출력 노드가 100개라면 합성곱 계층에서는 기존의 32X10X10 필터를 100개 준비하면 완전히 같은 처리를 할 수 있다.




8.4.3. 사진 캡션 생성


-

딥러닝으로 사진 캡션을 생성하는 방법으로는 NIC(Neural Image Caption) 모델이 대표적이다.

이는 심층 CNN과 자연어를 다루는 순환 신경망(Recurrent Nueral Network, RNN)으로 구성된다.

RNN 은 순환적 관계를 갖는 신경망으로 자연어나 시계열 데이터 등의 연속된 데이터를 다룰 때 많이 활용한다.


NIC 는 CNN 으로 사진에서 특징을 추출하고, 그 특징을 RNN 에 넘긴다.

RNN 은 CNN 이 추출한 특징을 초기값으로 해서 텍스트를 “순환적” 으로 생성한다.

기본적으로 NIC 는 신경망(CNN 과 RNN)을 조합한 간단한 구성이다.



-

사진이나 자연어와 같은 여러 종류의 정보를 조합하고 처리하는 것을 멀티모달 처리(multimodal processing)라고 하여, 최근 주목받는 분야 중 하나이다.






8.5. 딥러닝의 미래


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


-

딥러닝을 활용해 화가처럼 그림을 그리는 연구가 있다.

두 이미지를 입력해서 새로운 그림을 생성하는 연구이다.

하나는 컨텐츠 이미지, 다른 하나는 스타일 이미지라 부르는데, 이 둘을 조합해 새로운 그림을 그린다.


이 기술은 네트워크의 중간 데이터가 콘텐츠 이미지의 중간 데이터와 비슷해지도록 학습한다.

이렇게 하면 입력 이미지를 콘텐츠 이미지의 형태로 흉내낼 수 있다.

또, 스타일 이미지의 화풍을 흡수하기 위해 ‘스타일 행렬’ 이라는 개념을 도입한다.

그 스타일 행렬의 오차를 줄이도록 학습하여 입력 이미지를 입력된 화풍으로 만드는 것이다.




8.5.2. 이미지 생성


-

아무런 입력 이미지 없이도 새로운 이미지를 그려내는 연구도 진행 중이다.

물론 먼저 대량의 이미지를 사용하여 학습하긴 하지만, 학습이 끝난 후에는 아무런 입력 이미지 없이도 새로운 그림을 그려낸다.

가령 딥러닝으로 ‘침실’ 이미지를 무로부터 생성하는 게 가능하다.

DCGAN(Deep Convolutional Generative Adversarial Network) 기법으로 생성 가능하다.



-

DCGAN 도 딥러닝을 사용한다.

DCGAN 기술의 핵심은 생성자(Generator)와 식별자(Discriminator)로 불리는 2개의 신경망을 이용한다는 점이다.

생성자가 진짜와 똑같은 이미지를 생성하고 식별자는 그것이 진짜인지를 판정한다.

그렇게 해서 둘을 겨루도록 학습시켜, 생성자는 더 정교한 가짜 이미지 생성 기술을 학습하고 식별자는 더 정확하게 간파할 수 있는 감정사로 성장하는 것이다.

이렇게 둘의 능력을 부지런히 갈고닦게 한다는 개념이 GAN(Generative Adversarial Network) 기술의 재미난 점이다.



-

이전까지 살펴본 기계학습 문제는 지도 학습(supervised learning)이라는 유형의 문제였다.

지도 학습은 손글씨 숫자 인식처럼 이미지 데이터와 정답 레이블을 짝지은 데이터셋을 이용한다.

그러나 지금 다루는 내용은 지도용 데이터는 주어지지 않고, 단지 대량의 이미지(이미지의 집합)만 주어진다.

즉 지도 없이 스스로 학습하는 자율 학습(unsupervised learning)문제이다.

자율 학습은 비교적 오래전부터 연구된 분야지만(Deep Belief Network 와 Deep Boltzmann Machine 이 대표적) 최근에는 그다지 활발하게 연구되지 않는 느낌이다.

그러나 DCGAn 과 같은 기법이 시선을 끌면서 앞으로 자율 학습도 새로운 도약을 기대할 수 있을 전망이 보인다.




8.5.3. 자율 주행


-

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

이미지를 분할(픽셀 수준에서 판정)한다.




8.5.4. Deep Q-Network(강화 학습)


-

사람이 시행착오를 겪으며 배우듯 컴퓨터도 시행착오 과정에서 스스로 학습하게 하려는 분야가 있다.

가르침에 의존하는 지도 학습과는 다른 분야로, 강화 학습(reinforcement learning)이라 한다.



-

강화학습에서는 에이전트라는 것이 환경에 맞게 행동을 선택하고, 그 행동에 의해서 환경이 변한다는 게 기본적인 틀이다.

환경이 변화하면 에이전트는 어떠한 보상을 얻는다.

강화 학습의 목적은 더 나은 보상을 받는 쪽으로 에이전트의 행동 지침을 바로잡는 것이다.


여기에서 보상은 정해진 것이 아니라 “예상 보상” 이다.

예를 들어 슈퍼 마리오에서 마리오를 오른쪽으로 이동했을 때 얻는 보상이 항상 명확한 것은 아니다.

어떤 상황에서 이동한 것이냐에 따라 보상은 천차만별이 될 수 있다.

이런 불명확한 상황에서는 게임 점수나 게임 종료 등의 명확한 지표로부터 역산해서 “예상 보상” 을 정해야 한다.



-

딥러닝을 사용한 강화학습 중 Deep Q-Network(일명 DQN)라는 방법이 있다.

이는 Q 학습이라는 강화학습 알고리즘을 기초로 한다.

Q 학습에서는 최적 행동 가치 함수로 최적인 행동을 정한다.

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


DQN 연구 중에는 비디오 게임을 자율 학습시켜 사람을 뛰어넘는 수준의 조작을 실현한 사례가 보고되고 있다.

DQN 에서 사용하는 CNN 은 게임 영상 프레임(4개의 연속한 프레임)을 입력하여 최종적으로는 게임을 제어하는 움직임(조이스틱 이동량이나 버튼 조작 여부)에 대하여 각 동작의 “가치”를 출력한다.



-

그동안의 비디오 게임 학습에서는 게임의 상태(캐릭터 위치 등)는 미리 추출하는 것이 보통이었다.

그러나 DQN 에서의 입력 데이터는 비디오 게임의 영상 뿐이다.

이는 DQN 의 주목할 점으로, DQN 의 응용 가능성을 현격히 높였다고 할 수 있다.

게임마다 설정을 바꿀 필요없이 단순히 DQN 에 게임 영상을 보여주기만 하면 되기 때문이다.



-

알파고에도 딥러닝과 강화학습이 이용되었다.

알파고는 3,000만 개의 프로 기보를 보며 학습한 후, 알파고 스스로 자신과 맞붙는 대결을 반복하면서 수련했다.

또한 알파고와 DQN 은 모두 구글이 인수한 딥마인드(Deep Mind)가 진행한 연구이다.





8.6. 정리


-

수많은 문제에서 신경망을 더 깊게 하여 성능을 개선할 수 있다.

이미지 인식 기술 대회인 ILSVRC 에서는 최근 딥러닝 기반이 상위권을 독점하고 있으며, 그 깊이도 더 깊어지는 추세다.

유명한 신경망으로는 VGG, GoogLeNet, ResNet 이 있다.

GPU 와 분산 학습, 비트 정밀도 감소 등으로 딥러닝을 고속화할 수 있다.

딥러닝(신경망)은 사물 인식뿐 아니라 사물 검출과 분할에도 이용할 수 있다.

딥러닝의 응용 분야로는 사진의 캡션 생성, 이미지 생성, 강화학습 등이 있다. 최근에는 자율 주행에도 딥러닝을 접목하고 있어 기대된다.




반응형

댓글