본문 바로가기

Lecture AI/3장.신경망 시작하기

1. 신경망의 구조에 대한 이해

반응형

신경망 훈련에는 아래의 요소들이 관련되어 있습니다.

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

 

연속된 층으로 구성된 네트워크가 입력 데이터를 예측으로 매핑합니다. 손실 함수는 예측과 타깃을 비교하여 네트워크의 예측이 기댓값에 얼마나 잘 맞는지를 측정하는 손실 값을 만듭니다. 옵티마이저는 손실 값을 사용하여 네트워크 가중치를 업데이트합니다. 

 

 


3.1.1 층: 딥러닝의 구성 단위

 신경망의 핵심적인 데이터 구조는 입니다. 층은 하나 이상의 텐서를 입력으로 받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈입니다. 어떤 종류의 층은 상태가 없지만 대부분의 경우 가중치라는 층의 상태를 가집니다. 가중치는 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서이며 여기에 네트워크가 학습한 지식이 담겨 있습니다.

 

층마다 적절한 텐서 포맷과 데이터 처리 방식이 다릅니다. 예를 들어 (samples, features)크기의 2D텐서가 저장된 간단한 벡터 데이터는 완전 연결 층(fully connected layer)이나 밀집 층(dense layer)이라고도 불리는 밀집 연결 층(densely connected layer)에 의해 처리되는 경우가 많습니다. (케라스에서는 Dense 클래스입니다.) 

 

(samples, timesteps, features)크기의 3D 텐서로 저장된 시퀀스 데이터는 보통 LSTM같은 순환층(recurrent layer)에 의해 처리됩니다. 4D텐서로 저장되어 있는 이미지 데이터는 일반적으로 2D 합성곱 층(convolution layers)에 의해 처리됩니다. (Conv2D 클래스)

 

케라스에서는 호환 가능한 층들을 였어 데이터 변환 파이프라인(pipeline)을 구성함으로써 딥러닝 모델을 만듭니다. 여기에서 층 호환성(layer compatibility)은 각 층이 특정 크기의 입력 텐서만 받고 특정 크기의 출력 텐서를 반환한다는 사실을 말합니다. 다음 예를 살펴보죠.

 

from keras import layers

#32개의 유닛으로 된 밀집 층
layers = layers.Dense(32, input_shape=(784,))

첫 번째 차원이 784인 2D텐서만 입력으로 받는 층을 만들었습니다. (배치 차원인 0번째 축은 지정하지 않기 때문에 어떤 배치 크기도 입력으로 받을 수 있습니다.) 이 층은 첫 번째 차원 크기가 32로 변환된 텐서를 출력할 것입니다.

 

따라서 이 층에는 32차원의 벡터를 입력으로 받는 하위 층이 연결되어야 합니다. 케라스에서는 몯ㄹ에 추가된 층을 자동으로 상위 층의 큭에 맞추어 주기 때문에 호환성을 걱정하지 않아도 됩니다.

 

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32, input_shape=(784,)))
model.add(layers.Dense(32))

 

두 번째 층에는 input_shape매개변수를 지정하지 않았습니다. 그 대신 앞선 층의 출력 크기를 입력 크기로 자동으로 채택합니다. 

 


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

 

네트워크 구조를 정의하고 나면 두 가지를 더 선택해야 합니다.

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

 

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

 

목적에 맞는 올바른 목적 함수를 선택하는 것은 아주 중요합니다. 우리가 만든 모든 신경망은 단지 손실 함수를 최소화하기만 한다는 것을 기억하세요. 목적 함수를 현명하게 선택하지 않으면 원하지 않는 부수 효과가 발생할 것입니다. 우리가 만든 모든 신경망은 단지 손실 함수를 최소화하기만 한다는 것을 기억하세요.

 

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

  • 이진 크로스엔트로피 (Binary Crossentropy): 분류 문제
  • 범주형 크로스엔트로피 (Categorical Crossentropy): 여러 개의 클래스가 있는 분류문제
  • CTC (Connection Temporal Classification): 시퀀스 학습 문제

 


3.2.2 케라스를 사용한 개발: 빠르게 둘러보기

 

이미 케라스 모델의 예로 MNIST예제를 보았습니다. 전형적인 케라스 작업 흐름은 이 예제와 비슷합니다.

  • 입력 텐서와 타깃 텐서로 이루어진 훈련 데이터를 정의합니다.
  • 입력과 타깃을 매핑하는 층으로 이루어진 네트워크(또는 모델)를 정의합니다.
  • 손실 함수, 옵티마이저, 모니터링하기 위한 측정 지표를 선택하여 학습 과정을 설정합니다.
  • 훈련 데이터에 대해 모델의 fit()메서드를 반복적으로 호출합니다.
#함수형 API와 Sequential 클래스의 사용 비교
from keras import models
from keras import layers

#Sequential
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)

model = models.Model(inputs=input_tensor, outputs=output_tensor)

#Compile은 동일
from keras import optimizers
import tensorflow as tf

model.compile(optimizer='rmsprop',loss='mse',metrics=['accuracy'])
반응형