PYTHON으로 딥러닝하기

Python으로 딥러닝하기|LSTM(RNN) Part1&2. 이론 및 실습

euni_joa 2019. 6. 25. 20:24
반응형

안녕하세요.

 

오늘은 이전 포스팅 RNN 이론에 이어 LSTM 이론 및 실습을 하도록 하겠습니다.

 

실습은 "Tensorflow 2.0 beta" 버전으로 RNN을 구축하겠습니다!

 


 

먼저,

 

LSTM(Long Short-term Memory)에 대해 알아보겠습니다.

 

 

Part 1. 이론

 

LSTM은 RNN의 Gradient Vanishing 문제를 해결하기 위해 도입되었습니다.

 

LSTM 구조의 기본 원리는

신경망이 장기적인 관계를 학습을 위하여

중요한 정보를 확실하게 전송할 목적으로 설계되었다는 것입니다.

 

[RNN 과 LSTM 비교]

그림 출처: https://ratsgo.github.io

 

 

1. 유지 게이트(keep/forget gate): 얼마나 많은 양의 이전 메모리를 유지할지 결정

 

이전 시간 단계에서 메모리 상태 텐서는 정보가 풍부하지만,

 

일부 정보는 오래된 것일 수 있다.

 

 

2. 쓰기 게이트(write/input gate): 어떤 정보를 메모리 상태에 기록해야 할 것인지 결정

 

1) 어떤 정보를 쓰려는지 알아 낸다.

 

2) 계산된 텐서가 새로운 상태를 포함하길 원하는지, 이전의 값을 전달하길 원하는지 파악한다.

 

 

3. 출력 게이트(output gate): 시간 단계마다 LSTM 유닛 출력

 

1) tahnh 층은 중간 텐서를 생성한다.

 

2) 시그모이드 층은 현재 입력과 이전 출력을 사용해 비트 텐서 마스크를 생성한다.

 

3) 중간텐서는 최종 출력을 생성하기 위해 비트 텐서와 곱해진다.

 


 

Part2. 실습

 

우선 Tensorflow 2.0 버전을 설치하겠습니다.

 

!pip install -q tensorflow==2.0.0-beta1

!pip install -q tensorflow-gpu==2.0.0-beta1  # gpu 버전

 

 

두 문장이 유산한지(NLP) 예측하는 LSTM 모델을 구현하였습니다.

 

data: 캐글 대회 중 하나인 "Quora Question Pairs"

(단, 데이터 전처리는 다루지 않습니다.)

 

import tensorflow as tf
from sklearn.model_selection import train_test_split # 데이터 셋 분할
import numpy as np
import pandas as pd
import json

train_input, test_input, train_label, test_label = train_test_split(input_data, label_data, test_size=0.2, random_state=2019)

VOCAB_SIZE = input_data.max()+1
WORD_EMBEDDING_DIM = 64
BUFFER_SIZE = 10000
BATCH_SIZE = 16

train_dataset = tf.data.Dataset.from_tensor_slices((train_input, train_label))
test_dataset = tf.data.Dataset.from_tensor_slices((test_input, test_label))

train_dataset = train_dataset.shuffle(BUFFER_SIZE)
train_dataset = train_dataset.batch(BATCH_SIZE)

test_dataset = test_dataset.batch(BATCH_SIZE)

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(VOCAB_SIZE, WORD_EMBEDDING_DIM),    # 자연어 처리 핵심 함수
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64, return_sequences=True)),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
              
# 모델 훈련
history = model.fit(train_dataset,
                    epochs=10,
#                     validation_data=test_dataset
                   )

 

[결과]

(케글에서 제공하는 test 데이터에 대한 결과는 케글에 제출하면 확인 가능합니다.)

 

[train_accuracy]
[train loss]

 

여기에서는 단층의 얕은 모델을 만들어서 유사도를 측정하였습니다.

 

추가로 더 깊은 모델을 만들어서 성능을 높여 보세요~


LSTM 이론 출처: 딥러닝의 정석

반응형