본문 바로가기
딥러닝

[딥러닝] 혼자 공부하는 머신러닝 + 딥러닝 | Chapter 09. 텍스트를 위한 인공 신경망 |

by Hessedist 2022. 5. 18.

Chapter 09. 텍스트를 위한 인공 신경망


학습목표

  1. 텍스트와 시계열 데이터 같은 순차 데이터에 잘 맞는 순환 신경망의 개념과 구성 요소에 대해 배움. 
  2. 케라스 API로 기본적인 순환 신경망에서 고급 순환 신경망을 만들어 영화 감상평을 분류하는 작업에 적용해 봄.
  3. 순환 신경망에서 발생하는 문제점과 이를 극복하기 위한 해결책을 살펴봄. 

 


Chapter 09. 텍스트를 위한 인공 신경망 - 1) 순차 데이터와 순환 신경망


순차 데이터의 특징을 알고 순환 신경망의 개념을 학습.

 

키워드로 끝내는 핵심 포인트

  • 순차 데이터는 텍스트나 시계열 데이터와 같이 순서에 의미가 있는 데이터. 대표적인 순차 데이터로는 글, 대화, 일자별 날씨, 일자별 판매 실적 등을 예로 들 수 있음. 
  • 순환 신경망은 순차 데이터에 잘 맞는 인공 신경망의 한 종류. 순차 데이터를 처리하기 위해 고안된 순환층을 1개 이상 사용한 신경망을 순환 신경망이라고 부름. 
  • 순환 신경망에서는 종종 순환층이라 부름. 일반적인 인공 신경망과 마찬가지로 하나의 셀은 여러 개의 뉴런으로 구성 
  • 순환 신경망에서는 셀의 출력을 특별히 은닉 상태라고 부름. 은닉 상태는 다음 층으로 전달될 뿐만 아니라 셀이 다음 타임스텝의 데이터를 처리할 때 재사용됨. 

 

순환 신경망으로 순환 데이터 처리 

  • 이번 절에서 순차 데이터와 순환 신경망을 소개했음. 먼저 순차 데이터의 특징을 예를 들어 소개했고 순환 신경망의 개념과 주요 구성 요소를 소개했음. 여기에는 순환층, , 은닉 상태 등이 포함됨. 
  • 순환층은 순서를 가진 데이터를 처리하기 위해 밀집 신경망이나 합성곱 신경망과는 계산하는 방식이 다름. 은닉층의 출력을 다음 층으로만 보내지 않고 다음 순서에 다시 재사용하는 순환 구조로 되어 있음. 
  • 하지만 거시적인 구조는 다른 신경망과 크게 다르지 않음. 입력에 가중치를 곱하고 절편을 더한 다음 활성화 함수를 통과시켜 다음 층으로 전달하는 것임. 다만 순환층은 이전 타임스텝의 출력을 입력으로 함께 사용함. 또 마지막 타임스텝의 출력만 다음 층으로 전달. 
  • 다음 절에서는 텐서플로와 케라스를 사용해 순차 데이터와 순환 신경망을 직접 만들어 영화 감상평을 긍정과 부정으로 분류해 보겠음. 

 


Chapter 09. 텍스트를 위한 인공 신경망 - 2) 순환 신경망으로 IMDB 리뷰 분류하기

 


텐서플로를 사용해 순환 신경망을 만들어 영화 리뷰 데이터셋에 적용해서 리뷰를 긍정과 부정으로 분류

 

  • 자연어 처리 : 컴퓨터를 사용해 인간의 언어를 처리하는 분야 (음성 인식, 기계 번역, 감성 분석 등)
    • 말뭉치 : 자연어 처리 분야에서의 훈련 데이터
    • 어휘 사전: 훈련 세트에서 고유한 단어를 뽑아 만든 목록을 어휘 사전이라고 말함. 예를 들어 테스트 세트 안에 어휘 사전에 없는 단어가 있다면 2로 변환하여 신경망 모델에 주입. 
  • 한글 문장이 토큰을 분리하는 방법?!
    • 한글은 조사가 발달되어 있기 때문에 공백으로 나누는 것만으로는 부족함. 일반적으로 한글은 형태소 분석을 통해 토큰을 만듬. 안타깝지만 한글의 형태소 분석은 이 책의 범위를 넘어섬. KoNLPy를 사용한 한글의 형태소 분석에 관심이 있다면 "파이썬 라이브러리를 활용한 머신러닝" 7장 참고
 

파이썬 라이브러리를 활용한 머신러닝 - 교보문고

사이킷런 핵심 개발자가 쓴 머신러닝과 데이터 과학 실무서 | 실제 문제에 대한 해법을 찾는 머신러닝 기술자를 위한 본격 머신러닝 입문서 이 책은 머신러닝 알고리즘을 밑바닥부터 만드는 법

www.kyobobook.co.kr

 

