🔸 순환신경망(Recurrent Neural Network): 유닛간의 연결이 순환적 구조
스스로를 반복하면서 이전 단계에서 얻은 정보가 지속(재귀적 활동)
셀(cell): 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드
셀 = 상태(state): 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하기 위해 저장한 것
🔸 참고_순방향 신경망(feedforwaard network): 노드 간의 연결이 순환을 형성하지 "않는" 인공 신경망
🔸 참고_Feed Forward Network VS Recurrent Network
Feed Forward Net
Recurrent Net
🔸 현재 시점 t
이전값을 저장하여 내부적으로 순환되는 구조를 이용하기 때문에 순서(sequence)가 있는 데이터를 처리하는데 강점을 가짐
입력: (batch_size, timesteps, input_features) 크기의 3D 텐서를 입력
출력: 사용자의 설정에 따라 두 가지 모드로 실행 가능
return_sequences
매개변수 활용=True
: 각 시점의 은닉 상태값을 모아 전체 시퀀스 (batch_size, timesteps, output_features) 3D 텐서 반환False
: 최종 시점의 은닉 상태만 반환(batch_size, output_features)2D 텐서SimpleRNN(hidden_units, input_shape=(timesteps, input_features))
hidden_units
= 은닉 상태의 크기를 정의. 메모리 셀이 다음 시점의 메모리 셀과 출력층으로 보내는 값의 크기(output_features)와도 동일. RNN의 용량(capacity)을 늘린다고 보면 되며, 중소형 모델의 경우 보통 128, 256, 512, 1024 등의 값을 가진다.timesteps
= 입력 시퀀스의 길이(input_length)라고 표현하기도 함. 시점의 수.input_features
= 입력의 크기.🔸 Sequential( ) 사용
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))와 동일함.
🔸 함수형API 사용
import keras
from keras import layers
# 마지막 timestep만 출력
num_features = 14
steps = 120
inputs = keras.Input(shape=(steps,num_features))
outputs = layers.SimpleRNN(16, return_sequences=False)(inputs)
model = keras.Model(inputs=inputs,outputs=outputs)
model.summary()
# 전체 timestep(상태 시퀀스) 출력
inputs = keras.Input(shape=(steps,num_features))
outputs = layers.SimpleRNN(16, return_sequences=True)(inputs)
model = keras.Model(inputs=inputs,outputs=outputs)
model.summary()
🔸 1단계 "forget gate layer"
🔸 2단계 "input gate layer"
🔸 3단계 "output gate layer"
순환 드롭아웃(recurrent dropout): 순환층에서 과대적합을 방지하기 위해 드롭아웃(매개변수) 사용
recurrent_dropout = ...
스태킹 순환(stacking recurrent layer): 순환층을 여러개 쌓는 것으로, 모델의 표현능력 향상 / 계산 비용 ↑
return_sequences = True
양방향 순환(bidirectional recurrent layer): 순환 네트워크에 같은 정보를 다른 방향으로 주입.