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

BERT로 시계열 데이터 분류 Task는 할 수 있을까? (1 - 근무 시간표 예측?)

by Yoo Sung Hyun 2022. 1. 16.
728x90

2021.05.25 - [논문으로 현업 씹어먹기] - Time Forecasting에 있어 느낀, Attention의 한계

 

Time Forecasting에 있어 느낀, Attention의 한계

2021.04.19 - [논문으로 현업 씹어먹기] - LSTM Attention 이해하기 - 서론 LSTM Attention 이해하기 - 서론 BERT 서론 회사에서 TA관련한 프로젝트를 할 일이 생겼다. 내가 나중에 시간이 되면 올리겠지만, 이전

shyu0522.tistory.com

과거에 Attention으로, lstm encoder-decoder를 이용하여, 시계열 예측을 진행하다가, 현타와서 적어놓았던 글이다.

 

지금와서 생각해보면, 안될 일도 아닌 것 같다는 생각이 든다.

그때는 encoder와 decoder가 전부 한번에 학습되는 형태였다. (정확히는 seq2seq Attention 형태라고 보는게 맞다)

때문에, attention 활용에 대한 제약도 컸고, time-sequence가 길어질수록 느려지는 현상과, encoder에서 상관관계만 먼저 학습을 시켜놓는다던지 하는 전략들이 어려웠기 때문이다.

(사실 이는 ESPNet도 똑같은데, CTC, Attention을 비율조정하던지 해서 수려하게 처리했었지...)

 

Transformer 형태의 모델들을 보면서 느낀 점은, 일단 encoder를 먼저 학습시켜놓을 수 있다는 것이 매력적인데, ESPNet만 봤을때는 사실 Transformer Encoder에서 학습시키는 역할은 하지않으므로, 약간 생각의 확장이 되기 힘들 수 있으나,

BERT 로는 Transformer Encoder에서 학습을 시킬 수 있다!

 

그리고 주기적으로 논문들이나, git들을 뒤져보면 실제로 Transformer 형태로 self-attention을 해서, 유의미한 결과를 얻은 사람들이 점점 많이 보인다... (내가 이전에 self-attention은 쳐보지 않았었다. 한번 정리해서 소스 짜보고 아티클 업로드 예정)

 

그리고 이전에는 Embedding Table을 사용할 생각을 하진 못했었는데, BERT를 하면서 활용하면 뭔가 해볼 수 있겠다는 생각이 들던 찰나에......

마침 근무 시간표를 예측해볼 수 있는 기회가 생겨서, 한번 다시 삽질해볼까 한다...!

 

일단 Task는 2년치의 연월일별 4가지 카테고리(데이,이브닝,나이트,오프)를 가지고 1달치 데이터로 1달 뒤를 예측하는 문제이다. (Data는 개인적인 부분으로 공개 불가)

 

막연하게, 내가 가지고 있던, AutoEncoder 형태의 LSTM Layer로 처리해보니, 거의 정확도가 50%를 넘지 못했다.

확실히 4가지 카테고리를 분류로 보나, 1,2,3,4와 같은 연속값으로 보나, 날짜별, 근무별 패턴은 전혀 보이지 않았다.

(그리고, 겸사겸사 BERT로 해보고 싶은 마음이 더 커서, 몇 시간 투자 안한 것도 있음.)

 

예를들어 우리세계에 단어가 4개밖에 없고, 그 4개의 단어로 무조건 사람들은 28~31개의 길이로만 FIX해서 문장을 구성한다고 하면, 등장했던 단어들 중에는 분명히 상관관계가 존재할 것이고, 등장 시퀀스 별로 다음에 등장할 단어를 예측한다면, 이거 약간 과거 이력에서 추출요약 같은 느낌으로 문제가 해결될 수 있지 않을까? 하는 생각이 들었다.

(이 생각이 든 순간, 기간별 등장확률을 이용해서, 마르코프 체인 형태로 풀어볼까 생각도 들었는데, 4개의 상태에 31시퀀스라면, 뒤로 갈 수록 확률값이 너무 낮아지는 문제가 생기지 않을까 싶어서, 그 것을 스케일링하는데 시간이 나름대로 들 듯 해서, 일단 최후 방법으로 생각중이다)

 

일단 어제부터 진행하기 시작했으며, 아직도 진행중인지라, 좀 중구난방일 수 있는 점은 양해 바란다.

일단 계획은

1년치 데이터로 pre-training을 시키되, masked_lm만을 시킨다.

일단 메인으로 들고갈 windows는 7일씩을 생각하고 있다.

7일씩을 하며 NSP가 없으니 token구성도 간단하다.

NSP를 하지 않는 이유는, EDA를 진행해봐도, 각 카테고리별 특별한 계절성을 보이는 것 같지는 않았다. 때문에 1주 전, 1주 후의 시퀀스 등장 순서를 학습하지 않아도 크게 정확도에 영향을 미치지 않을 것이라고 보기 때문이다. (masked_lm을 해보고 안되면 추가할 수도 있고.)

masked_lm을 시키면, 각 요일에서 1주일 내에서 스스로 판단해봤을때, 가장 연관성 있는 그룹들끼리 묶을 수 있을 것이다.

NSP를 하지 않으니, 그에 매칭되는 임베딩도 빼버렸다. (RoBERTa와 비슷)
학습에서도 역시 word_embeddings만 적용된 모습
loss나 accuracy가 뭔가 말도 안되는 것 같다. 오버피팅일 수도 있겠는데, 일단 fine-tuning까지 해보고 다시 돌아와야할듯.

variable_scope좀 편하게 쓰려고, tensorflow 1.x대가 강요되는데, 때문에 디버깅 하기가 상당히 번거롭다...

이거 2.x로 변환해볼라다가 시간 다 날려먹었다.... (bert tf2가 git에 있긴 하지만, 일단 소스는 이쪽이 더 익숙해서...)

그래서 일단 loss 선형적으로 떨어지는 것은 확인을 했기에, fine-tuning으로 넘어가볼까 한다.(급격하게 확 떨어졌거나 시작부터 작았으면, 못넘어갔을듯...)

embedding에 사용되는 hidden_size도 vocab category에 비해서 너무 큰거같고.... one_hot 썼는게 나았으려나... (시도해보고 싶은것들만 너무많다. 일단 스킵)

 

decoder는 고민인게, sequence_output을 뽑아서 dense로 처리할지, lstm을 쌓아볼지 고민인데, 아마 lstm 먼저 쌓아볼 것 같다. HuggingFace를 참고해서 직접 layer를 구성해봐야지 싶다.

데이터는 남은 1년치 데이터로 진행할 예정이다. 35일치 시퀀스를 넣어서, 7일치를 예측하는, GAP을 선정해서 Window 돌려서 해결해볼까 싶다.

 

일단은, BERT가 분류문제에서 막강하다고 하니, 이런 Task로 한번 풀어볼 예정인데,

안된다면, 마르코프 체인이나, CNN-LSTM이라던가 고민을 좀 해볼 것 같고,

잘되면, 내가 이전에 '잘 안되나..? 흠....'하고 넘어갔던, 시계열 회귀예측 문제에도 한번 적용해볼까 싶다. (Transformer 구조부터 해볼 것 같기는 하다.)

728x90

댓글