케라스 창시자에게 배우는 딥러닝_3장

코넬·2022년 11월 29일
0

DeepLearning_Keras

목록 보기
3/13
post-thumbnail

신경망의 구조

신경망 훈련에는 다음과 같은 요소들이 필요합니다.

  • 네트워크(혹은 모델)을 구성하는 층
  • 입력 데이터와 이에 상응하는 타깃
  • 학습에 사용할 피드백 신호를 정의하는 손실 함수
  • 학습 진행 방식을 결정하는 옵티마이저(optimizer)

이들이 어떻게 상호작용 하는지 아래 이미지에서 확인할 수 있습니다.

  1. 연속된 층으로 구성된 네트워크가 입력 데이터를 예측을 통해 mapping
  2. 손실 함수는 예측과 타깃을 비교하여 네트워크의 기댓값이 얼마나 잘 맞는지를 측정하는 손실 값을 만든다.
  3. 옵티마이저는 손실 값을 사용하여 네트워크 가중치를 update

층 : 딥러닝의 구성 단위

은 하나 이상의 tensor를 입력으로 받아 하나 이상의 tensor를 출력하는 데이터 처리 모듈을 말한다.
대부분의 층은 가중치 라는 층의 상태를 가진다. 여기서 가중치 란 확률적 경사 하강법에 의해 학습되는
하나 이상의 tensor이며, 이 곳에 학습한 지식이 담긴다.

층 마다 적절한 텐서 포맷과 데이터 처리 방식이 다르다!

  • 2D 텐서 : 완전 연결 층(fully connected layer) 또는 밀집 층(dense layer)로 불리는 밀집 연결층(densely connected layer)
  • 3D 텐서 : LSTM과 같은 순환 층(recurrent layer)
  • 4D 텐서 : 2D 합성곱 층(convolution layer)

여기서 케라스는 프레임워크로, 이로 인해 층을 딥러닝의 레고 블록처럼 생각할 수 있다.
케라스에서는 호환 가능한 층들을 엮어 데이터 변환 파이프라인(pipeline)을 구성함으로써, 딥러닝 모델을 만든다.
여기서 층 호환성(layer compatibility)이란 각 층이 특정 크기의 입력 텐서만 받고 특정 크기의 출력 텐서를 반환한다는 사실을 말합니다.

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32. input_shape=(784,))) #첫번째 차원
model.add(layer.Dense(10)) #두번째 층

첫번째 차원이 784인 2D 텐서만 입력받는 층을 만든다.(배치 차원이 0번째인 축은 지정하지 않기 때문에, 어떤 배치 크기도 입력으로 받을 수 있다.) 이 후 32로 변환된 텐서를 출력한다.
이 입력층은 32차원의 벡터를 입력으로 받는 하위 층이 연결되어야한다.

여기서 케라스는 모델에 추가된 층을 자동으로 상위 층의 크기에 맞춰주기에 호환성 걱정 ❌❌ !!

두번째 층에서는 input_shape매개변수를 지정하지 않고, 앞선 출력 크기를 입력 크기로 자동으로 채택한다.

모델 : 층의 네트워크

딥러닝 모델은 층으로 만든 비순환 유향 프래프(Directed Acyclic Graph, DAG)이다. 하나의 입력을 하나의 출력으로 mapping하는 층을 순서대로 쌓는 것 하지만 이후 다양한 네트워크 구조를 볼 수 있다.

  • 가지(branch)2개인 네트워크
  • 출력여러 개인 네트워크
  • 인셉션(Inception) 블록

네트워크는 가설 공간(hypothesis space)을 정의한다. 네트워크 구조를 선택함으로써 가능성 있는 공간을 입력 데이터에서 출력 데이터로 매핑하는 일련의 특정 텐서 연산으로 제한한다. 여기서 찾아야 할 것은 텐서 연산에 포함된 가중치 텐서의 좋은 값이 된다.

손실 함수와 옵티마이저 : 학습 과정을 조절하는 열쇠

네트워크 구조를 정의한 후, 두가지를 더 선택해야하는데,

  • 손실함수(loss function) 또는 목적 함수(objective function) : 훈련하는 동안 최소화될 값, 문제에 대한 성공 지표
  • 옵티마이저(optimizer) : 손실 함수를 기반으로 네트워크가 어떻게 업데이트될지 결정, 특정 종류의 확률적 경가 하강법(SGD) 구현

여러 개의 출력을 내는 신경망은 여러 개의 손실 함수를 가질 수 있다.(출력당 하나씩) 하지만 경사 하강법 과정은 하나의 스칼라 손실값을 기준으로 한다. 따라서 손실이 여러 개인 네트워크에서는 모든 손실이 ( 평군을 내서 ) 하나의 스칼라 양으로 합쳐진다.

문제에 맞는 올바른 목적 함수를 선택하는 것은 아주 중요
예를 들어 "모든 인류의 평균 행복 지수를 최대화하기" 잘못된 목적 함수로 훈련된 AI가 있다고 가정
문제를 해결하기 위해 행복 지수가 낮은 모든 사람을 죽여서 행복 지수를 최대화할 수 있습니다. 이는 의도한 바가 아닙니다.
이렇듯 우리가 만든 모든 신경망은 단지 손실 함수를 최소화하기만 한다는 것을 기억해야한다. 목적 함수를 현명하게 선택하지 않으면 원하지 않는 부수 효과가 발생할 것이다.

