LSTM | GRU | bi-LSTM |
데이터가 앞,뒤 에서 필요한 경우도 있습니다. 그럴때 사용할 수 있는 양방향 LSTM이 bi-LSTM입니다.
RNN 이나 LSTM 은 일반 신경망과 다르게 시퀀스 또는 시계열 데이터 처리에 특화되어 은닉층에서 과거의 정보를 기억할 수 있습니다.
그러나, 순환 신경망의 구조적 특성상 데이터가 입력 순 으로 처리되기 때문에 이전 시점의 정보만 활용할 수 밖에 없는 단점이 존재합니다.
문장이 길어 질수록(시퀀스가 길어질수록) 성능이 저하될 수 밖에 없습니다. 다음 예문을 봅시다
> ios 앱 [ ]은 맥북이 필요합니다
> ios 앱 개발은 맥북이 필요합니다
한국어를 사용하는 우리에겐 어렵지 않게 빈칸에 들어가는 단어를 유추해낼수 있다. 그러나 일반적인 RNN 이나 LSTM 에서 순차적으로 입력되는 시퀀스를 통해 앞에 입력된 데이터인 'ios' 와 '앱' 이라는 단어만 가지고 빈칸에 들어갈 '개발' 이라는 단어를 유추해 내기엔 정보가 매우 부족하다.
문장 앞부분보단, 뒷부분에 중요한 정보가 존재하기 때문입니다.
따라서! 자연어 처리에서 입력 데이터의 '정방향' 처리만큼 역방향 처리도 중요합니다!
양방향 LSTM (Bidirectional LSTM) 은 기존 LSTM 계측에 역방향으로 처리하는 LSTM 계층을 하나 더 추가해 양방향에서 문장의 패턴을 분석할수 있도록 구성되어 있습니다.
입력 문장을 양방향에서 처리하므로 시퀀스 길이가 길어진다 하더라도 정보 손실 없이 처리가 가능
** 양방향 LSTM 구조 **
## Bidirectional
**tf.keras.layers.Bidirectional**
- RNN 에 적용하는 양방향 (bidirectional) wrapper
- https://www.tensorflow.org/api_docs/python/tf/keras/layers/Bidirectional
- Bidirectional 로 설정할 RNN layer 는 **return_sequences=True**: 모든 time step 에서 출력을 반환해야 하므로 설정해야 한다
```python
tf.keras.layers.Bidirectional(
layer,
merge_mode='concat',
weights=None,
backward_layer=None,
**kwargs
)
```
레이어는 레이언데 제일 왼쪽에 있는 레이어를 의미합니다.
*return_sequences=True를 해야합니다.
## TimeDistributed
**tf.keras.layers.TimeDistributed**
- 각 time step 에서 출력된 output 을 내부에 선언해준 레이어와 연결시켜주는 역할
- TimeDistributed 또한 Wrapper 다 (Wrapper 상속객체)
- https://www.tensorflow.org/api_docs/python/tf/keras/layers/TimeDistributed
- 출력 형태는 (batch_size, time_steps, num_classes)
```python
tf.keras.layers.TimeDistributed(
layer, **kwargs
)
```
양방향 LSTM 모델을 정의할때 주의점!
- 정방향, 역방향 LSTM 계측 모두 출력값을 연결해야 하기 때문에, return_sequences 인자를 반드시 True 로 해야 함.
- 또한 Dense 계층을 TimeDistributed 래퍼를 사용해 3차원 텐서를 입력받을수 있게 확장해야 한다
from tensorflow.keras.layers import Bidirectional, Embedding, \
Input, LSTM, TimeDistributed, Dense, Flatten
model = keras.Sequential()
model.add(Input(shape=(max_len,))) # (100, )
model.add(Embedding(input_dim=500, output_dim=16))
model.add(Bidirectional(LSTM(8, dropout=0.3, return_sequences=True)))
model.add(TimeDistributed(Dense(1, activation='sigmoid')))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.summary()
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])
checkpoint_cb = keras.callbacks.ModelCheckpoint(
'best-biLSTM-model.keras',
save_best_only=True,
)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
restore_best_weights=True)
history = model.fit(train_seq, train_target, epochs=100, batch_size=64,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
이렇게 그래프까지 시각화해서 bi-LSTM
'AI > 자연어처리' 카테고리의 다른 글
Transformer (33) (0) | 2024.12.31 |
---|---|
[AI활용 자연어처리 챗봇프로젝트] 인코더 디코더 Seq2Seq (0) | 2024.12.30 |
[AI활용 자연어처리 챗봇프로젝트] GRU, GRU실습 (2) | 2024.12.20 |
[AI활용 자연어처리 챗봇프로젝트] LSTM 실습 (1) | 2024.12.19 |
[AI활용 자연어처리 챗봇프로젝트] LSTM이란? (1) | 2024.12.17 |