Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

Zorba blog

RNN(Recurrnet Neural Neetwork) 본문

Machine Learning

RNN(Recurrnet Neural Neetwork)

Zorba blog 2022. 8. 6. 11:49

RNN의 등장배경

피드포워드 신경망의 문제점

- 단방향인 신경망이기 때문에 구성이 단순하여 구조를 이해하기 쉽고, 많은 문제에 응용할 수 있다는 장점이 있지만

- 시계열 데이터를 잘 다루지 못한다는 단점이 있음 -> 그래서 순환 신경망(RNN) 이 등장.

 


RNN(순환신경망) 이란

순환하는 신경망

- RNN의 특징은 순환하는 경로가 있다는 것.

- 이 순환 경로를 따라 데이터는 끊임없이 순환.

- 데이터가 순환되기 때문에 과거의 정보를 기억하는 동시에 최신 데이터로 갱신될 수 있음.

 

순환 구조 펼치기

- RNN 계층의 순환 구조를 펼침으로써 오른쪽으로 진행하는 피드포워드 신경망과 같은 구조.

- RNN에서는 다수의 RNN 계층 모두가 실제로는 '같은 계층'인 것이 피드포워드 신경망과의 차이점.

- 각 시각의 RNN 계층은 그 계층으로의 입력과 전의 RNN 계층으로부터의 출력을 받음. 그리고 이 두 정보를 바탕으로 현 시각의 출력을 계산.

 

- RNN에는 가중치가 2개 있음.

- 입력 x를 출력 h로 변환하기 위한 가중치 Wx.

- 1개의 RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치 Wh.

- ht는 다른 계층을 향해 위쪽으로 출력되는 동시에, 다음 시각의 RNN 계층을 향해 오른쪽으로도 출력.

 

Hyperbolic Tangent

- Hyperbolic tangent 함수는 Sigmoid 함수의 대체제로 사용될 수 있는 활성화 함수.

- Sigmoid와 비교하여 tanh는 출력 범위가 더 넓고 경사면이 큰 범위가 더 크기 때문에 더 빠르게 수렴하여 학습하는 특성.


RNN의 Backpropagation

BPTT(Backpropagation Through Time)

- 위의 그림에서 보듯이 순환 구조를 펼친 후의 RNN에는 피드포워드 오차역전파법을 적용할 수 있음.

- 즉, 먼저 순전파를 진행하고 이어서 역전파를 수행하여 원하는 기울기를 구할 수 있음.

- 여기서의 오차역전파법은 '시간 방향으로 펼친 신경망의 오차역전파법' 이라는 뜻으로 BPTT(Backpropagation Through Time)라고 함.

 

Truncated BPTT

- 시계열 데이터의 식나 크기가 커지는 것에 비례하여 BPTT가 소비하는 컴퓨팅 자원도 증가.

- 또한 시간 크기가 커지면 역전파 시에 기울기 값이 조금씩 작아져서 0에 가까워지는 문제도 발생.

*Vanishing Gradient Problem : 신경망을 통과할 때마다 기울기 값이 조금씩 작아져서 0에 가까워지는 문제.

- 이런 문제를 해결하기 위해 신경망 연결을 적당한 길이로 '끊는다'.

- 시간축 방향으로 너무 길어진 신경망을 적당한 지점에서 잘라내 여러 개로 만든다는 아이디어

- Truncated BPTT에서는 신경망의 연결을 끊지만, 제대로 구현하려면 '역전파'의 연결만 끊고, '순전파'의 연결은 반드시 그대로 유지 해야함. 즉, 순전파의 흐름은 끊어지지 않고 전파.

- 길이가 1,000인 시계열 데이터가 있다고 가정. RNN 계층을 펼치게 되면 계층이 가로로 1,00개나 늘어선 신경망.

- 순전파의 연결은 유지한 채 역전파의 연결만 적당한 지점에서 끊음.

- 각각의 블록 단위로, 미래의 블록과는 독립적으로 오차역전파법을 완성.

 

- 위의 그림처럼 Truncated BPTT에서는 데이터를 순서대로 입력해 학습.

- 이런 식으로 순전파의 연결을 유지하면서 블록 단위로 오차역전파법을 적용.

 


RNN 구현

RNN 계층

- 구현해야 할 것은 결국 가로 방향으로 성장한 신경망.

- Truncated BPTT 방식의 학습을 따른다면, 가로 크기가 일정한 일련의 신경망.

- 우리가 다룰 신경망은 길이가 T인 시계열 데이터를 입력으로 받고, (T는 임의의 값), 각 시각의 Hidden State(은닉 상태)를 T개 출력.

- 먼저 RNN 한 단계를 처리하는 클래스를 RNN이란 이름으로 구현.

- 이 RNN 클래스를 이용하여 T개 단계의 처리를 한꺼번에 수행하는 계층을 TimeRNN이란 이름의 클래스로 완성.

- 데이터를 미니배치로 모아서 처리.

- 계산할 데이터의 형상 확인.(미니배치 크기가 N, 입력 벡터의 차원수가 D, 은닉 상태 벡터의 차원수가 H)

 

RNN 계층의 순전파

 

__init__()

- RNN의 초기화 메서드는 가중치 2개와 평향 1개를 인수로 받음.

- 인수로 받은 매개변수를 인스턴스 변수 params에 리스트로 저장.

- 각 매개변수에 대응하는 형태로 기울기를 초기화한 후 grads에 저장.

- 마지막으로 역전파 계산 시 사용하는 중간 데이터를 담을 cache를 None로 초기화.

 

forward()

- 순전파인 forward 메서드는 입력 x와 이전 층의 h_prev를 인수로 받음.

- 그 다음은 RNN 계층의 계산 그래프 상의 과정을 코드로 옮긴 것.

 

 

RNN 계층의 역전파

(1) dh(next)

backward()

- backward()는 다음 층의 역전파인 dh_next를 인수로 받음.

- __init__()에서 역전파 계산을 위해 미리 저장해놓은 cache 변수로부터 x, h_prev, h를 받아옴.

 

(2) dtanh

backward()

- tanh의 미분 계산에 따라 dtanh를 계산.

 

(3) 덧셈 노드

backward()

- 역전파를 그대로 흘려보냄.

- 여기서는 미니배치 단위 학습을 고려해서 만든 코드이므로 db는 NxH의 형상이라고 고려.

- 편향의 역전파는 데이터를 단위로 한 축인 axis=0의 총합을 구함.

 

(4) 곱셈 노드

backward()

- 상류에서 들어온 값에 순전파 때의 입력 신호들을 '서로 바꾼 값'을 곱하면 됨.

 

Comments