키워드로 끝내는 핵심 포인트

  • 말뭉치는 자연어 처리에서 사용하는 텍스트 데이터의 모음, 즉 훈련 데이터셋을 일컬음.
  • 토큰은 텍스트에서 공백으로 구분되는 문자열을 말함. 종종 소문자로 변환하고 구둣점은 삭제.
  • 원-핫 인코딩은 어떤 클래스에 해당하는 원소만 1이고 나머지는 모두 0인 벡터. 정수로 변환된 토큰을 원-핫 인코딩으로 변환하려면 어휘 사전 크기의 벡터가 만들어짐. 
  • 단어 임베딩은 정수로 변환된 토큰을 비교적 작은 크기의 실수 밀집 벡터로 변환함. 이런 밀집 벡터는 단어 사이의 관계를 표현할 수 있기 때문에 자연어 처리에서 좋은 성능을 발휘함.  
  • TensorFlow
    • pad-sequences() : 시퀀스 길이를 맞추기 위해 패딩을 추가, 이 함수는 (샘플 개수, 타임스텝 개수) 크기의 2차원 배열을 기대함. 
    • to_categorical() : 정수 시퀀스를 원-핫 인코딩으로 변환. 토큰을 원-핫 인코딩하거나 타깃값을 원-핫 인코딩할 때 사용.
    • SimpleRNN : 케라스의 기본 순환층 클래스
    • Embedding : 단어 임베딩을 위한 클래스 

 

케라스 API로 순환 신경망 구현

  • 1절에서 배웠던 순환 신경망의 개념을 실제 모델을 만들어 보면서 구체화해 보았음. 텐서플로케라스는 완전 연결 신경망, 합성곱 신경망뿐만 아니라 다양한 순환층 클래스를 제공하기 때문에 손쉽게 순환 신경망을 만들 수 있음.
  • 이 절에서는 순환 신경망의 MNIST 데이터셋으로 생각할 수 있는 유명한 IMDB 리뷰 데이터셋을 사용했음. 이 작업은 리뷰의 감상평을 긍정과 부정으로 분류하는 이진 분류 작업임. 
  • 두 가지 모델을 훈련해 보았음. 먼저 입력 데이터를 원-핫 인코딩으로 변환하여 순환층에 직접 주입하는 방법을 사용했음. 두 번째는 정수 시퀀스를 그대로 사용하기 위해 모델 처음에 Embedding 층을 추가했음. 단어 임베딩은 단어마다 실수로 이루어진 밀집 벡터를 학습하기 때문에 단어를 풍부하게 표현할 수 있음. 
  • 다음 절에서는 더 복잡한 문제에 적용할 수 있는 고급 순환층을 배우고 같은 문제에 적용하여 결과를 비교해 보겠음.  
  • 전체 소스 코드 
 

9-2.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

 


Chapter 09. 텍스트를 위한 인공 신경망 - 3) LSTM과 GRU 셀


순환 신경망에서 빼놓을 수 없는 핵심 기술인 LSTM과 GRU 셀을 사용한 모델을 만들어 봄. 

 

키워드로 끝내는 핵심 포인트

  • LSTM 셀은 타임스텝이 긴 데이터를 효과적으로 학습하기 위해 고안된 순환층. 입력 게이트, 삭제 게이트, 출력 게이트 역할을 하는 작은 셀이 포함되어 있음. 
  • LSTM 셀은 은닉 상태 외에 셀 상태를 출력함. 셀 상태는 다음 층으로 전달되지 않으며 현재 셀에서만 순환됨. 
  • GRU 셀은 LSTM 셀의 간소화 버전으로 생각할 수 있지만 LSTM 셀에 못지않는 성능을 냄. 
  • TensorFlow
    • LSTM은 LSTM 셀을 사용한 순환층 클래스. 
    • GRU는 GRU 셀을 사용한 순환층 클래스 

 

LSTM과 GRU 셀로 훈련 

  • 이 절에서는 순환 신경망에서 가장 인기 있는 LSTMGRU 셀에 대해 배웠음. 또 순환층에 드롭아웃을 적용해 보았고 2개의 순환층을 쌓는 방법에 대해 알아보았음 
  • 이제 가장 좋았던 2개의 순환층을 쌓은 모델을 다시 로드하여 테스트 세트에 대한 성능을 확인해 보겠음. 먼저 테스트 세트를 훈련 세트와 동일한 방식으로 변환. 그 다음 load_model() 함수를 사용해 best-2rnn-model.h5 파일을 읽고 evaluate() 메서드로 테스트 세트에서 성능을 계산함. 
  • 전체 소스 코드
 

9-3.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

 


예제 파일

 

GitHub - rickiepark/hg-mldl: <혼자 공부하는 머신러닝+딥러닝>의 코드 저장소입니다.

<혼자 공부하는 머신러닝+딥러닝>의 코드 저장소입니다. Contribute to rickiepark/hg-mldl development by creating an account on GitHub.

github.com