NLP 자연어처리를 위한 RNN 알고리즘 코드 기초 (4) - 심층 RNN
NLP 자연어처리를 위한 RNN 알고리즘 코드 기초 (3) - 심층 RNN NLP 자연어 처리를 위한 RNN 기초 (2) NLP 자연어 처리를 위한 딥러닝 RNN 기초 (1) RNN RNN은 Recurrent Neural Network 의 줄임말로 순환 신경망..
richdad-project.tistory.com
층 정규화(Layer Normalization)
긴 시퀀스를 활용해서 RNN 신경망 모델로 구현하면 불안정한 그레디언트 문제가 발생합니다. 그레이던트의 소실, 폭주 혹은 긴 훈련 시간, 불안정한 훈련 등 다양한 문제에 봉착할 수 있습니다. 이런 긴 시퀀스를 처리하기 위해서 다양한 해결방법이 있지만 그 중 층 정규화에 대해 먼저 살펴보겠습니다.
층 정규화는 RNN 모델 각 층 사이에서 feature dimention에 대해 정규화하는 방법입니다. 즉, 각 타임 스텝 사이에서 층 정규화를 통해 긴 시퀀스 데이터를 학습할 때 생기는 정보 손실과 불안정한 그레디언트를 예방할 수 있습니다. 간단하게 구현해 보겠습니다.
class LNSimpleRNNCell(tf.keras.layers.Layer):
def __init__(self, units, activation='tanh', **kwargs):
super().__init__(**kwargs)
# state는 이전 타임 스템의 은닉층 상태를 담은 매개변수로서
# 하나 이상의 텐서를 담고 있다.
# 각 state_size와 output_size는 unit 개수로 맞춰준다
self.state_size = units
self.output_size = units
# SimpleRNN Cell을 구성하는데 활성화 함수가 없는 이유는
# 이전 스텝의 결과(output)와 현재 input(state, 은닉층)을 선형 연산 후 활성화 함수 이전에 층 정규화를 수행하기 위해서힙니다.
self.simple_rnn_cell = tf.keras.layers.SimpleRNN(units, activation=None)
# 각 타임 스텝마다 층 정규화가 이뤄질 수 있도록 설정
self.layer_norm = tf.keras.layer.LayerNormalization()
# 앞에서 설정하지 않았던 활성화 함수를 층 정규화 이후에 세팅합니다.
self.activation = tf.keras.activations.get(activation) # 탄젠트 함수를 activation으로 사용
def call(self, inputs, states):
# SimpleRNN 셀을 사용하여 현재 입력(inputs)과 이전 은닉 상태(states)의 선형 조합을 계산합니다.
# 여기서 출력은 은닉 상태와 동일합니다. 즉, new_stats[0] == outputs
# 나머지 new_stats는 무시해도 괜찮음
outputs, new_states = self.simple_rnn_cell(inputs, states)
# 층 정규화와 활성화 함수 차례대로 적용
norm_outputs = self.activation(self.layer_norm(outputs))
# 출력을 두번 반환
# 하나는 출력, 다른 하나는 새로운 은닉 상태
return norm_outputs, [norm_outputs]
# 위 사용자 정의 Cell을 사용하려면 tf.keras.layers.RNN 층을 만들어 이 class 객체를 전달하면 됩니다.
model = tf.keras.models.Sequential([
tf.keras.layers.RNN(LNSimpleRNNCell(20), return_sequences=True, input_shape=[None,1]),
tf.keras.layers.RNN(LNSimpleRNNCell(20), return_sequences=True),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(10))
])
위처럼 층 정규화 방법 외에도 dropout 비율 정의를 통해서도 긴 시퀀스를 다루기 위해 불안정한 그레디언트 문제를 감소할 수 있습니다. 그럼, 이제 단기 기억 문제에 대해 알아보고 이에 대한 방안인 LSTM Cell에 대해 알아보겠습니다.
LSTM
RNN 모델에서 타임 스텝이 계속 진행할수록 처음 타임 스텝에서 가져온 시퀀스 데이터의 정보들이 소멸됩니다. 즉, 단기 기억에만 머물게 되는 문제가 발생합니다. 이 문제를 해결하기 위해 장기기억을 담당하는 Cell이 개발됐습니다. 바로 LSTM입니다.
장단기 메모리 셀 즉, LSTM Cell은 훈련을 빠르게 진행하고, 시퀀스 데이터의 장기간 의존성을 유지할 것입니다. keras에서 구현은 간단합니다.
# 간단히 LSTM Cell 사용
model =tf.keras.models.Sequential([
tf.keras.layers.LSTM(20, return_sequences=True, input_shape=[None, 1]),
tf.keras.layers.LSTM(20, return_sequences=True),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(10))
])
# RNN 층에 LSTMCell을 매개변수로 지정
model = tf.keras.models.Sequential([
tf.keras.layers.RNN(tf.keras.layers.LSTMCell(20), return_sequences=True, inpit_shape=[None,1]),
tf.keras.layers.RNN(tf.keras.layers.LSTMCell(20), return_sequences=True)
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(10))
])
그런데 GPU 사용을 고려할 때, LSTMCell이 최적화 돼 있어서 일반적으로는 LSTMCell을 직접사용하고, 사용자 정의 Cell을 만들 때는 RNN layer를 사용하는게 일반적입니다.
LSTM Cell의 작동 구조는 매우 복잡합니다.
키포인트는 LSTM 네트워크에서 장기 상태로 저장할 값, 버릴 값, 읽어드릴 값을 학습하는 것입니다. 이전 장기 기억인 (Cell) state는 삭제 게이트를 지나서 일부 정보를 손실하고, 입력 게이트를 지나 선택된 정보들을 추가합니다. 이렇게 만들어진 새로운 장기 기억은 다음 장기 기억(Next Cell State)으로 전달됩니다. 그래서 각 타임 스텝 마다 일부 정보는 손실되고, 추가됩니다. 또한 이 새롭게 만들어진 장기 기억은 tanh 활성화 함수를 거쳐, 출력 게이트를 통과합니다. 이렇게 해서 만들어진 단기 상태가 Output(\(h_t\)) 값으로 전달됩니다.
간략히 정리해보면 LSTM 네트워크는 중요한 입력은 인식하고, 장기 상태를 최적의 정보로 유지하기 위해 보존하고, 필요할 때마다 이를 추출하며 학습합니다. 이런 LSTM 모델은 긴 텍스트, 오디오 등 장기 패턴을 발견하는 데 우수한 성능을 보이고 있습니다.
LSTM 변종 GRU
GRU 셀은 LSTM 셀의 변종 버전으로 구조가 간소화되고, 유사하게 작동합니다. 간소화된 내용을 확인해 보면, LSTM 셀은 새로운 장기 기억과 은닉 상태 값 2개가 전달됐습니다. GRU는 이 2개를 합쳐서 하나의 벡터 값으로 전달됩니다. 그리고 하나의 게이트 제어기가 삭제 게이트와 입력 게이트 역할을 동시에 수행합니다. 마지막으로 출력 게이트가 없습니다. 즉, 전체 타임 스텝마다 해당 state 벡터가 출력됩니다. 그래서 새로운 게이트 제어기가 만들어졌는데 각 타임 스텝에서 생성한 state 벡터 중 어떤 값을 main layer에 노출시킬지 결정하는 게이트 제어기가 있습니다.
GRU 셀은 RNN의 대표적인 성공 모델입니다. 한가지 아쉬운 점은 기존 RNN, LSTM에 비해 긴 시퀀스를 잘 다루긴 하지만, 매우 제한적인 단기 기억을 가지고 있습니다. 이 문제를 해결하기 위한 방법은 다음 포스팅에서 소개하겠습니다.
NLP 자연어처리를 위한 RNN 알고리즘 코드 기초 (4) - 심층 RNN
NLP 자연어처리를 위한 RNN 알고리즘 코드 기초 (3) - 심층 RNN NLP 자연어 처리를 위한 RNN 기초 (2) NLP 자연어 처리를 위한 딥러닝 RNN 기초 (1) RNN RNN은 Recurrent Neural Network 의 줄임말로 순환 신경망..
richdad-project.tistory.com
'AI > NLP' 카테고리의 다른 글
[엘라스틱서치] 설치 및 세팅 (0) | 2023.01.07 |
---|---|
NLP 자연어처리를 위한 RNN 알고리즘 코드 기초 (4) - 심층 RNN (0) | 2021.12.17 |
NLP 자연어처리를 위한 RNN 알고리즘 코드 기초 (3) - 심층 RNN (0) | 2021.12.16 |
NLP 자연어 처리를 위한 RNN 기초 (2) (0) | 2021.12.15 |
NLP 자연어 처리를 위한 딥러닝 RNN 기초 (1) (0) | 2021.12.14 |