8.1 더 깊게
그동안 배운 기술을 집약하고 심층 신경망을 만들어서 MNIST데이터셋의 손글씨 숫자 인식에 도전해보자.
8.1.1 더 깊은 신경망으로
여기서 사용하는 합성곱 계층은 모두 3x3 크기의 작은 필터로, 층이 깊어지면서 채널 수가 더 늘어나는 것이 특징이다. 가중치 초깃값으로는 He 초깃값, 파라미터 갱신에는 Adam을 사용한다. 이 신경망의 정확도는 99.38%가 된다.
8.1.2 정확도를 더 높이려면
데이터 확장(data augmentation)은 입력 이미지를 알고리즘을 통해 인위적으로 확장하는 것이다.
위와 같은 변형 외에도 crip 이나 flip등이 있다. 밝기 변화, 확대, 축소도 효과적이다.
8.1.3 깊게 하는 이유
층을 깊게 할 때의 이점으로는 신경망의 파라미터 수가 줄어든다는 것이다. 층을 깊게 한 신경망은 깊지 않은 경우보다 적은 파라미터로 같은 (혹은 그 이상)수준의 표현력을 달성할 수 있다.
여기서 잘 봐야 할 점은 출력 데이터의 각 노드가 입력 데이터의 어느 영역으로부터 왔는지 이다. 위 이미지에서 각 출력 노드는 입력 데이터의 5x5 크기 영역에서 계산된다.
이어서 아래 처럼 합성곱 연산을 2회 반복한다면, 아래와 같다.
5x5 합성곱 연산 1회는 3x3 합성곱 연산을 2회 수행하여 대체할 수 있다. 전자의 파라미터 수가 25개인 반면, 후자는 총 18개이다. 파라미터 수는 층을 반복할수록 적어진다.
층을 깊게 하면 더 효율적으로 학습할 수 있고, 정보를 계층적으로 전달할 수 있다.
8.2 딥러닝의 초기 역사
8.2.1 이미지넷
이미지넷은 100만장이 넘는 이미지를 담고 있는 데이터셋이다. 아래 그림과 같이 다양한 종류의 이미지를 포함하며, 각 이미지에는 레이블이 붙어 있다.
매년 열리는 ILSVRC는 이 데이터셋을 사용하여 치뤄지는 이미지 인식 기술 대회이다. ILSVRC대회의 시험 항목 중 하나는 분류이다. 분류 부문에서는 1,000개의 클리스를 제대로 분류하는지를 평가한다. 아래는 2010년부터 2015년까지 ILSVRC의 분류 부분 우승팀의 성적이다.
2012년 이후 선두는 항상 딥러닝 방식이다. 2012년 AlexNet이 오류율을 크게 낮췄고, 그 후 딥러닝을 활용한 기법이 꾸준히 정확도를 개선해왔다. 2015년에는 150층이 넘는 심층 신경망인 ResNet이 오류율을 3.5%까지 낮췄다. 이 수치는 일반적인 인간의 인식 능력을 넘어선 것이다. 이어서 세 가지 유명한 신경망인 VGG, GoogLeNet, ResNet을 조금 더 자세히 살펴보겠다.
8.2.2 VGG
VGG는 합성곱 계층과 풀링 계층으로 구성되는 기본적인 CNN이다. 다만, 비중 있는 층(합성곱 계층, 완전연결 계층)을 모두 16층(혹은 19층)으로 심화한 것이 특징이다.
VGG에서는 3x3 필터를 사용한 합성곱 계층을 연속으로 거친다. 그림에서 보듯 합성곱 게층을 2~4회 연속으로 풀링 계층을 두어 크기를 절반으로 줄이는 처리를 반복한다. 마지막에는 완전연결 계층을 통과시켜 결과를 출력한다.
VGG는 2014년 대회에서 2위를 했다. 1위는 뒤에 배울 GoogLeNet이다. 그러나 VGG는 구성이 간단하여 응용하기 좋기 때문에 많은 사람들이 VGG기반의 신경망을 즐겨 사용한다.
8.2.3 GoogLeNet
GoogLeNet의 구성은 다음과 같다. 그림의 사각형이 합성곱 계층과 풀링 계층 등의 게층을 나타낸다.
그림에서는 구성이 매우 복잡해보이지만, 기본적으로는 지금까지 본 CNN과 다르지 않다. 단, GoogLeNet은 세로 방향 깊이도 깊고 가로 방향도 깊다는 점이 특징이다.
GoogLeNet에는 가로방향의 '폭'이 있다. 이를 인셉션 구조라고 하며, 다음과 같다.
위와 같이 크기가 다른 필터와 풀링을 여러 개 적용하여 그 결과를 결합한다. 이 인셉션 구조를 하나의 빌딩 블록으로 사용하는 것이 GoogLeNet의 특징이다. 또한, 1x1 필터를 사용한 합성곱 계층을 많은 곳에서 사용한다. 이 1x1 합성곱 연산은 채널 쪽으로 크기를 줄이는 것으로, 파라미터 제거와 고속 처리에 기여한다.
8.2.4 ResNet
ResNet은 마이크로소프트 팀이 개발한 네트워크로, 배니싱 그라디언트 문제를 스킵 커넥션을 도입하여 해결한 것이 특징이다. 스킵 커넥션은 아래 그림과 같이 입력 데이터를 합성곱 계층을 건너뛰어 출력에 바로 더하는 구조를 말한다.
입력 x를 연속한 두 합성곱 계층을 건너뛰어 출력에 바로 연결한다. 스킵 커넥션으로 인해 출력이 F(x) + x 이 되는 것이 핵심이다.
RsNet은 VGG 신경망을 기반으로 스킵 커넥션을 도입하여 층을 깊게 했다.
위와 같이 ResNet은 합성곱 게층을 2개 층마다 건너뛰면서 층을 깊게 한다. 실험 결과 150층 이상으로 해도 정확도가 올랐으며, ILSVRC대회에서는 탑 5 오류율이 3.5%밖에 나오지 않은 좋은 결과를 냈다.
8.3 더 빠르게(딥러닝 고속화)
실제 딥러닝 프레임워크 대부분은 GPU를 활용해 대량의 연산을 고속으로 처리할 수 있다. 최근 프레임워크에서는 학습을 복수의 GPU와 여러 기기로 분산 수행하기 시작했다.
8.3.1 풀어야 할 숙제
딥러닝의 고속화 얘기를 하기 전, 딥러닝에서 어떠한 처리에 시간이 소요되는지를 보자. 아래 그림은 AlexNet의 forward처리에서 각 층이 소비하는 시간을 원 그래프로 나타낸 것이다.
AlexNet은 오랜 시간을 합성곱 계층에서 소요함을 알 수 있다. 합성곱 계층의 처리 시간을 다 더하면 GPU에서는 95%, CPU에서는 89%까지 차지한다. 합성곱 계층에서 이뤄지는 연산을 효율적으로 하는 것이 딥러닝의 과제이다. 위 그래프는 추론 때의 결과지만, 학습 시에도 마찬가지로 합성곱 계층에서 많은 시간을 소비한다.
8.3.2 GPU를 활용한 고속화
딥러닝에서는 대량의 단일 곱셉-누산 또는 큰 행렬의 곱을 수행해야 한다. 이러한 대량 병렬 연산은 GPU의 특기이기 때문에 딥러닝 연산에서 GPU를 사용하면 CPU만 쓸 때보다 놀라울 정도로 빠르게 결과를 얻을 수 있다.
CPU로는 40여일이 걸리나 GPU로는 6일까지 단축되었다. 또, cuDNN이라는 딥러닝에 최적화된 라이브러리를 이용하면 더 빨라진 것을 확인할 수 있었다.
8.3.3 분산 학습
GPU로 딥러닝 연산을 꽤 가속할 수 있지만, 그래도 심층 신경망에서는 학습에 며칠 혹은 몇 주가 걸리기도 한다. 그래서 더욱 고속화하고자 다수의 GPU와 기기로 계산을 분산하기도 한다. 분산 학습까지 더하면 아래와 같이 학습도 빨라진다.
8.3.4 연산 정밀도와 비트 줄이기
계산 능력 외에도 메모리 용량과 버스 대역폭 등이 딥러닝 고속화에 병목이 될 수 있다. 이러한 경우를 고려하면 네트워크로 주고받는 데이터의 비트 수는 최소로 만드는 것이 바람직하다.
컴퓨터에서는 주로 64비트나 32비트 부동소수점 수를 사용해 실수를 표현한다. 다행히 딥러닝은 높은 수치 정밀도를 요구하지 않는다. 따라서 16비트 반정밀도(half-precision)만 사용해도 학습에 문제가 없다고 알려져 있다.
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from deep_convnet import DeepConvNet
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False)
network = DeepConvNet()
network.load_params("deep_convnet_params.pkl")
sampled = 10000 # 고속화를 위한 표본추출
x_test = x_test[:sampled]
t_test = t_test[:sampled]
print("caluculate accuracy (float64) ... ")
print(network.accuracy(x_test, t_test))
# float16(반정밀도)로 형변환
x_test = x_test.astype(np.float16)
for param in network.params.values():
param[...] = param.astype(np.float16)
print("caluculate accuracy (float16) ... ")
print(network.accuracy(x_test, t_test))
8.4 딥러닝의 활용
8.4.1 사물 검출
사물 검출은 사물 인식보다 어려운 문제이다. CNN을 이용하여 사물 검출을 수행하는 방식은 몇 가지가 있다. 그 중 R-CNN이 유명하다.
8.4.2 분할
분할(segmentation)이란 이미지를 픽셀 수준에서 분류하는 문제이다.
신경망을 이용해 분할하는 가장 단순한 방법은 모든 픽셀을 각각 추론하는 것이다. 그러나 이 방법은 픽셀의 수만큼 forward처리를 해야해서 긴 시간이 걸리게 된다. 이러한 낭비를 줄여주는 기법으로 FCN(Fully Convolutional Network)이 있다.
8.4.3 사진 캡션 생성
딥러닝으로 사진 캡션을 생성하는 방법으로는 NIC모델이 대표적이다. NIC는 심층 CNN과 자연어를 다루는 RNN으로 구성된다.
8.5 딥러닝의 미래
8.5.1 이미지 스타일(화풍) 변환
두 이미지를 입력하여 새로운 그림을 생성하는 연구. 하나는 '콘텐츠 이미지', 다른 하나는 '스타일 이미지'라고 부른다.
네트워크의 중간 데이터가 콘텐츠 이미지의 중간 데이터와 비슷해지도록 학습한다. 또 스타일 이미지의 화풍을 흡수하기 위해 '스타일 행렬'이라는 개념을 도입한다. 그 스타일 행렬의 오차를 줄이도록 학습하여 입력 이미지를 고흐의 화풍과 비슷해지게 만들 수 있는 것이다.
8.5.2 이미지 생성
딥러닝으로 이미지를 무로부터 생성하는 것이 가능하다.
DCGAN 기술의 핵심은 생성자와 식별자로 불리는 2개의 신경망을 이용한다는 점이다. 생성자가 진짜와 똑같은 이미지를 생성하고 식별자는 그것이 진짜인지를 판정한다. 그렇게 둘을 겨루도록 학습시켜서 생서자는 더 정교한 가짜 이미지 생성 기술을 학습하고 식별자는 더 정확하게 간파할 수 있는 감정사로 성장하여 둘의 능력이 갈고닦아진다는 점이 재미있는 컨셉이다.
8.5.3 자율 주행
SegNet이라는 CNN 기반 신경망은 아래 그림과 같이 주변 환경을 정확하게 인식해낸다.
8.5.4 Deep Q-Network(강화학습)
강화학습에서는 에이전트가 환경에 맞게 행동을 선택하고, 그 행동에 의해서 환경이 변한다는 것이 기본적인 틀이다. 환경이 변화하면 에이전트는 보상을 받는다. 에이전트는 보상을 받기 위해 행동지침을 바로잡는다.
여기서 주의점은 보상은 정해진 것이 아니라 '예상 보상'이라는 것이다. 어떤 상황에서 한 행동이냐에 따라 보상은 달라질 수 있다.
딥러닝을 사용한 강화학습 중 Deep Q-Network는 Q학습이라는 강화학습 알고리즘을 기초로 한다. Q학습에서의 최적 행동 가치 함수를 딥러닝(CNN)으로 비슷하게 흉내내어 사용하는 것이 DQN이다.
DQN은 구성을 변경하지 않고도 팩맨과 아타리 같은 많은 게임을 학습할 수 있으며 심지어 사람보다 더 뛰어난 성적을 거두고 있다.
8.6 정리
- 수많은 문제에서 신경망을 더 깊게 하여 성능을 개선할 수 있다.
- 이미지 인식 기술 대회인 ILSVRC에서는 최근 딥러닝 기반 기법이 상위권을 독점하고 있으며, 그 깊이도 더 깊어지는 추세다.
- 유명한 신경망으로는 VGG, GoogLeNet, ResNet이 있다.
- GPU와 분산 학습, 비트 정밀도 감소 등으로 딥러닝을 고속화할 수 있다.
- 딥러닝(신경망)은 사물 인식뿐 아니라 사물 검출과 분할에도 이용할 수 있다.
- 딥러닝의 응용 분야로는 사진의 캡션 생성, 이미지 생성, 강화학습 등이 있다. 최근에는 자율 주행에도 딥러닝을 접목하고 있어 기대된다.
'ML & DL > 책 & 강의' 카테고리의 다른 글
[밑시딥2] CHAPTER 2 자연어와 단어의 분산 (0) | 2023.07.05 |
---|---|
[밑시딥2] CHAPTER 1 신경망 복습 (0) | 2023.07.03 |
[밑시딥1] CHAPTER 7 합성곱 신경망(CNN) (1) | 2023.06.26 |
[밑시딥1] CHAPTER 6 학습 관련 기술들 (0) | 2023.06.21 |
[밑시딥 1] CHAPTER 5 오차역전파법 (0) | 2023.06.18 |
댓글