안녕하세요. 보랏입니다.
오늘은 딥러닝에서 시퀀스 데이터 처리(시계열 데이터)모델인 LSTM & GRU와
워크플로우 소프트웨어인 Airflow에 대해서 배웠습니다.
바로 복습 시작하겠습니다.
※ 제가 작성한 벨로그에서 가져온 글입니다.
https://velog.io/@nbac406/DB%EB%B3%B5%EC%8A%B5-LSTM%EA%B3%BC-GRU-%EC%85%80
https://velog.io/@nbac406/Airflow-Airflow-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B0%9C%EC%9A%94
RNN
RNN 개요
- 시퀀스 데이터 처리에 강점을 가진 모델로써 시계열, 자연어 등의 분야에서 많이 사용
- RNN은 이전 타임 스텝에서의 어떠한 정보(hidden state)를 다음 타입스텝으로 계속 전달하여 연산하는 방식
- 순환 신경망은 은닉층을 거친 결과값을 재사용하는 특징으로 인해 그래디언트 소실 & 폭주 문제가 발생 가능
RNN의 기본구조
- 전 시점의 정보 hidden state를 넘겨주기 위해 특정시점의 입력값에 대한 가중치의 곱과 전 시점의 hidden state와 그 가중치 곱의 합 구하기
LSTM
LSTM 개요
- 단기 기억을 오래 기억하기 위해 고안된 모델
- 순환신경망은 은닉층을 거친 결과값을 재사용하는 특징으로 인하여 그래디언트 소실&폭주 문제가 발생하는데 이를 해결하기 위해 LSTM방법 사용
LSTM 구조
- 입력과 가중치를 곱하고 절편을 더해 함수를 통과시키는 구조를 여러개 보유
- 해당 계산의 결과를 다음 타임스텝에 재사용 시킴
- 기본 순환층과는 달리 시그모이드 활성화 함수를 사용하고 tanh활성화 함수를 통과한 어떤 값과 곱해져서 은닉 상태로 만듬
- forget gate, input gate, output gate (총 3개)
LSTM신경망 훈련하기
# 라이브러리 임포트 및 train, test 데이터 분류
from tensorflow.keras.datasets import imdb
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.sequence import pad_sequences
(train_input, train_target), (test_input, test_target) = imdb.load_data(
num_words=500)
train_input, val_input, train_target, val_target = train_test_split(
train_input, train_target, test_size=0.2, random_state=42)
train_seq = pad_sequences(train_input, maxlen=100)
val_seq = pad_sequences(val_input, maxlen=100)
# sequential 모델 객체 생성
from tensorflow import keras
model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length=100))
model.add(keras.layers.LSTM(8))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.summary()
- 입력 단어 500개, 입력 시퀀스 길이 100, 임베딩 차원 16으로 입력 시퀀스를 밀집 벡터로 변환
- LSTM레이어 모델을 추가하고, Dense(완전 연결)레이어를 모델에 추가
-> 이진 분류 문제를 해결하기 위해 시그모이드 활성화 함수 사용
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-lstm-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=5,
restore_best_weights=True)
history = model.fit(train_seq, train_target, epochs=200, batch_size=128,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
- RMSproop 옵티마이저 생성하고 학습률을 0.0001로 설정
- 손실함수는 이진 분류를 위한 binary_crossentropy로 설정
- EarlyStopping콜백을 생성하여 조기 종료 후 가장 성능이 좋았던 시점의 모델 가중치로 복원
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
LSTM 사용이유 요약
- RNN은 시간이 길어지면 은닉층에서 데이터를 까먹기 때문에 LSTM을 사용
- 하지만 계산식이 복잡하다는 단점 보유
GRU
GRU 개요
- 기존 LSTM의 구조를 조금 더 간단하게 개선한 모델
- LSTM을 구성하는 Time-step의 cell을 조금 더 간소화한 버전
GRU 구조
- GRU 셀에는 은닉상태와 가중치를 곱하고 절편을 더하는 작은 셀이 3개가 있음
- reset gate, update gate (총 2개)
- GRU셀은 LSTM보다 가중치가 적기 때문에 계산량이 적지만 LSTM못지않은 좋은 성능을 내는 것으로 알려져 있음
GRU 훈련
model4 = keras.Sequential()
model4.add(keras.layers.Embedding(500, 16, input_length=100))
model4.add(keras.layers.GRU(8))
model4.add(keras.layers.Dense(1, activation='sigmoid'))
model4.summary()
- 500개의 단어를 100개의 입력 시퀀스를 처리하기 위해 8개의 GRU유닛을 사용하는 모델을 정의
- 이진 분류를 수행하고 시그모이드 함수를 통해 0~1 사이의 확률값으로 변환
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model4.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-gru-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=5,
restore_best_weights=True)
history = model4.fit(train_seq, train_target, epochs=200, batch_size=512,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
- GRU모델을 훈련한 model4를 활용하여 컴파일, 훈련, 콜백 설정
LSTM & GRU 차이점
구조
- LSTM : 입력게이트, 망각게이트, 출력게이트 등의 메커니즘을 사용하여 순차적 입력, 이전 상태 정보 조회 -> 장기 기억 상태로 저장
- GRU : 입력게이트와 망각게이트를 업데이트 게이트로 통합, 훈련속도가 빠르고 더 간단한 구조
게이트 수
- LSTM : 총 3개 (입력, 망각, 출력)
- GRU : 총 2개 (업데이트, 출력)
정보의 흐름
- LSTM : 입력 게이트를 통해 어떤 정보를 기억할지 결정 후 망각 게이트를 통해 이전 상태의 어떤 정보를 잊을지 결정, 출력 게이트는 현재 상태의 어떤 정보를 다음 상태의 전달할 지 결정
- GRU : 업데이트 게이트를 통해 현재 입력과 이전 상태의 정보를 조합하여 현재 상태를 업데이트
참고자료
https://blog.naver.com/winddori2002/221992543837
https://wooono.tistory.com/242
[DL] RNN, LSTM, GRU 란?
Naive Neural Network "Yesterday, Harry Potter met Hermione Granger"라는 문장을 입력 받았을 때, 문장의 각 단어가 사람 이름이라면 1, 아니라면 0을 매핑하는 Naive한 개체명 인식 신경망을 만든다고 가정해보자.
wooono.tistory.com
Airflow
Airflow 개요
- Python코드로 워크플로우(workflow)를 작성하고, 스케줄링&모니터링 하는 플랫폼
- ETL작업 자동화
- DAG(Directed Acyclic Graph)형태의 워크플로우 작성 가능
Airflow 구조
- Schedular : 모든 DAG와 Task에 대하여 모니터링 및 관리, 실행해야 할 Task 관리
- Web Server : airflow의 웹 UI서버
- DAG : Python으로 작성한 워크플로우, 어떤 순서로 어떤 dependency로 실행할지 등의 정보 보유
- Database : Airflow에존재하는 DAG와 Task들의 메타데이터를 저장하는 데이터베이스
- Worker : 실제 Task를 실행하는 주체
Airflow 설치 및 실행
- WSL환경에서 실행(root 경로에서 실행)
- webserver&schedular 실행 후 127.0.0.1 : 8080포트로 사용
airflow 설치
pip install apache-airflow
airflow db 초기화
airflow db init
사용자 세팅
airflow users create --username admin --password admin --firstname Anonymous --lastname Admin --role Admin --email test@test.com
webserver & schedular 백그라운드 실행
airflow webserver &
airflow scheduler &
Airflow 가동 홈페이지 구현
Airflow 명령어
- ps -ef | grep airflow : 현재 운영되고 있는 airflow 프로세스 목록 확인
- kill -9 pid : 프로세스 죽이기
- pkill -f airflow : 특정 이름이 들어간 프로세스 한 번에 죽이기
- airflow webserver --port:0000 : 0000번 포트로 바꿔서 webserver 진행
이렇게 복습 마치겠습니다.
감사합니다.
'DB 공부하기' 카테고리의 다른 글
230522_DB복습 (0) | 2023.05.23 |
---|---|
Mini Project_딥러닝 활용 닮은 연예인 찾기 Django페이지 구현 (0) | 2023.05.22 |
230503_DB복습 (0) | 2023.05.03 |
230502_DB복습 (0) | 2023.05.02 |
230427_DB복습 (0) | 2023.04.27 |