순환신경망 RNN: 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 (Sequence) 모델

RNN을 표현한 두 그림- 재귀형태로 표현한 RNN과 시간에 따라 여러 시점으로 보여주는 두 방법
여기서 모든층들은 벡터형태로 존재!
은닉층에서 나온 결과값 -> 출력층(y) + 다시 은닉층

RNN을 뉴런 단위로 시각화
이 다차원 벡터들은 행렬로 한번에 계산 가능

one‐to‐many: 하나 의 이미지 입력에 대해서 사진의 제목을 출력하는 이미지 캡셔닝 (Image Captioning) 작업에 사용할 수 있다. 사진의 제목은 단어들의 나열이므로 시퀀스 출력
many‐to‐one: 입력 문서가 긍정 적인지 부정적인지를 판별하는 감성 분류 (sentiment classification), 또는 메일이 정상 메일인지 스팸 메 일인지 판별하는 스팸 메일 분류 (spam detection) 등에 사용
many‐to‐many: 챗봇, 번역기, 개체명 인식, 품사 태깅과 같은 작업에 사용
은닉 상태값과 출력값을 구하는 방법을 알아보자

위 사진과 같이 "입력, 은닉층 재귀, 출력" 세 부분의 가중치가 각각 존재한다
현재 시점을 t 라고 하자
현재 시점 t 에서의 은닉층과 출력층은 다음과 같다
하나의 은닉층이라면 가중치 값은 모든 시점에서 동일
b는 편향, 출력층의 f는 활성화 함수

연산 (은닉 상태값)을 벡터와 행렬 연산으로 표현
만약 은닉 상태의 크기가 2 ((D_h=2))이고, 입력 벡터의 차원이 3 ((d=3))이라면, (W_x) 행렬은 다음과 같이 2x3 행렬이 됩니다:
: 가중치 행렬의 원소
이 행렬은 입력 벡터 와 곱해져 은닉층으로의 입력을 생성
곱셈의 결과는 다음과 같이 2차원의 벡터가 된다!
시점 t에서의 출력값을 예측할 때 이전 시점의 입력뿐만 아니라, 이후 시점의 입력 또한 예측에 기여
ex) 운동을 열심히 하는 것은 [ ]을 늘리는데 효과적이다.
운동을 열심히 하는 것은 부분만을 봐서는 빈칸을 유추하기 어렵다
양방향 순환 신경망의 구조
다수의 은닉층을 가진 RNN

양방향 순환 신경망에서도 사용 가능


(물론 아냐 출력층 )

은닉상태 출력 (빨간색 ; 말하는거 아님)

from tensorflow.keras.layers import SimpleRNN
#RNN 층을 추가
model.add(SimpleRNN(hidden_units))
# 추가 인자를 사용할 때
# model.add(SimpleRNN(hidden_units, input_shape=(timesteps, input_dim)))
# 다른 표기
# model.add(SimpleRNN(hidden_units, input_length=M, input_dim=N))
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN
model = Sequential()
model.add(SimpleRNN(3, input_shape=(2,10)))
# model.add(SimpleRNN(3, input_length=2, input_dim=10))와 동일함.
model.summary()
결과, 배치사이즈를 표기 안해 None으로 출력, 2D tensor
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
simple_rnn_1 (SimpleRNN) (None, 3) 42
=================================================================
Total params: 42
Trainable params: 42
Non-trainable params: 0
_________________________________________________________________
model = Sequential()
#batch_size를 미리 정의
model.add(SimpleRNN(3, batch_input_shape=(8,2,10)))
model.summary()
결과 이번에는 입력한 배치사이즈 8 이 나온다
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
simple_rnn_2 (SimpleRNN) (8, 3) 42
=================================================================
Total params: 42
Trainable params: 42
Non-trainable params: 0
_________________________________________________________________
model = Sequential()
#return_sequences=True를 해서 모든 시점의 은닉상태값 가짐 - 차원 추가
model.add(SimpleRNN(3, batch_input_shape=(8,2,10), return_sequences=True))
model.summary()
결과 (8, 2, 3)처럼 3D tensor을 가진다 2인 이유는 input_shape에서 입력 시퀀스의 길이를 2라고 정의함
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
simple_rnn_3 (SimpleRNN) (8, 2, 3) 42
=================================================================
Total params: 42
Trainable params: 42
Non-trainable params: 0
_________________________________________________________________
+Total params의 수가 42인 이유
이 문제들을 해결하기 위해 다음 시간에 LSTM과 GRU에 대해 배워보자
점검 퀴즈
RNN 을 제대로 이해했는지 퀴즈를 통해서 확인해보세요! 모델에 대한 설명이 다음과 같을 때, 총 파라미 터 개수를 구해보세요.