코딩 다이어리
RNN(Recurrent Neural Network, 순환 신경망) 본문
RNN(Recurrent Neural Network)란?
- Sequence data를 처리하는 인공신경망
- Sequence data는 자연어나 음성신호, 주식과 같이 연속적인 시퀀스 데이터
- 순환 신경망은 내부의 순환 구조가 포함되어 있어 시간에 의존적이거나 순차적인 데이터(Sequntial data) 학습에 활용
- 내부의 순환 구조에 의해 현재 정보에 이전 정보가 쌓이면서 정보 표현이 가능
- 데이터가 순환되기 때문에 정보가 끊임없이 갱신되는 구조
- 데이터 $ x $가 특정 시점 t의 $ x_{1} $ ~ $ x_{t} $까지 순차적인 데이터인 경우, 위의 그림처럼 전 시점의 어떤 정보를 다음 시점으로 넘겨줌
- 셀은 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드이며, 이전의 값을 기억하려고 하는 일종의 메모리 역할을 수행하기 때문에 메모리 셀이라 함
- 이전 시점의 메모리 셀이 가지는 정보, 즉 다음 시점으로 넘겨줄 정보를 hidden state라고 함
- 이전 시점 t-1의 hidden state인 $ h_{t-1} $와 현시점 $ x_{t} $를 이용해 시점 t에 대한 hidden state인 $ h_{t} $를 구함
- $ h_{t} = f(h_{t-1}, x_{t}) = \tanh(w_{h}h_{t-1}+w_{x}x_{t}+b) $
- $h_{t-1}$에hidden state에 대한 가중치를 곱하고, 입력 $x_{t}$에 대한 가중치를 곱하고 활성화 함수를 적용
- 초기 hidden state는 랜덤값을 활용하며, hidden state와 입력 데이터에 대한 가중치 matrix는 각 time step에서 동일하게 적용
- 결과 값인 $h_{t}$에 가중치를 곱해 출력값을 계산하거나 $h_{t}$를 바로 출력값 y로 사용할 수도 있음
- 위의 그림처럼 RNN 모델에 Hidden Layer를 추가해 깊은 구조의 순환 신경망 모델링이 가능
RNN의 유형
1. 일대다(one to many)
- 하나의 입력을 통해 시퀀스를 출력하는 형태로 대표적으로 하나의 image를 받아 sequence of words를 생성하는 Image Captioning이 있음
2. 다대일(many to one)
- 여러 개의 입력 데이터를 이용해 한 개의 결과를 출력하는 형태
- 어떤 문장을 통해 긍정인지 부정인지 분류하는 감성분석과 메일 내용을 통해 정상 메일인지 스팸메일인지 분류하는 스팸 메일 분류 등에 사용
3. 다대다(many to many)
- 여러 개의 입력 데이터를 통해 여러 개의 결과를 출력하는 형태로 대표적으로 챗봇이나 번역기에 많이 사용
- 개체명 인식이나 품사 태깅 등도 다대다 유형에 속함
RNN BPTT(BackPropagation Through Time)
- RNN의 학습도 다른 신경망과 같은 순서로 진행되며, 가중치 매개변수의 기울기를 효율적으로 계산할 수 있는 오차 역전파(BackPropagation)를 사용
- 동일한 Hidden Layer가 반복되어 가중치 matrix를 공유하는 구조이기 때문에 gradient를 넘겨줄 때 현재 시간 단계만이 아니라 이전 시간의 단계를 고려해야 함
- RNN에서 하나의 시퀀스를 하나의 샘플로 볼 수 있으며 위의 그림처럼 각 time step에서의 Loss의 총합을 전체 Loss로 표현
- 전체 Loss를 구하기 위해 모두 더한 것처럼 각 time step의 gradient를 더해 학습
- 전체 time step 끝에서 시작까지 전달하는 과정에서 time step이 커지면 계산량이 증가함
- 따라서 전체 time step을 일정 구간으로 나누어 BPTT를 적용하는 Truncated BPTT를 활용할 수 있음
RNN의 한계점
- RNN은 시계열 데이터의 장기 의존 관계(Long-Term Dependency)를 학습에 한계가 있음
- 길이가 길어짐에 따라 신경망을 하나 통과할 때마다 기울기 값이 조금씩 작아져서, 이전 시각 t까지 역전파 되기 전에 0이 되어 소멸하게 되는 기울기 소실(Gradient Vanishing) 문제 발생
- 또는 반대로 기울기가 너무 커지는 기울기 폭발(Gradient Exploding) 문제가 나타나면 오버플로(overflow)를 일으켜 NaN(Not a Nupber) 같은 값을 발생
- RNN 계층이 과거 방향으로 기울기를 전달함으로써 시간 방향의 의존 관계를 학습할 수 있는 것이지만 만약 이 기울기가 중간에 소멸하게 되면 거의 아무런 정보도 남지 않게 되며, 가중치 매개변수는 전혀 갱신되지 않음
- RNN 계층의 신경망 구성에 게이트를 추가해 기울기 소멸 문제를 해결
- 최근 게이트가 추가된 RNN으로 많은 신경망 구성이 제안되어 있으며, 그 대표로 LSTM(Long Short-Term Memory)과 GRU(Gated Recurrent Unit)가 있음
- 기울기 클리핑(Gradients clipping)이라는 기법을 통해 기울기 폭발 문제 해결
참고사이트
https://www.goldenplanet.co.kr/our_contents/blog?number=857&pn=
GoldenPlanet | 빅데이터 공부 한 걸음: RNN(순환 신경망)이란?
Go Beyond Data! 골든플래닛
goldenplanet.co.kr
08-05 RNN 언어 모델(Recurrent Neural Network Language Model, RNNLM)
RNN을 이용하여 언어 모델을 구현한 RNN 언어 모델에 대해서 배웁니다. ## 1. RNN 언어 모델(Recurrent Neural Network Language Model,…
wikidocs.net
https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
'머신러닝 > 딥러닝' 카테고리의 다른 글
LSTM(Long Short-Term Memor) (0) | 2023.01.27 |
---|---|
CNN (1) | 2022.12.23 |
경사하강법 (1) | 2022.12.22 |
순전파(Foward Propagation)와 역전파(Back Propagation) (0) | 2022.12.18 |
활성화 함수(Activation Function) (0) | 2022.12.08 |
Comments