상세 컨텐츠

본문 제목

Dive Into Deep Learning/RNN 소개 + 구현

심화 스터디/Dive into Deep Learning

by ㅣ찬스ㅣ 2022. 11. 27. 22:57

본문

작성자: 16기 이수찬

참고자료: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=winddori2002&logNo=221992543837

https://d2l.ai/chapter_recurrent-neural-networks/index.html

https://www.youtube.com/watch?v=6niqTuYFZLQ&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=10 

1. RNN (Recurrent Neural Network) 정의

정의: 입력과 출력을 시퀀스 단위로 처리하는 Sequence Model 로 Neural Network를 반복한다는 의미의 이름을 가지고 있다. 

Input과 Output의 길이를 다양하게 적용 가능하여 CNN 보다 더 다양한 task 의 수행이 가능하다. 

수행해야 하는 task의 필요에 따라 다양한 형태의 RNN을 구축할 수 있다.

2. RNN 거시적 구조

h는 각각 RNN 셀으로 내부의 특정 개수의 노드가 존재한다. X, O 는 각각 input, output 으로 RNN 특성상 여러개가 존재할 수 있다. U, W는 모두 weight, 즉 가중치를 의미한다. 여기서 U의 사이즈는 input size x neuron size, W의 사이즈는 neuron size x output size, 각각 행렬의 형태로 존재한다. 마지막으로 V는 전단계에 대한 정보로 이전 RNN Cell 에서 현재 RNN Cell로 값을 전달해준다.

RNN 구조의 도식화

3. RNN 미시적 구조

RNN의 구조에서 작은 신경망 하나의 작동 원리를 살펴보면 다음과 같다. x라는 input을 RNN 의 hidden state 에 공급을 하면 hidden state 내의 수치들이 input에 반영 되어 y라는 output을 내게 되어 있는 구조이다. 이때 hidden state는 old state 에 대한 이전 state과 현재 상태를 기반으로 한 자체 피드백을 기반으로 계속 업데이트가 된다. 

이 과정에서 Non-linearity 를 구현하기 위해 Vanilla RNN은 tanh 함수를 사용하여 새로운 state를 업데이트 해준다.

이러한 원리를 기반으로 똑같은 행위를 여러번 반복하면 X값과 h 값은 지속적으로 업데이트가 되고 W 행렬은 계속 동일하게 적용이 된다. 이러한 과정을 통해 RNN을 완성시킨다.

4. Multilayer RNN 

Multilayer RNN의 경우에는 각 단계마다 하나의 hidden state가 아니라 layer의 개수에 따른 여러개의 hidden state가 존재한다. RNN layer를 쌓아 올리는 개념인데 이때 2-4개의 layer개수가 가장 많이 사용된다. 입력이 들어가서 hidden state를 생성하면 이를 또 다른 RNN (hidden state)에 입력해서 다음 hidden state를 생성하는 방식이다. 

Multilayer RNN

5. Vanilla RNN Gradient 

Vanilla RNN에서 backward 과정을 수행 시 먼저 ht 에 대한 미분 값을 얻어 loss에 대한 h(t-1) 의 미분값을 계산한다. tanh과정을 패스한후 --> matmul 과정 통과 -->  (weight matrix)의 transpose의 곲 이렇게 forward 과정과 역순으로 진행된다. 

위의 과정을 각 cell 마다 반복하면 h0에 대한 gradient를 얻을 수 있다. 이때 각 cell matrix가 모두 개입을 하기 때문에 gradient가 너무 커지거나 너무 작아지는 문제가 발생한다. Exploding gradients(너무 커지는 경우)에는 gradient의 L2 Norm 과 임계값을 비교하여 최대 임계값 이내로 조정을 하면 되는 반면에 Vanishing gradients는 좀 더 복잡한 RNN Architecture를 필요로 한다. 

6. Vanishing Gradients Solution

발생원인 - 너무 긴 시퀀스의 경우 back propagation 과정 중에 활성화 함수인 tanh의 범위가 -1 에서 1 사이기 때문에 gradient가 긴 시퀀스 안에서 계속 곱해질수록 0에 수렴하는 문제가 발생

 

해결책 1) ESN

연결 순서를 랜덤으로 돌려준다. --> 가중치가 곱해지는 정도가 덜해져 0으로 수렴하는 문제를 해결한다. (근본적인 해결책이 되지는 못함

해결책 2) Weight 초기화

Weight를 초기화 시켜주어서 0으로 수렴하는 것을 막는다 --> Weight 소실이 발생하기 때문에 이 또한 근본적인 해결책이 되지는 못한다.

 

해결책3) LSTM/GRU

필요한 지점들을 취사선택하여 해당 weight들만 기억한다. Weight 소실 최소화 + 0 수렴 문제 방지 --> 근본적인 해결책

 

3-1) LSTM (Long-Short-Term-Memmory)

Hidden State와 더불어 Cell State를 기용한다. Cell State는 Forget Gate, Input Gate, Output Gate의 상호작용으로 연산된다. 

Forget Gate에서는 이전의 정보를 얼마나 기억할지 정한다.

Input Gate에서는 현재의 정보를 얼마나 기억할지, 현재 정보를 나중에 cell state에 얼마나 반영시킬지를 정한다.

Output Gate에서는 현 시점의 hidden state와 cell state를 함께 계산하여 다음 hidden state로 넘긴다.

LSTM 도식

이러한 cell state라는 개념을 도입해 긴 시퀀스에서도 gradient가 상대적으로 잘 전파 되게 한다. 다만, 과정이 보다싶이 너무 복잡하여 연산 속도가 느리다는 한계를 가진다.

 

3-2) GRU (Gated Reccurent Unit)

Reset Gate, Update Gate 2개만 사용/cell state와 hidden state를 합쳐 하나의 hidden state로 사용되어서 LSTM 연산 속도의 한계를 어느 정도 극복한다.

Reset Gate는 현시점 x 와 이전 시점 h를 활용해 이전 hidden state의 값을 얼마나 활용할 것인지 결정한다.

Update Gate는 과거와 현재의 정보를 각각 얼마나 반영하여 다음 hidden state를 출력할지 결정한다.

좀 더 단순화된 과정을 사용하여 연산에 필요한 시간은 줄여주지만 성능이 더 뛰어나다고 할 수는 없다.

7. Vanilla RNN 구현

RNN Forward 함수의 구현
RNN Backward 함수의 구현

 

관련글 더보기

댓글 영역