본문 바로가기

Deep Learning With Tensorflow/01.신경망 구현 지식

04. 실습: IMDB를 이용한 감정분석과 초매개변수 튜닝과 AutoML, 출력 예측, 역전파에 대한 실용적 개괄에 대해

반응형

영화 리뷰를 이용하여 실습을 진행해 보겠습니다. 간단합니다.

 

01. 데이타로드

import tensorflow as tf
from tensorflow.keras import datasets, layers, models, preprocessing
import tensorflow_datasets as tfds

max_len = 200
n_words = 10000
dim_embedding = 256
EPOCHS = 20
BATCH_SIZE =500

def load_data():
	#load data
	(X_train, y_train), (X_test, y_test) = datasets.imdb.load_data(num_words=n_words)
	# Pad sequences with max_len
	X_train = preprocessing.sequence.pad_sequences(X_train, maxlen=max_len)
	X_test = preprocessing.sequence.pad_sequences(X_test, maxlen=max_len)
	return (X_train, y_train), (X_test, y_test)

IMDB 데이터를 로드합니다. 리뷰에 있는 단어의 시퀀스는 정수의 시퀀스로 변환됐다. 각 정수는 사전의 특정 단어를 나타낸다. 또한 문자를 max_len길이로 채울 수 있는 편리한 방법을 사용해 길이에 상관없이 모든 문장을 사용해 신경망에 입력할 수 있으며 각 입력 벡터는 고정된 크기다.

 

 

02. 모델 만들기

Embedding()이라는 계층이 있어서 리뷰에 포함된 단어의 희소 공간을 더 조밀한 공간으로 매핑한다고 가정하자. 이를 통해 계산이 용이해진다. 또한 GlobalMaxPooling1D()계층을 사용해 n_words특징에서 특징 벡터의 최댓값을 가져온다. 또한 두 개의 Dense() 계층이 있다. 마지막은 단일 뉴런으로는 구성되는데 최종 이진 추정을 위해 시그모이드 활성화 함수를 가진다.

def build_model():
	model = models.Sequential()
    
	#Input - Emedding Layer
	# the model will take as input an integer matrix of size (batch, input_length)
	# the model will output dimension (input_length, dim_embedding)
    # the largest integer in the input should be no larger
    # than n_words (vocabulary size).
    
	model.add(layers.Embedding(n_words, dim_embedding, input_length=max_len))

	model.add(layers.Dropout(0.3))

	#takes the maximum value of either feature vector from each of the n_words features
	model.add(layers.GlobalMaxPooling1D())
	model.add(layers.Dense(128, activation='relu'))
	model.add(layers.Dropout(0.5))
	model.add(layers.Dense(1, activation='sigmoid'))

	return model

 

03. 모델 훈련시키기

앞쪽의 MNIST에서 수행한 것과 매우 유사하다.

(X_train, y_train), (X_test, y_test) = load_data()
model=build_model()
model.summary()

model.compile(optimizer = "adam", loss = "binary_crossentropy",
 metrics = ["accuracy"]
)

score = model.fit(X_train, y_train,
 epochs= EPOCHS,
 batch_size = BATCH_SIZE,
 validation_data = (X_test, y_test)
)

score = model.evaluate(X_test, y_test, batch_size=BATCH_SIZE)
print("\nTest score:", score[0])
print('Test accuracy:', score[1])

 


초매개변수 튜닝과 AutoML

 

위와 같이 잘 작동된다고 해서 반드시 다른 예제에서 작동한다는 보장은 없다. 사실, 주어진 신경망에 대해 최적화할 수 있는 여러 매개변수(은닉 뉴런의 개수, batch_size, 에폭 수, 망  자체의 복잡도에 종속된 여러 매개변수 등)가 있다.

 

이러한 신경망 자체의 매개변수, 즉 가중치 및 편향 값과 구별하려고 '초매개변수'(Hyperparameter)라고 한다. 초매개변수 튜닝이란 비용 함수를 최소화하는 초매개변수의 최적 조합을 찾는 과정이다.

 

핵심 아이디어는 n개의 초매개변수가 있는 경우 이들이 이루는 n차원의 공간을 정의하고 이 공간에서 비용 함수의 최적 값에 해당하는 지점을 찾는 것이다. 이 목표를 달성하는 한 가지 방법은 이 공간에 그리드를 만들고 각 그리드 정점에 대한 비용 함숫값을 체계적으로 확인하는 것이다.

 

