HAZEL

[Deep Learning 02 ] LSTM ( Long Short - Term Memory ) 본문

DATA ANALYSIS/ML & DL

[Deep Learning 02 ] LSTM ( Long Short - Term Memory )

Rmsid01 2020. 12. 21. 10:15

Deep Learning 02.

1. Vanilla RNN과 LSTM의 차이!? 


Vanilla RNN의 기울기 소실 문제로, LSTM을 많이 쓴다고 저번 포스팅에 기록을 했었다.

2020/12/20 - [DATA/ML & DL] - [Deep Learning 01 ] 순환 신경망(Recurrent Neural Network, RNN) / 순차 데이터(Sequential Data) / Vanilla Recurrent Network

 

[Deep Learning 01 ] 순환 신경망(Recurrent Neural Network, RNN) / 순차데이터(Sequential Data) / Vanilla Recurrent Netwo

Deep Learning 01. 1. 순차 데이터 ( Sequential Data ) 001. 순차데이터의 개념 순차데이터 ( Sequential Data ) : 순서가 의미가 있으며, 순서가 달라지는 경우 의미가 손상되는 데이터를 의미한다. 순차 데이터..

hazel01.tistory.com

Vanilla RNN은 왼쪽의 모형처럼 단순하게 생겼다. 그에 비해 LSTM은 굉장히 복잡한 모형으로 생겼다.

 

2. LSTM( Long Short - Term Memory ) 의 구조 


: 기억할 것은 오래 기억하고 잊을 것은 빨리 잃어버리는 알고리즘이다. 

LSTM의 구조를 한장으로 정리하면 이렇게 된다. 

[ 한페이지로 정리하고 싶어서 무리했다.. ㅠㅠ

 - 사진을 클릭하면 확대해서 수식을 볼 수 있습니다. 공부를 하면서 정리한 것이라서, 틀린 부분이 있을 수도 있습니다.

   댓글남겨주시면 틀린 부분 수정하겠습니다. - ]

 

기존의 RNN은 Hidden State만 존재한다. 그러나, LSTM은 이름 그대로 오래 기억할 것은 오래 기억하고 빨리 잃어버릴 것은 빨리 잃어버리는 구조다. 이러한 구조를 가능하게 하는 것이 Cell State이다.

즉, LSTM은 Hidden State와 Cell State 두개가 존재한다. 

 

이 Cell state와 Hidden State의 식을 보면, 여러 함수가 또 들어가 있다..

그 함수들은 바로, forget gate , input gate, output gate 등이다. 

 

- forget gate : 얼마나 잊을지를 결정해 줌 , ‘과거 정보를 잊기’를 위한 게이트입니다. h_t-1와 x_t를 받아 시그모이드를 취해준 값이 바로 forget gate가 내보내는 값이 됩니다. 시그모이드 함수의 출력 범위는 0에서 1 사이이기 때문에 그 값이 0이라면 이전 상태의 정보는 잊고, 1이라면 이전 상태의 정보를 온전히 기억하게 됩니다.

 

- Input gate : 새롭게 추출한 특징을 얼마나 사용할지 결정, '현재 정보를 기억하기’ 위한 게이트입니다. h_t−1과 x_t를 받아 시그모이드를 취하고, 또 같은 입력으로 하이퍼볼릭 탄젠트를 취해준 다음 Hadamard product 연산을 한 값이 바로 input gate가 내보내는 값이 됩니다. [ 글 출처 : ratsgo's blog ]

 

- Output gate : 출력을 얼마나 내보낼지 결정  

 

why? sigmoid 활성함수를 사용하는가?

: 얼마나 잊을지, 기억할지 결정하기 위해서 sigmoid를 사용하면 값이 0~1로 변하게 된다. 

  이 값을 나중에 n-1의 cell state값과 곱해서 값을 조정해주는 역할을 한다.  

 

3. LSTM( Long Short - Term Memory ) 코드


Tensorflow - 2.2.0  의 keras를 통해서 구현한 코드 중

tf.keras.layer : 이 함수 안에는 Vanilla Recurrent Network을 구현할 수 있는 'SimpleRNN' 뿐만 아니라,

LSTM을 구현할 수 있는 'LSTM'도 있다.

class Lstm(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.emb = tf.keras.layers.Embedding(NUM_WORDS, 16) 
        self.rnn = tf.keras.layers.LSTM(32) 
        self.dense = tf.keras.layers.Dense(2, activation = 'softmax') 
        
    def call(self, x , training = None, mask = None):
        x = self.emb(x)
        x = self.rnn(x)
        return self.dense(x)

참고 : ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/

www.fastcampus.co.kr/data_online_deep