본문 바로가기
딥러닝으로 하루하루 씹어먹기

LSTM으로 수요 예측하기 - 3장 (폐기된 모델...)

by Yoo Sung Hyun 2021. 4. 7.
728x90

내 생각대로 구현하고, 실 데이터로 증명할뿐.

만약 그 증명이 틀린게 있다면 거침없이 댓글을 달아주기 바란다.

 

1. 시간별로 데이터 전처리 / Not Scaled

2. 일반 lstm 3레이어 정도(?)

3. 이전 hidden data도 중요하다고 생각듬

4. BI-LSTM 사용

5. 데이터가 너무 없어 K-Fold 적용

6. Layer만 주구장창 쌓다가 AutoEncoder 활용

7. 데이터 Scaled 적용

8. Loss Function Custom

9. 1차 마무리

  - 여기 사이에는 BERT가 포함되어있다. (Google Source를 다 까봤는데, 이건 언제 또 정리할까...) -

10. Attention 적용

  => Dual-Stage Attention RNN (DA-RNN)

  => Luong Attention (Dot-Product Attention)

  => Bahdanau Attention                                         => 현재는 여기서 개고생하는중....

 

 

기본적인 접근 방법으로, LSTM으로 기본 Layer만 사용해봤었다.

하지만, 해당 부분은 소스가 남아있지 않고, 그 뒷부분부터 남아있기 때문에, 현재 장까지는 말로 털어야겠다.

 

LSTM은 Dropout을 적용하는 것보다, BatchNormalization을 적용하는 것이 더 좋다는 아티클들을 많이 읽었어서,

(Google에 'lstm dropout vs batch normalization' 와 같은 형태로 검색하면 많이 나온다.)

 

논문은,

arxiv.org/abs/1510.01378

 

Batch Normalized Recurrent Neural Networks

Recurrent Neural Networks (RNNs) are powerful models for sequential data that have the potential to learn long-term dependencies. However, they are computationally expensive to train and difficult to parallelize. Recent work has shown that normalizing inte

arxiv.org

논문에 보면 batch normal이 좀 더 빠르게 잘 되더라 라는 내용은 있는데, overfit 가능성이 좀 더 높다고 나와있다.

(벤찌오 형님은 못참지...)

 

논문에서도 학습데이터 양과 같은 요소들이 영향을 좀 미치는 부분이 있다고 나와있는데, 그래서 필자도 사실

1. dropout

2. dropout+batchnormalization

3. batchnormalization

3가지 케이스를 전부 시도해봤다. (물론 dropout은 비율 바꿔가면서도 해봤다.)

 

결과상

학습속도 : dropout 승!

정확도 : batch normalization 승!

이었지만,

모델 중요도가 운영될 모델이다보니 학습속도<<<<<정확도 였기에, batch normalization을 사용하기로 했다.

(논문에서 다 니가좋니 내가좋니 하지만, 책으로 꽃을 100송이 보느니, 때로는 한송이 꽃을 직접 보는게 나을때도 많다. 꼭 귀차니즘을 이겨내고 실제로 해보고 판단하는 습관을 기르길 바란다.) <- 이말은 꼭 내가 요즘 git에서 attention 모델들 마저도 pull땡겨서 그냥 막연하게 사용하는 초급 사이언티스트들에게 해주고 싶은말이다...ㅋㅋ

 

Model Architech

그래서

lstm

batch_norm

lstm

batch_norm

......

dense

와 같은 형태로, 매우 단순하게 모델을 구성하였고,

 

optimizer는 ADAM(0.001), loss는 RMSE를 사용하였다. (매우 기본적인 형태다.)

이때 return_sequence랑 time_distribute를 썼었는지는 기억이 잘 나지않는다. 추후에는 쓰게됐지만...

 

Dataset은 월/요일/공휴일여부/주말여부/time-1 수요값으로 time+0            (실시간)

월/요일/공휴일여부/주말여부/day-7 ~ day+0 수요값으로 day+1~day+8      (주)

월/요일/공휴일여부/주말여부/day-31 ~ day+0 수요값으로 day+1~day+32   (월)

월/요일/공휴일여부/주말여부/day-93 ~ day+0 수요값으로 day+1~day+94   (분기)

 

데이터를 예측하는 모델을 일단 1차적으로 만들어봤는데,

뭐 결과야 당연히, time만 잘맞고, 주/월/분기는 엉망이었다. (아마 time dependency 때문이겠지, 라고 생각했었다.)

물론, 바로 seq2seq와 같은 좀 더 고도화된 알고리즘으로 넘어갈 수도 있었으나,

 

뒤늦게 일부 값을 찾은것 같은데,

어떤 기준인가의 24시간 예측 (빨간선이 예측)

빨간선이 예측인데, 패턴은 얼추 따라가나? 싶지만 뭐 역시 잘 못맞춘다.

이제 앞으로 진행되면서 얼마나 잘 맞아가는지 보도록 하자!

 

비정형 데이터에서 seq2seq를 다뤄본 나는 학습시간과 하드웨어 리소스, 그리고 예측에 소요되는 시간이, 실제 운영으로 적용하는 것이 합리적일지를 고민하다가,

 

결국엔 단순 lstm모델에서 조금씩 개선해 나가며, 학습 및 예측에 소요되는 리소스 VS 모델의 수려함과 예측 정확도 Trade-Off 시점을 잘 찾아서 정하기로 결심했다.

 

느낀점으로는 참 현업에서 일을 하다보면, 가끔은 정확도가 떨어지더라도, 고효용 혹은 저비용의 모델이 더 잘먹혀들때가 있다.

내가 아무리 엔지니어라지만, 결국에 모델을 사용하는 것은 고객이니, 고객의 Needs를 잘 파악하고, 그에 맞게 설계하여 구성하는게 가장 옳바르겠다는 생각이 든다.

728x90

댓글