다시 말해 초매개변수를 버킷으로 나누고 서로 다른 값 조합을 무차별 접근 방식을 통해 확인한다. 초매개변수를 미세 조정하는 이런 과정이 수동적이고 계산량이 많이 들 것을 생각한다면 그 생각은 전적으로 옳다. 그러나 초매개변수를 자동으로 튜닝하고 최적의 신경망 아키텍처를 자동으로 검색하는 것을 목표로 하는 AutoML에서 중요한 결과를 얻었다.

 


출력 예측

 

신경망이 훈련되면 예측을 위해 사용할 수 있는데 텐서플로에서 이는 매우 간단하다. 

  • mode.predict() : 예측 계산
  • model.evaluate(): 손실 값 계산을 할 수 있다.
  • model.predict_class(): 범주 출력을 계산한다.
  • model.predict_proba(): 메소드는 부류 확률을 계산하는 데 사용된다.

 


역전파에 대한 실용적 개괄

 

다층 퍼셉트론은 역전파(backpropagation)라는 프로세스를 통해 훈련 데이터에서 학습한다. 이 과정은 오류가 발견되는 즉시 점진적으로 수정해 나가는 방법이라고 할 수 있다.

 

각 신경망 계층에는 주어진 입력 집합에 대한 출력 값을 결정하는 관련 가중치 집합이 있음을 기억하자. 또한 신경망은 다수의 은닉층을 가질 수 있다는 점을 기억하자.

 

처음에는 모든 가중치에 임의의 값을 할당한다. 그런 다름 훈련 집합의 각 입력에 대해 신경망이 활성화된다. 값은 입력 단계에서 은닉 단계를 통해 출력 단계로 순전파(propagate forward)하여 예측이 이뤄진다.

 

훈련 집합에서 실제 관측값을 알기 때문에 예측에서 발생한 오차를 계산할 수 있다. 역전파의 핵심 아이디어는 그래디언트 하강과 같은 적절한 최적화 알고리즘을 사용해 오차를 줄이려는 목적으로 신경망 가중치를 조정하고자 오차를 역으로 전파라는 것이다.

 

입력에서 출력으로 순방향 전파와 오차의 역방향 전파 프로세스는 오차가 사전 정의된 임계값 이하로 떨어질 때까지 여러 번 반복한다. 신경망에서 실제로 중요한 것은 단일 뉴런의 출력이 아니라 각 계층에서 조정된 종합적인 가중치다. 따라서 신경망은 정확하게 예측된 레이블 수를 증가시키는 방향으로 내부 가중치를 점진적으로 조정한다. 물론 학습 과정에서 편향을 최소화하려면 올바른 특징을 사용하고 품질이 우수한 레이블을 가진 데이터를 사용하는 것이 필수적이다. 

 


역전파에 대한 실용적 개괄

지금까지 코드는 이미지의 로컬 공간 구조를 활용하지 않았다는 것이다. 특히 사용한 코드는 기록된 각 숫자를 나타내는 비트맵을 평면벡터로 변환해 로컬 공간 구조(인접한 픽셀이 서로 더 가까이 있다는 사실)가 사라진다.

 

#X_train은 60,000개의 행을 가진 28x28의 값; 60,000x784 형태로 변형
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

그러나 이는 뇌가 작동하는 방식이 아니다. 시각 체계는 여러 피질 레벨에 기반을 둔다는 점을 기억하자. 각 피질 레벨은 점점 더 구조화된 정보를 인식하고 지역성을 유지한다. 단일 픽셀을 본 다음 그로부터 단순한 기하 형태를 인식하고 나서 객체, 얼굴, 인체, 동물 등과 같은 점점 더 정교한 요소를 인식한다.

 

컨볼루션 신경망(CNN, Convolutional Neural Network)이라고 하는 특정 유형의 딥러닝 망이 이미지의 로컬 공간 구조를 보존한다는 아이디어와 점진적 추상화 레벨을 통한 학습 아이디어를 모두 고려해 개발됐음을 알 수 있다. 하나의 계층은 오진 간단한 패턴만 학습할 수 있고, 하나 이상의 계층으로 여러 패턴을 학습할 수 있다.

반응형