-
[순환신경망] RNN의 개념IT/AI 2022. 10. 18. 00:27
RNN이란
RNN(Recurrent Neural Network)을 직역하면 '순환하는 신경망'으로 이전 데이터의 정보 혹은 이전 계층의 출력 값을 순환시킴으로 전체 맥락의 정보를 기억할 수 있도록 설계된 신경망입니다.
기존의 데이터가 한 방향으로만 흐르는 "Feed forward" 방식의 신경망이 시계열 데이터 분석에 취약했던 한계점을 보완하기 위해 고안된 신경망으로, 이전 맥락의 정보를 기억하는 메커니즘을 통해 시계열 데이터에 대응이 가능합니다.
RNN의 구조
RNN 계층의 순환 구조를 알아보기 위해 보다 명확한 구조로 펼쳐보면 아래와 같습니다.
위의 그림에서 각 시점의 RNN 계층을 시각 x의 RNN 계층이라 표현하고, 각 시각의 RNN 계층은 그 계층으로의 입력(Input)과 그 이전 시각 RNN 계층으로부터의 출력(Output)을 받아 현 시각의 출력을 계산합니다.
현 시각의 출력을 계산하는 수식은 아래와 같습니다.
ht : 현 시각(계층)의 출력 → 은닉 상태 혹은 은닉 상태 벡터 (Hidden state or Hidden state vector)라고도 함.
ht-1 : 직전 시각(계층)의 출력
Wh : RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치
Wx : 입력 x를 출력 h로 변환하기 위한 가중치수식을 살펴보면 현재의 출력(ht)은 한 시각 이전 출력(ht-1)으로 계산됨을 알 수 있습니다. 즉, RNN은 h라는 '상태'를 가지고 있으며 현재의 입력값과 이전 '상태' 값을 토대로 '상태'를 갱신한다고 볼 수 있습니다.
그래서 RNN 계층을 '상태를 가지는 계층' 혹은 '메모리(기억력)가 있는 계층'이라고 합니다.
RNN 클래스를 python 코드로 구현하면 아래와 같습니다.
class RNN: def __init__(self, Wx, Wh, b): # 가중치 및 편향을 변수 params에 저장 self.params = [Wx, Wh, b] # 각 매개변수에 대응하는 형태로 기울기 초기화 self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] # Back Propagation에 사용할 cache 초기화 self.cache = None def forward(self, x, h_prev): # 매개변수 대입 Wx, Wh, b = self.params # 현 계층의 출력 값 계산 수식 t = np.matmul(h_prev, Wh) + np.matmul(x, Wx) + b h = np.tanh(t) # Back Propagation을 위한 변수 저장 self.cache = (x, h_prev, h_next) # 현 계층 출력 값 반환 return h
Time RNN
* Time RNN이란 말은 정식 명칭이 아닌 "Deep Learning from scartch 2" 도서의 독자적인 명명규칙입니다.
RNN을 확장하면 T개의 RNN 계층으로 구성 즉, T개 단계분의 작업을 한꺼번에 처리하는 계층을 생각할 수 있습니다.
예를 들면 기존 RNN 모델의 경우 각 단어로 부터 해당 문장의 긍정 / 부정을 추론하는 모델이라면,
Time RNN은 문장들로부터 글 전체의 긍정 / 부정을 추론하는 모델이 될 수 있습니다.RNN과 마찬가지로 Time RNN의 순환구조를 펼쳐보면 아래와 같다.
'IT > AI' 카테고리의 다른 글
[순환신경망] LSTM의 개념 (0) 2022.10.20 [Tensorflow, Keras] LSTM 실습 _ 아마존 리뷰 감성 분석(NLP) (0) 2022.10.20 [Tensorflow, Keras] SimpleRNN 실습 (0) 2022.10.19 [순환신경망] RNN의 문제점 (기울기 소실, 기울기 폭주 = Gradient Vanishing & Exploding) (1) 2022.10.19 행렬 곱셈 vs 아다마르 곱셈 (Hadamard product vs Matrix multiplication) (0) 2022.10.18