본문 바로가기

파이썬 & 머신러닝과 딥러닝

20일차 - 순환신경망의 개념, RNN 드롭아웃, LSTM, 영화리뷰 분류, 로이터 기사 분류

 

 

순차 데이터 (Sequential Data)

: 텍스트, 시계열

순서가 의미를 가져 순서에 따라 말이 달라질 수 있음


 

순환 신경망 (RNN) vs 피드-포워드 신경망

 

순환 신경망 : 나가는 출력에 weight가 있어서 그 weight를 기억

 


순환 신경망 (Recurrent Neural Network, RNN)

지나간 정보가 기억 되어야할 필요가 있다.

기억 -> 순환으로 표현

 

 

셀 == 순환 층

순환층의 활성화 출력 == 은닉상태

(각각의 셀이 순환이 된다. -> 활성화 함수 (tanh) 사용)

 


 

타임스텝으로 펼친 신경망

 


 

순환 신경망의 가중치

 

 

은닉 상태의 순환 : 셀 안에 그물처럼 엉키기

 


 

순환 신경망의 입력과 출력

 

 

단어 == 토큰

시퀀스 길이(타임스텝) == 단어 길이

하나하나가 특성 -> 현재 4개의 특성

 

각각의 단어가 들어갈 때 곱하고 더해짐

누적만 하다가 샘플이 끝난 순간

셀 안에 뉴런의 개수에 맞는 출력 하나가 나옴

 


 

은닉상태의 출력

 

모든 특성이 곱해지고 더해져서 영향을 누적하여 다 주고나서 

마지막에 하나 출력

 


 

순환 신경망 구조

 

 

각각의 샘플은 20단어로 이루어져있고 

각각의 단어가 다 정수값으로 표현되어 있다고 가정 했을 때

100길이의 벡터로 표현되었다.

셀끼리 순환이 되다가 다중분류를 원하면 소프트맥스 활성화 함수 출력층 통과,

이진분류가 필요하면 시그모이드 함수로 출력층 통과

 


 

영화 리뷰 분류해보기 (긍정리뷰/부정리뷰)

※ 주요 용어정리

NLP (자연어처리) : 음석인식, 기계번역, 감성 분석 등

말뭉치 (corpus) : NLP에서의 학습데이터를 의미

토큰 : 공백으로 분리된 단어 (본 예제에서는 타임스텝에 해당됨)

어휘사전 : 훈련세트에서 분석에 사용할 고유한 단어를 뽑아만든 목록을 의미

 

 

-> 0~3는 특수 목적으로 예약되어 있음

0: 패딩

1: 문장의 시작

2: 어휘 사전에 없는 토큰 (어휘사전에 없으면 다 2)

3: 사용되지 않음

 


 

데이터 준비

 

-> num_words = 100 : 전체 데이터 셋에서 자주 등장하는 상위 100개 단어

 

-> 25000개씩 train, test로 나눠져있음 (총 50000개)

 

 

-> len(train_input[0]) : 첫번째 리뷰의 단어 개수

-> 128개의 토큰으로 구성 (128개의 단어로 구성된 리뷰)

 

 

첫번째 리뷰 데이터

 

타겟 확인

-> 긍정(1) or 부정(0): 이진 분류

 


 

잠깐! 리뷰 원본 데이터를 복원하는 방법

 

-> 실습을 이어서 진행하기 위해서는 imdb.load_data(num_words=500 을 사용)

 


 

학습, 검증 데이터 분리 및 시각화

 

 

-> 리뷰(lengths) 길이가 제각각

 

-> 2대 8로 나눠서 샘플 개수 20000개

-> 리뷰 길이를 동일한 사이즈로 단어 100개로 맞추자


 

시퀀스 패딩

 

 

-> maxlen = 100 : 100개의 토큰만 사용 (모든 샘플 길이가 100)

(100개 보다 큰 리뷰 : 나머지 토큰 삭제, 100개보다 작은 리뷰 : Zero 패딩)

-> 검증 데이터에 대해서도 처리해야 함

 


 

100 토큰 (단어)보다 긴 리뷰: 토큰 삭제

 

100 토큰 (단어)보다 짧은 리뷰 : Zero 패딩

-> 앞에 0으로 날린다.

 


 

 

-> pad_sequences() 함수는 기본적으로 maxlen보가 긴 시퀀스의 앞부분을 잘라냄

(뒷부분을 잘라내고 싶다면?

pad_sequence() 함수의 truncating 매개변수 값을 'post’로!! (기본값: ‘pre’))

 


 

RNN 모델 만들기

 

-> SimpleRNN 클래스의 activation 매개변수 기본값은 ‘tanh’

 

 

원-핫 인코딩 수행 (왜 해야할까?)

: 하나의 원소만 1 나머지는 0으로

 

 

정수 10에 대한 원-핫 인코딩 표현

 

-> 전체 비트 중 1은 하나 (11번째 1)

 

-> 검증 데이터세트도 원-핫 인코딩 처리해야 함!!

 


 

학습하기 및 평가 

옵티마이저 및 콜백 설정 후 학습

 

-> 곱하고 더하고 순환하고 해서 샘플을 하나씩 처리하고 모아서 한 번에 보냄

 


 

추가내용: 워드 임베딩 (Word Embedding)

 

 

 


 

추가내용: 2개의 층을 연결하기

 

 


 

Long Short Term Memory (LSTM) 

기본 RNN은 시퀀스 길이가 길 경우 성능이 저하되는 문제가 있음 

  • 타임스텝이 길어질수록 이전에 입력되었던 정보가 사라짐
  • 이러한 문제를 해결하기 위해 개발된 순환신경망 구조가 LSTM
  • 최근 가장 많이 사용되고 있는 RNN 모델이라 할 수 있음

-> 녹색이 컨베이어 벨트처럼 스텝이 올 때마다 도는 것

그 값 그대로가 유지되면서 매번 곱해져 누적되는 것

 


 

LSTM 모델을 만드는 방법은 아주 간단함!

 

기존 SimpleRNN 클래스 대신 LSTM 클래스를 사용하면 끝!

• 이후 학습과정은 기본 RNN과 완전히 동일함

 

 


 

추가내용: RNN에 Dropout 적용하기

 

참고: SimpleRNN의 경우에도 dropout을 적용하는 방법은 동일

 


 

실습 : 로이터 기사 분류하기

 

11228개의 뉴스 기사 텍스트 데이터 셋

(42개의 카테고리)

 

모델 구성 조건

  • 어휘사전 크기 1000
  • 20% 검증 세트
  • 시퀀스 데이터 길이 80
  • LSTM 또는 Simple RNN 사용
  • activation 함수 tanh
  • 워드임데딩 사용
  • 워드임베딩 벡터 크기는 32로 설정 (다른 값으로 해도 됨)
  • 신경망 구성 및 하이퍼파라미터는 자유롭게 사용

 

 

 

 

 

 

 

 

 

 

 

 


 

사진 출처 : 혼자 공부하는 머신러닝 + 딥러닝 강의자료