회귀와 시퀀스 예측 같은 일반적인 문제에서는 올바른 손실 함수를 선택하는 간단한 지침이 있습니다.

  • 2개의 클래스가 있는 분류 : 이진 크로스엔트로피(binary crossentropy)
  • 여러 개의 클래스가 있는 분류 : 범주형 크로스엔트로피(categorical crossentropy)
  • 회귀 문제 : 평균 제곱 오차
  • 시퀀스 학습 문제 : CTC(Connection Temporal Classification)

케라스 개요

케라스의 특징

  • 동일한 코드로 CPU와 GPU에서 실행
  • 사용하기 쉬운 API를 가지고 있어 딥러닝 모델의 프로토타입을 빠르게 만듬
  • 합성곱 신경망, 순환 신경망을 지원하며 이 둘을 자유롭게 조합하여 사용
  • 다중 입력이나 다중 출력 모델, 층의 공유, 모델 공유 등 어떤 네트워크 구조도 만들 수 있음

케라스는 딥러닝 모델을 만들기 위한 고수준의 구성 요소를 제공하는 모델 수준의 라이브러리입니다. 텐서 조작이나 미분 같은 저수준의 연산을 다루지 않습니다. 대신 케라스의 백엔드 엔진에서 제공하는 최적화되고 특화된 텐서 라이브러리를 사용합니다. 즉 여러 딥러닝용 라이브러리를 조합하여 사용하는 것입니다.

케라스에는 다음 백엔드 엔진을 필요에 따라서 선택하여 사용할 수 있습니다. 다음 벡엔드를 사용하기에 CPU와 GPU에서 모두 사용할 수 있습니다. CPU에서는 저수준 텐서 연산 라이브러리인 Eigen을, GPU에서는 NVIDIA CUDA 심층 신경망 라이브러리를 사용하여 최적화된 딥러닝 연산 라이브러리를 이용합니다.

케라스 개발의 흐름도

전형적인 케라스 작업 흐름은 다음과 같은 흐름을 지닙니다.

  1. 입력 텐서와 타깃 텐서로 이루어진 훈련 데이터를 정의
  2. 입력과 타깃을 매핑하는 층으로 이루어진 네트워크를 정의
  3. 손실함수, 옵티마이저, 모니터링하기 위한 측정 지표를 선택하여 학습 과정을 설정
  4. 훈련 데이터에 대해 모델의 fit() 메서드를 반복적으로 호출

모델을 정의하는 방법 2가지

Sequential 클래스 : 층을 순서대로 쌓아 올린 네트워크
함수형 API : 임의의 구조를 만들 수 있는 비순환 유향 그래프

# Sequential 사용
from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32,activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))
# 함수형 API
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10,activation='softmax')(x)

함수형 API를 사용하면 모델이 처리할 데이터 텐서를 만들고 마치 함수처럼 이 텐서에 층을 적용
모델 구조가 정의된 후에는 Sequential 모델을 사용했는지 함수형 API를 사용했는지는 상관없습니다.

모델이 정의된 후에는 동일한 단계를 거치게 됩니다. 컴파일 단계에서는 학습 과정이 설정됩니다. 여기서는 옵티마이저, 손실함수, 모니터링에 필요한 측정 지표를 지정합니다. 그리고 마지막에 fit() 메서드에 전달함으로 학습 과정이 이루어집니다.

from keras import optimizers

model.compile(optimizer=optimizers.RMSprop(lr=0.001), 
			loss='mse',
            metrics=[accuracy])

model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)

딥러닝 개발 환경 추천

최신 NVIDIA GPU에서 딥러닝 코드를 실행하는 것을 권장합니다. 특히 합성곱 신경망을 사용한 이미지 처리나 순환 신경망을 사용한 시퀀스 처리 같은 일부 애플리케이션을 CPU에서 실행하면 멀티코어 CPU라도 매우 오래 걸립니다.

  • CPU가 아닌 GPU를 사용하면 보통 2배~10배 정도 속도가 빨라집니다.
  • GPU를 설치하지 않고 대안으로 AWS EC2 GPU 인스턴스나 구글 클라우드 플랫폼을 고려해 볼 수 있습니다.
  • 혹은 구글 코랩(Google Colab)이 있습니다. (추천)
    추가적으로 우분투로 듀얼 부트가 되도록 컴퓨터를 셋팅하는 것입니다. 조금 번거로울 수 있지만 우분투를 사용하면 장기적으로 시간이 절약되고 문제가 발생할 가능성이 적습니다.

주피터 노트북 : 딥러닝 실험을 위한 최적의 방법

특징

  • 노트북 은 주피터 노트북 어플리케이션으로 만든 파일이며 웹 브라우저에서 작성 가능
  • 작업 내용을 기술하기 위해 서식 있는 텍스트 포맷을 지원하며 파이썬 코드 실행 가능
  • 긴 코드를 작게 쪼개 독립적 실행 가능, 대화식 개발 가능
  • 작업 중 잘못되었을 때 이전 코드를 모두 재실행할 필요 없음

추가 : 구글 코랩(Google Colab)

특징

  • 주요 특징은 위의 주피터 노트북과 동일
  • 추가적인 설치가 필요없고 간단하게 누구나 사용
  • 구글 서버에 있는 GPU CPU를 사용하기 때문에 컴퓨터 사양의 영향을 받지않는다.
  • 인터넷만 있다면 어디서든 코드를 실행할 수 있음

출처 : 케라스 창시자에게 배우는 딥러닝(개정판)

profile
어서오세요.

0개의 댓글