[딥러닝] 순환신경망(RNN)과 LSTM, GRU
- 인공지능 및 데이터과학/머신러닝 및 딥러닝
- 2021. 6. 1.
순환신경망(RNN)의 개념
순환신경망(Recurrent Neural Network, RNN)은 입력과 출력을 시퀀스(Sequence) 단위로 처리하는 모델이다. 여기서 시퀀스란 연관된 연속의 데이터를 의미하며, 시계열 데이터에 적합한 신경망 모델이라 할 수 있다.
ex) 자연어 처리, 순서를 가지는 정보, 연속적인 시간 간격으로 배치된 데이터
심층 신경망(Deep Neural Network, DNN)의 경우 파라미터들이 모두 독립적이었으나, RNN의 파라미터들은 모두 공유하는 것이 특징이다.
장기 의존성 문제점 (Long-Term Dependency Problem)
일반적인 RNN의 경우 짧은 시퀀스를 처리할 경우 유리하며, 관련 정보와 그 정보를 사용하는 지점 사이 거리가 멀어지는 경우 학습 능력이 현저하게 저하된다.
이 문제의 원인은 데이터의 시퀀스가 길어지면 RNN의 역전파(Backpropagation) 알고리즘인 BPTT(Backpropagation Through Time)가 장기 의존성 학습에 어려움이 있기 때문인데 가중치를 업데이트 하는 과정에서 1보다 작은 값들이 계속 곱해지면서 기울기가 사라지는 기울기 소실 문제(Vanishing Gradient Problem)가 발생하기 때문이다.
기울기가 사라지게 되면 과거 정보가 현재의 학습에 영향을 미치지 못하게 되면서 RNN의 퍼포먼스가 크게 저하 되기에 RNN의 문제점을 해결하기 위해서 RNN의 변형 알고리즘들이 나타났는데 대표적으로 LSTM과 GRU 등이 있다.
장단기 메모리 LSTM(Long Short-Term Memory)
LSTM은 제프 호크라이터와 유르겐 슈미트후버가 1997년에 소개했고 아직까지 RNN을 개선한 가장 성공적인 모델로 평가 받고 있다. 이 모델은 훈련이 빠르게 수렴되고 데이터의 장기간 의존성을 감지한다.
LSTM은 장기 의존성을 해결하기 위해서 셀 상태(Cell state)라는 구조를 만들었다. 데이터를 계산하는 위치에 입력(Input), 망각(Forget), 출력(Output) 게이트 3가지가 추가되어 각 상태 값을 메모리 공간 셀에 저장하고, 데이터를 접하는 게이트 부분을 조정하여 불필요한 연산, 오차 등을 줄여 장기 의존성 문제를 일정 부분 해결한다.
Forget Gate Layer
- 과거의 정보를 버릴지 말지를 결정하는 게이트
- Sigmoid 활성화 함수를 통해 0 ~ 1 사이의 값을 출력한다
Input Gate Layer
- 새로운 정보가 Cell State에 저장이 될지 결정하는 게이트
Output Gate Layer
- 상태를 바탕으로 시그모이드 층에 input 데이터를 태워 상태의 어느 부분을 출력으로 내보낼지 결정하는 게이트
Update Cell State
- forget gate와 input gate에서 출력된 값들을 cell state로 업데이트
GRU(Gated Recrurent Unit)
GRU는 2014년에 발표되었으며 LSTM과 같이 RNN의 장기 의존성 문제를 해결하기 위한 알고리즘으로 LSTM 변형 모델로 구조가 크게 다르지 않지만, update gate와 reset gate만 있고 output gate가 없는 구조이기 때문에 LSTM보다 매개변수가 적다. 대위법 음악 모델링 및 음성 신호 모델링에서의 성능은 LSTM과 유사하지만 소규모 데이터 세트에서는 더 나은 성능을 보여준다.
GRU가 LSTM을 변형한 최신 알고리즘이지만 둘 간의 성능 차이가 명확히 나타나고 있지 않기에 연구 및 프로젝트에 맞게 성능을 직접 테스트 해보고 해당 사이트에 맞는 모델을 사용해야 한다.
현재 RNN을 비롯하여 LSTM과 GRU 등을 활용한 연구들이 많이 등장하고 있다. 특히 번역을 비롯해서 챗봇 등에서 주로 활용되며 전자 상거래 데이터에 적용하여 성능 평가를 한 실험이 있을 정도로 다양한 분야에서 활용이 되고 있다.
'인공지능 및 데이터과학 > 머신러닝 및 딥러닝' 카테고리의 다른 글
[머신러닝] 확률적 경사하강법(Stochastic Gradient Descent, SGD) (0) | 2021.06.05 |
---|---|
[머신러닝] 옵티마이저(Optimizer)란? (0) | 2021.06.05 |
머신러닝의 작업 플로우(Workflow) (0) | 2021.05.24 |
코사인 유사도 (Cosine Similarity) 개념과 Python으로 구현 (0) | 2021.03.26 |
[Java] 직접 구현해본 나이브 베이즈 분류기 #2 (코드포함) (0) | 2020.12.24 |