일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- TimeSeries
- mlflow
- HY7714
- 프레딧
- node.js
- 프로바이오틱스
- 제발쉽게좀가르치자
- 오토트레이딩
- 강화학습으로주식하기
- 도커로 깃블로그 만들기
- 불법마약특별단속 #부산지방경찰청
- DLInear
- AI
- 강화학습
- MPRO
- 엠프로
- NLinear
- de
- YOLO
- 벨만방정식
- RL
- 흥미붙이기
- socket.io
- DataProcessing
- transformer
- LTSF
- express
- ML
- DL
- pandas
- Today
- Total
상황파악
DLinear 모델 구조 (Are Transformers Effective for Time Series Forecasting?) 본문
DLinear 모델 구조 (Are Transformers Effective for Time Series Forecasting?)
otch80 2023. 7. 22. 17:53논문 링크 - https://arxiv.org/pdf/2205.13504v2.pdf
간단 설명
LTSF-forecasting (Long term Time Series Forecast, 장기간 시계열 예측) 분야에 소개된 DLinear 모델의 구조에 대해 공부한 내용을 정리해보려 한다
우선 DLinear는 제목에 적인 논문 저자가 제시한 아주 단순한 Linear 형태의 시계열 예측 모델이다
비교 대상으로 Transformer 가 쓰였는데, 요즘 워낙 트랜스포머 기반 모델들이 이슈가 되고 있고 트랜스포머가 발표되었을 당시만 해도 파급력이 상당했기 때문에 과연 이 former 기반 모델이 시계열 예측에서도 좋을까? 에 대한 의문에서 출발했기 때문이다.
저자는 갑자기 왜 이런 생각을 하게 되었을까?
1. 말귀 잘 알아듣는거랑 숫자 잘 맞추는거랑은 별개문제
Transformer 모델은 기본적으로 단어의 의미를 잘 파악하기에 특화되어 있다. 사람이 무슨말을 하고 있는지, 어떤 것을 원하는지 문맥상 파악하는데 효과적이라는 뜻인데, 과연 숫자만 나열된 상황에도 제 성능을 발휘하는 것은 다른 문제다.
단순하게 생각해서 우리만해도 아무리 평생동안 많은 대화를 했지만, 상대가 모스부호나 숫자로만 문장을 열거한다면 도대체 무슨 소린지 이해할 수가 없다.
물론 배우면 잘하겠지만 기본적으로 언어와 숫자가 다르다는것은 명확하다.
2. 너무 많은 연산은 오히려 독
멀티헤드 어텐션 구조상, 수 없이 반복된 셀프어텐션에 의해 temporal한 정보 ('집에나 가' 와 '나 집에 가' 에서 '나' 는 위치에 따라 전혀 다른 의미를 가지는 것으로 이해하면 편함) 가 많이 손실되기 때문이다.
물론 이러한 복잡한 연산 덕분에 문맥을 잘 이해하는것 일수도 있지만, 생각보다 시계열 예측에서는 그렇게 복잡한 연산이 필요하지 않을 수 도 있다.
추가로, 모델 파라미터가 많기 때문에 메모리나 연산 속도가 오래 걸리는 단점도 존재한다.
실제로 실험해보니 former 보다 좋은점이 많다고 한다 (forecast length가 길어질수록 former보다 훨씬 성능이 좋다, 가볍고 빠르다, MSE가 많이 개선되었다 등등)
논문 설명은 다른 분들이 쉽게 설명을 잘 해주셨고 유튜브에도 올라와있기 때문에 논문 내용을 파악하고 싶으면 아래 링크를 추천한다
- https://velog.io/@jhbale11/DLinear2022%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0
- https://today-1.tistory.com/60
모델 구조 설명
기본적으로 DLinear는 1-D Linear Layer를 기반으로 한다. 모델이 굉장히 작고 연산도 빠르다는 것이다
저자가 제공한 코드의 모델엔 어떠한 activation function도 붙여져 있지 않다
1-D Linear Layer는 위 사진과 같이 단순하게 예측을 원하는 시점의 L 개 만큼의 Window size를 가지고 (코드에서는 lookback_size 로 표현) 이해의 T 시점만큼의 결과값을 예측한다 (코드에서는 seq_len 로 표현)
DLinear 는 MA (Moving Average)로 계산하는 Trend와 Look-back Window 에서 Trend를 뺀 (단순 뺄셈 연산) Remainder 로 구분하여 (Decomposition, 분해) 개별 Layer를 생성한다.
이러한 분해과정은 일반적으로 DL을 통한 시계열 예측 과정에 많이 사용되는 방법이라고 한다.
위에서 DLinear는 1-D Layer를 기반으로 하지만 실제로는 1-D Layer가 Trend와 Remainder 각각 가지게 되어 총 2개의 Layer를 가지는 셈이다
Look-back Window의 MA를 계산하여 Trend를 만들고 이를 예측 하는 모델 하나.
Look-back Window에서 MA를 빼서 Remainder를 만들고 이를 예측하는 모델 하나.
두 모델의 출력값을 합하여 (단순 덧셈 연산) 최종 예측값을 산출한다
모델 학습 예시
그렇다면 실제 코드에서는 이 과정을 어떻게 동작할까
간단한 예시한번 들어보자
과거 5일 데이터를 기반으로 다음날 값을 예측한다고 해보자
가장 먼저 MA를 구하기 위해 입력 데이터를 padding 을 수행한다
이때 사용되는 kernel_size 변수가 있는데, 이는 홀수값만 가진다
그런다음 MA를 계산한다
계산한 MA를 원본 값에 빼 Remainder를 구한다
계산한 MA와 Remainder를 통해 최종 값을 예측한다 (편의상 pred 사용)
DLinear 종류
저자들은 DLinear 코드를 작성할 때 UniVariate 뿐만 아니라 Multi Variate 상황도 고려하여 작성하였다
DLinear-S (maybe... Single feature)
용어가 자꾸 입맛대로 붙어서 혼란스러울 수 있지만, 대충 모든 feature를 예측하는데 1개의 weigt를 공통으로 사용한다는 얘기다.
이러면 당연히 feature 특성이 다를수록 성능도 낮아지고 학습도 더딜것이다
아마 Uni variate 기반으로 활용할때 사용하기를 고려한 것 같다
DLinear-I (...maybe Individual)
모델이름이 L 인지 I (아이) 인지 엄청 헷갈렸는데, 코드에 Individual이라는 변수가 있는 것으로 봐서 I (아이) 인 것 같다
이게 일반적으로 생각하는 Multi Variate 과정이다
각 변수마다 개별 weight를 가지는 것이다
모델 이해 중 이슈사항
여기서 개인적으로 굉장히 어려웠던 부분이 있었는데, 바로 weigt update 과정이었다
- feature 1,2 가 있다고 가정
- Model A : 입력 채널 별 독립적인 weight를 가짐 (Model structure - Linear[0], Linear[1])
- Model B : 입력 채널은 동일한 weight를 가짐 (Model structure - Linear)
- Model A에 feature 1,2를 학습시키고 Modle B에 feature 1을 학습시켰을 때, Model A의 Linear[0].weigth와 Model B의 Linear.weight는 동일할까?
- 모델 구조 파악 중, Model A에 대하여 Linear[0].weight와 Linear[1].weight 는 서로 영향을 주지 않는다고 이해함
- 쉽게말해 역전파 과정이 layer ~ feature 마다 독립적으로 이뤄진다고 이해하였음
이 의문을 읽었을때 엥;; 이게 왜..? 할 수도 있는데, torch Model List를 처음봐서 이해가 잘 가지 않았다
일단 결론부터 말하면 당연히 feature 간 영향을 준다
검증과정
모델 A, B 의 랜덤시드를 고정한 최초 weight
두 weigth size 가 달라보일 수 있는데, 두 모델 모두 90의 len을 가지고 있다
사용한 feature 가 다르기 때문에 모델 weight update가 다르게 이뤄지는 당연한 검증 과정이었다
결론
실제로 써봐도 추론 속도도 빠르고 파라미터도 적어 관리하는데 큰 어려움이 따르지는 않았다
예측 성능도 준수했고 다른 대용량 모델에 비해서도 꿀리지 않았다.
가장 큰 성과는 ML의 고질적인 문제인 MAE 기준으로 학습을 시키면 MA와 유사하게 수렴하는 문제역시 발생하지 않았다
다만, 비주기성인 데이터에 대해 역시나 잘 맞추지는 못했다. 아무래도 모델이 연산하는 과정이 적어 그런가 싶기도 했지만 Layer를 쌓고, activation function, Drop out 등 여러 시도를 해봤지만 1-D 형태가 가장 성능이 좋았다
의외로 지금껏 시계열 예측을 너무 어렵게 접근하고 있었던 것은 아닌가 하는 생각도 들었던 좋은 경험이었다
+) 아마 저자의 Linear 모델이 성능이 좋은게 실험한 데이터가 어느정도 패턴을 가진 데이터라서 그런게 아닐 까 싶음
현재 사용하고 있는 데이터는 비주기성이 상당하기 때문에 모델에 설명된 만큼의 성능은 기대하기 어려움
'AI' 카테고리의 다른 글
[MLFlow] #3. 기본 기능 이해하기 (0) | 2023.07.23 |
---|---|
[MLFlow] #2. 초기 환경 설정 (0) | 2023.07.23 |
[MLFlow] #1. 필요성 검토 (0) | 2023.07.23 |
NLinear 모델 구조 (Are Transformers Effective for Time Series Forecasting?) (0) | 2023.07.23 |