본문 바로가기
IT 도서/Pytorch로 시작하는 딥 러닝 입문

09. 순환 신경망(Recurrent Neural Network)

by 이민우 2021. 3. 3.
728x90
반응형

wikidocs.net/60690

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

*해당 글은 학습을 목적으로 위의 포스팅 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인은 위의 링크에서 확인하실 수 있습니다.

 

 

 

순환 신경망 (Recurrent Neural Network, RNN)

  • 입력과 출력이 모두 시퀀스인 시퀀스 모델이다.
  • RNN은 시퀀스 모델 중 가장 시본적인 시퀀스 모델이다.
  • 입력에서 출력으로, 한 방향으로만 향하는 피드 포워딩 네트워크와 달리 RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 출력값을 출력층으로 보내며, 다시 은닉층 노드의 다음 계산의 입력으로 보낼 수 있다.
  • 은닉층의 메모리 셀은 각각의 시점에서 바로 이전 시점에서의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하는 재귀적 활동을 하고 있다.
  • 메모리 셀이 출력층 방향으로 또는 다음 시점 t+1의 자신에게 보내는 값을 은닉 상태(hidden state)라고 한다.
  • 다시 말해, t 시점의 메모리 셀은 t-1 시점의 메모리 셀이 보낸 은닉 상태를 입력값으로 사용한다.

 

 

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

  • RNN은 여러 가지 종류의 모델을 가지고 있다.
  • 다 대 일은 스팸 메일 분류와 같은 분류에서 사용된다.
  • 다 대 다 모델의 경우에는 입력 문장으로부터 대답 문장을 출력하는 챗봇이나 번역기, 개체명 인식 혹은 품사 태깅 등이 포함된다.

*시퀀스 레이블링 : RNN의 다대다 모델로, 지도 학습에 축하며 단어에 대해 레이블을 붙여준다.

  • RNN의 수식은 다음과 같다.

https://wikidocs.net/60690

  • h(t)를 계산하기 위한 활성화 함수로는 주로 tanh 함수가 사용되지만, ReLU로 바꿀 수 있다.

 

 

깊은 순환 신경망

  • 다수의 은닉층을 가진 RNN
  • nn.RNN()의 인자인 num_layers에 값을 전달하여 층을 쌓을 수 있다.

 

 

양방향 순환 신경망

  • 시점 t의 출력값을 예측하기 위해 이전 시점의 데이터 뿐 아니라 다음 시점의 데이터도 활용하여 예측하는 방법
  • nn.RNN()의 인자인 bidirectional을 True로 설정하면 사용할 수 있다.

 

 

파이토치의 nn.RNN()

  • torch.nn.RNN( input_size, hidden_size, num_layers, nonlinearity = 'tahn', bias = True, batch_first = False, dropout = 0, bidirectional = False)
import torch
from torch.nn import RNN

inputs = torch.Tensor(1, 10, 5) # shape = [1, 10, 5] (배치 크기, 시퀀스 길이, 매 시점바다 들어가는 입력)

model = RNN(5, 8, batch_first = True)

outputs, _status = model(inputs) #모든 시점의 은닉 상태와 마지막 시점의 은닉 상태 반환
print(outputs.shape) #[1 10 8] 10개의 시점(시퀀스)에 대한 각 8의 은닉 상태들 반환
print(_status.shape) #[1 1 8]  마지막 시점(단어)에 대한 8의 은닉 상태


#----레이어 중첩
model = RNN(5, 8, num_layers = 2, batch_first = True)

outputs, _status = model(inputs) #모든 시점의 은닉 상태와 마지막 시점의 은닉 상태 반환
print(outputs.shape) #[1 10 8] 10개의 시점(시퀀스)에 대한 각 8의 은닉 상태들 반환 (똑같음)
print(_status.shape) #[2 1 8]  마지막 시점(단어)에 대한 8의 은닉 상태. 그런데 레이어가 두 개라 두 개 반환


#----양방향
model = RNN(5, 8, num_layers = 2, batch_first = True, bidirectional = True)

outputs, _status = model(inputs) #모든 시점의 은닉 상태와 마지막 시점의 은닉 상태 반환
print(outputs.shape) #[1 10 16] 10개의 시점(시퀀스)에 대한 각 8의 은닉 상태들 반환. 그런데 은닉 상태가 두 배
print(_status.shape) #[4 1 8]  마지막 시점(단어)에 대한 8의 은닉 상태. 그런데 레이어가 두 개라 두 개 * 양방향이라 두 개

 

 

 

 

장단기 메모리 (Long Short-Term Memory, LSTM)

  • 평범한 RNN을 바닐라 RNN이라고 한다. RNN은 출력의 결과가 이전의 계산 결과에 의존하는데, RNN은 비교적 짧은 시퀀스에 대해서만 효과를 보인다.
  • 즉, 타임스텝이 길어질수록 앞의 정보가 뒤로 충분히 전달되지 못하는 현상이 발생한다.
  • 이를 장기 의존성 문제라고 한다.
  • LSTM은 이러한 문제를 보완한다. 은닉층의 메모리 셀에 입력 게이트, 망각 게이트, 출력 게이트를 추가하여 불필요한 기억을 지우고, 기억해야 할 것을 정한다.
  • LSTM은 은닉 상태를 계산하는 방식이 RNN보다 더 복잡해졌으며 셀 상태라는 값을 표현했다. 시점 t에서의 셀 상태는 C(t)로 표현한다.
  • LSTM은 긴 시퀀스의 입력을 처리하는 데 탁월한 성능을 보인다.
  • 파이토치에서는 nn.LSTM()을 사용하여 구현할 수 있다. 사용법은 RNN과 같다.
  • LSTM의 구조는 다음과 같다.

  1. 입력 게이트 : 현재 정보를 기억하기 위한 게이트. 시그모이드를 거쳐 0~1의 값과 tanh을 거친 -1~1의 값을 출력
  2. 삭제 게이트 : 기억을 삭제하기 위한 게이트. 시그모이드를 거쳐 0~1이 나오는데, 0에 가까울수록 많이 삭제된 것.
  3. 셀 상태 : 입력 게이트에서 선택된 기억을 삭제 게이트의 결과값과 더한 값.
  4. 출력 게이트와 은닉 상태 : 현재 시점 t의 은닉 상태를 결정
728x90
반응형