nlp

Intro to Encoder-Decoder LSTM(=seq2seq) 번역 및 정리

codlingual 2020. 2. 8. 14:02
반응형

출처

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()

 

 

 

 

반응형