2020. 2. 8. 14:02ㆍnlp
출처
1) Encoder-Decoder Long Short-Term Memory Networks
2) A Gentle Introduction to LSTM Autoencoders
3) Step-by-step Understanding LSTM Autoencoder layers
Encoder-Decoder LSTM (=seq2seq)
- input도 sequencial 데이터, output도 sequencial 데이터
- (문제) input과 output의 sequence 길이가 다를 수 있음
- (해결) Encoding : 여러 길이의 input을 고정 길이 벡터로 변환 → Decoding : 이 고정 길이 벡터를 해독하여 출력 프린트
- 특히 input sequence가 반전되었을 때 성능 좋았음
LSTM Autoencoder
- Encoder-Decoder LSTM 모델은 다양한 길이의 시계열 입력 데이터를 받아, 다양한 길이의 시계열 출력 데이터를 만들 수 있음
- LSTM Autoencoder는 다양한 길이의 시계열 input 데이터를 고정 길이 벡터로 압축해 Decoder에 입력으로 전달해줌
- 입력 데이터를 encoded feature vector로 변환하는 과정이 있음
- input data : 3 timestamps, 2 features (3*2)
- Layer 1, LSTM(128), return_sequences=True : 입력 3*2 → 출력 3*128
- Layer 2, LSTM(64), return_sequences=False : 입력 3*128 → 출력 1*64 (vector)
- Encodded features = encodded feature vector
- 이 벡터가 다시 Decoder LSTM에 전해지려면 복사해야 함
- Layer 3, RepeatVector(3) : 입력 1*64 → 출력 3*64
- Decoder layer는 Encoder layer를 거꾸로 뒤집은 순서로 쌓여있다
- 인코딩은 문자 to 임베딩이라면, 디코딩은 임베딩 to 문자이기 때문에 거꾸로 뒤집기
- Layer 4, LSTM(64), return_sequences=True : 입력 3*64 → 출력 3*64
- Layer 5, LSTM(128), return_sequences=True : 입력 3*64 → 출력 3*128
- Layer 6, TimeDistributed(Dense(2)) : 입력 3*128 → 출력 128*2
- TimeDistributed layer는 직전 레이어 출력의 feature 개수(여기선 Layer 5의 출력 3*128의 feature 개수이므로 128) 길이만큼의 벡터를 만든다. 따라서 길이 128의 벡터. 그런데 '2'가 인수로 주어졌으므로 이 128 길이 벡터를 2번 복제한다. 따라서 최종 출력은 128*2
- Layer 5의 출력 * Layer 6의 출력 = (3, 128) * (128,2) = (3,2)
- 따라서 최종 출력의 크기는 3*2 (입력 데이터와 크기 같음)
- return_sequences=True : 모든 time-stamp에서 신호를 전달함 (모든 time-stamp가 각자의 time-stamp에 전달)
- return_sequences=False : 마지막 time-stamp만 신호를 전달함
- 따라서 True이면 output 크기가 3 * 네모 / False이면 output 크기가 1 * 네모
* 전체 timestamp 개수가 3이니까, 마지막 timestamp는 1개니까
LSTM Autoencoder 와 LSTM 코드 비교
LSTM Autoencoder
2번째 LSTM 레이어의 return_sequences=False와 그에 따른 RepeatVector 레이어 추가가 유일한 차이점
# define model
model = Sequential()
model.add(LSTM(128, activation='relu', input_shape=(timesteps,n_features), return_sequences=True))
model.add(LSTM(64, activation='relu', return_sequences=False))
model.add(RepeatVector(timesteps))
model.add(LSTM(64, activation='relu', return_sequences=True))
model.add(LSTM(128, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
model.summary()
LSTM
# define model
model = Sequential()
model.add(LSTM(128, activation='relu', input_shape=(timesteps,n_features), return_sequences=True))
model.add(LSTM(64, activation='relu', return_sequences=True))
model.add(LSTM(64, activation='relu', return_sequences=True))
model.add(LSTM(128, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
model.summary()
'nlp' 카테고리의 다른 글
Attention Model 번역 및 정리 (0) | 2020.02.10 |
---|---|
seq2seq 모델 PyTorch로 구현하기 번역 및 정리 (9) | 2020.02.09 |
[DL Wizard] Long Short-Term Memory (LSTM) network with PyTorch 번역 및 정리 (0) | 2020.02.08 |
[DL Wizard] Recurrent Neural Network with PyTorch 번역 및 정리 (0) | 2020.02.08 |
그림으로 보는 RNN/LSTM과 GRU 번역 및 정리 (0) | 2020.02.07 |