HAZEL

[Deep Learning 03 ] GRU ( Gated Recurrent Unit ) 본문

DATA ANALYSIS/ML & DL

[Deep Learning 03 ] GRU ( Gated Recurrent Unit )

Rmsid01 2020. 12. 26. 09:23

Deep Learning 03. GRU ( Gated Recurrent Unit )

1. Vanilla RNN vs LSTM vs GRU ( Gated Recurrent Unit )


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

GRU는 LSTM의 기능을 가졌지만, 단순화 시킨 모습을 가지고 있다. 

 

2. GRU ( Gated Recurrent Unit )의 구조 


: GRU는 Cell State가 없고, Hidden State만 존재하는 구조이다. 

: Forget Gate 와 Input Gate가 결합되어있다.

: Reset Gate가 추가되어있다. 

 

- Reset Gate : 이전 Hidden state를 얼마나 사용할지 정하는 역할, 새로운 feature을 뽑을 때얼마나 가져오는지 정하는 것 . Sigmoid 활성함수로 0~1의 값을 가짐. 0에 가까운 값이 되면 ‘Reset’이 된다.

Forget Gate : hidden stateinput에 활성함수(sigmoid)를 지나친다그 결과(0~1)를 곱해서 얼마나 잊을지를 결정해준다 LSTM과 동일하게 Forget Gate를 사용한다Grugorget gatelstmforget gate  output gate를 겸한다.

 Input Gate : Forget Gate1에서 빼서 Input Gate로 사용한다잊은 것을 다시 채우는 느낌이다.

hidden stat: Reset gate,Forget Gate모두 적용하여 계산한 것. LSTMCell statehidden state역할을 겸한다.

 

3. GRU ( Gated Recurrent Unit )코드


RNN과 LSTM을 구현한 것처럼 

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

tf.keras.layer : 이 함수 안에 GRU 를 입력하면 바로된다. 

class Gru(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.emb = tf.keras.layers.Embedding(NUM_WORDS, 16) 
        self.rnn = tf.keras.layers.GRU(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)