on
딥러닝 순환 신경망 RNN 10분 만에 이해하기
딥러닝 순환 신경망 RNN 10분 만에 이해하기
인공 지능의 시대
우리는 인공지능 시대에 살고 있다.
인간의 감정을 이해하고, 인간의 삶을
위협하는 인공지능이 아니라, 비서로써
혹은 검색의 어시스턴트로 인공지능
기술이 도입되고 있다.
인공지능 서비스의 가장 대표적인 사례는
인공지능 비서다. 애플의 시리, 마이크로소프트의
코타나, 아마존의 알렉스 등등 스피커의 형태로
우리 옆에 다가와있다.
애플의 시리가 어떻게 사람의 말을 이해하고,
이에 맞는 문장을 만들어서 음성으로 출력하는지
궁금해본적 있는가?
이런 인공지능 비서들이 사람말을 이해한다는 것은
이미 인간이 사용하는 언어를 상당부분 습득하고,
학습을 진행했다는 뜻이다.
인간의 문장은 여러개의 단어로 구성이 되고, 전체적인
문장의 의미를 이해하기 위해서는 앞에서 입력된
단어가 저장이 되어 있다는 것이다. 모든 문장이 입력되고
나서 처음 부터 단어를 조립하면서 문장의 의미를
출력해낸다.
순환신경망(Recurrent Neural Network)
여기에 들어가는 인공지능 머신러닝의 기술이 순환
신경망(Recurrent Neural Network)다. 기억된 데이터가
얼마나 중요한지를 판단해서 딥러닝의 다음 층으로
입력데이터를 넘기게 된다.
하지만 다음 층으로 데이터를 넘기기 전에 모든 단어를
입력받아서 가중치를 결정해야 하기때문에, 한개의 층에서
학습이 순환하면서 머물기 때문에, 순환 신경망이라
부르는 것이다.
RNN에서는 입력된 단어에 따라서 출력값이 변하기
때문이다. 예를 들어서 한국의 인구는 몇명이야? 라고
묻는 것과 미국의 인구는 몇명이야? 라는 질문은 인구의
양을 묻는 건 동일하지만 어떤 인구인지에 따라서 출력
결과가 달라지기 때문이다. 즉, 신경망에서 입력된 모든
단어를 기억하고, 앞의 단어가 뒤의 단어에 영향을 미치고
있는 것이다.
LSTM(Long Short Term Memory)
한개의 층을 순환하면서 모든 단어를 입력받고 저장해야
하는 RNN의 특성상 한개층에서 기울기 소실 문제를 피해
갈 수 없다.
오히려 다른 신경망 알고리즘 보다 기울기 소실 문제가
더 심각하게 발생할 수 있다. 기울기 소실문제는 아래
글을 참고하길 바란다.
이 문제를 해결하기 위해 나온 솔루션이 LSTM이다.
RNN신경망을 순환하기 전에 다음층으로 입력된
데이터를 넘길지 말지를 결정하는 단계를 하나 더
추가해서 기울기 소실 문제를 해결한다.
딥러닝 예제
이제 RNN을 어떻게 구현하는지 알아보자.
데이터는 로이터 뉴스를 가지고 카테고리를
분류하는 작업을 진행한다.
1. 데이터셋 불러오기
먼저 keras.datasets에서 로이터 통신 뉴스
데이터를 가져 온다. 데이터를 확인해보면,
11,258개의 뉴스 데이터가 존재한다. 이 중
20%는 테스트용으로 80%는 학습용으로
사용해서 딥러닝 모델을 설계한다.
학습용 데이터를 출력해보면 길이가 100이하인
1차원 리스트가 출력된다. 뉴스 기사에서 단어의
반복되는 횟수를 나타내는 데이터다.
num_words 인자는 1000회 미만으로 반복된
데이터를 출력한다는 것이다.
test_split은 테스트 데이터로 몇%를 사용하겠냐는
것이다. 0.2는 20%를 의미한다.
1 2 3 4 5 6 7 8 9 10 from keras.datasets import reuters import numpy (X_train, Y_train), (X_test, Y_test) = reuters.load_data(num_words = 1000 , test_split = 0. 2 ) category = numpy.max(Y_train) + 1 print ( "category : " , category) print ( len (X_train), "학습용 뉴스 기사" ) print ( len (X_test), "테스트용 뉴스 기사" ) print (X_train[ 0 ])
print (len(X_train[ 0 ])) Colored by Color Scripter cs
2. 데이터 전처리
뉴스 기사에서 반복되는 단어의 갯수가
기사들마다 다르기 때문에, 모든 기사의
단어 숫자를 맞춰준다. keras의 sequence를
사용한다.
maxlen은 단어 수의 최대크기를 100으로 한정
한다는 것이다. 단어수가 100개 이상인 기사는
100개까지만 데이터를 가져오고 나머지는
모두 0으로 채운다.
결과값 Y는 카테고리 별로 숫자가 배정되어있다.
딥러닝의 결과값으로 조정하기 위해서는 0과 1로
이뤄진 1차원 배열로 변경해줘야 한다. 이때
사용하는 전처리 함수가 to_categorical() 함수다.
1 2 3 4 5 # 데이터 전처리 x_train = sequence.pad_sequences(X_train, maxlen = 100 ) x_test = sequence.pad_sequences(X_test, maxlen = 100 ) y_train = np_utils.to_categorical(Y_train) y_test = np_utils.to_categorical(Y_test) cs
3. 딥러닝 모델 설계
이제 모델을 설계한다.
Sequential() 함수를 사용해 새로운 층 구조를 생성한다.
Embedding()함수는 데이터 전처리 과정을 통해 입력층에서
데이터를 입력받는다. 그리고 다음층으로 보낼 데이터를
변환해서 전송한다. Embedding()은 항상 모델설정의
가장 첫 부분에 와야 한다. 입력층의 데이터를 직접 입력
받는 함수이기 때문이다.
Embedding('불러온 단어의 총 개수', '기사당 단어의 갯수')
LSTM은 RNN에서 먼저 입력받은 데이터의 가중치를
결정하는 녀석이다. LSTM은 다음층으로 데이터를 보낼 때
활성화 함수로 Tanh을 사용한다.
LSTM('기사당 단어의 갯수', '기타 옵션')
모델의 출력층에서는 46개의 노드를 설정한다.
그 이유는 전체 카테고리의 갯수가 46개이기 때문이다.
활성화 함수는 다항분류 문제이기 때문에 0과 1의 특징을
두드러지게 하는 softmax()함수를 사용한다.
1 2 3 4 5 # 모델을 설정 합니다. model = Sequential() model.add(Embedding( 1000 , 100 )) model.add(LSTM( 100 , activation = 'tanh' )) model.add(Dense( 46 , activation = 'softmax' )) cs
4. 모델 컴파일
모델 설계가 완료되면 컴파일을 진행한다.
다항 분류에서 가장 많이 사용되는 오차함수는
categorical_crossentopy()함수다.
최적화 함수는 Adam()함수를 사용한다.
1 2 3 4 # 모델을 컴파일 합니다. model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics = [ 'accuracy' ]) cs
5. 딥러닝 모델 학습 및 결과 출력
이제 딥러닝 모델 학습을 진행한다.
model.fit()으로 반복할 횟수인 epochs를
20번을 주고, 한번에 100개의 샘플을
집어넣어서 학습을 진행한다.
출력결과를 뽑아보면 70%의 정확도로
로이터 뉴스기사 카테고리를 분류하고
있음을 확인할 수 있다.
1 2 3 4 5 # 모델을 실행합니다. model.fit(x_train, y_train, validation_data = (x_test, y_test), epochs = 20 , batch_size = 100 ) # 테스트 정확도를 출력합니다. print ( "
Test Accuracy : %.4f" %(model.evaluate(x_test, y_test)[ 1 ])) cs
from http://incomeplus.tistory.com/250 by ccl(A) rewrite - 2021-12-17 15:00:52