728x90
반응형
*해당 글은 학습을 목적으로 위의 포스팅 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.
상세한 내용 및 전체 내용 확인은 위의 링크에서 확인하실 수 있습니다.
순환 신경망 (Recurrent Neural Network, RNN)
- 입력과 출력이 모두 시퀀스인 시퀀스 모델이다.
- RNN은 시퀀스 모델 중 가장 시본적인 시퀀스 모델이다.
- 입력에서 출력으로, 한 방향으로만 향하는 피드 포워딩 네트워크와 달리 RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 출력값을 출력층으로 보내며, 다시 은닉층 노드의 다음 계산의 입력으로 보낼 수 있다.
- 은닉층의 메모리 셀은 각각의 시점에서 바로 이전 시점에서의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하는 재귀적 활동을 하고 있다.
- 메모리 셀이 출력층 방향으로 또는 다음 시점 t+1의 자신에게 보내는 값을 은닉 상태(hidden state)라고 한다.
- 다시 말해, t 시점의 메모리 셀은 t-1 시점의 메모리 셀이 보낸 은닉 상태를 입력값으로 사용한다.
- RNN은 여러 가지 종류의 모델을 가지고 있다.
- 다 대 일은 스팸 메일 분류와 같은 분류에서 사용된다.
- 다 대 다 모델의 경우에는 입력 문장으로부터 대답 문장을 출력하는 챗봇이나 번역기, 개체명 인식 혹은 품사 태깅 등이 포함된다.
*시퀀스 레이블링 : RNN의 다대다 모델로, 지도 학습에 축하며 단어에 대해 레이블을 붙여준다.
- RNN의 수식은 다음과 같다.
- 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의 구조는 다음과 같다.
- 입력 게이트 : 현재 정보를 기억하기 위한 게이트. 시그모이드를 거쳐 0~1의 값과 tanh을 거친 -1~1의 값을 출력
- 삭제 게이트 : 기억을 삭제하기 위한 게이트. 시그모이드를 거쳐 0~1이 나오는데, 0에 가까울수록 많이 삭제된 것.
- 셀 상태 : 입력 게이트에서 선택된 기억을 삭제 게이트의 결과값과 더한 값.
- 출력 게이트와 은닉 상태 : 현재 시점 t의 은닉 상태를 결정
728x90
반응형
'IT 도서 > Pytorch로 시작하는 딥 러닝 입문' 카테고리의 다른 글
08. 단어의 표현 방법 (0) | 2021.03.02 |
---|---|
07. 자연어 처리의 전처리 (0) | 2021.03.02 |
06. 합성곱 신경망 (Convolution Neural Network) (0) | 2021.03.02 |
05. 인공 신경망 (Artificial Neural Network) (0) | 2021.03.02 |
04. 소프트맥스 회귀 (Softmax Regression) (0) | 2021.03.01 |