본문 바로가기
DB 공부하기

230523_DB복습

by 보랏 2023. 5. 23.

안녕하세요. 보랏입니다. 

 

오늘은 딥러닝에서 시퀀스 데이터 처리(시계열 데이터)모델인 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의 기본구조

출처:https://wikidocs.net/60762

  • 전 시점의 정보 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