본문 바로가기
카테고리 없음

transformer을 이용한 시계열 예측

by 흰색남자 2022. 5. 16.

Q(query), K(key), V(value)를 이용하여 연산을 진행하며RNN 계열에서 발전한 LSTM 다음 seq2seq는 lstm의 셀구조를 이용한 encoder와 decoder, 고정된 context vector로 구성된다.

주로 번역기에서 많이 사용됐는데, 학습 구조는 encoder에 번역하고 싶은 문장을 넣는다. 그리고 디코더는 변경하고 싶은 언어로 출력되게 만든다. 하지만 여기서는 고정된 크기의 vector에 encoder에서 번역하고 싶은 모든 정보를 담아야한다는 것이다. 번역하고 싶은 문장의 길이가 너무 길거나 짧으면 강제적으로 채널을 줄이고 늘리는 과정에서 정보의 손질이 발생하여 성능이 제대로 나오지 않는다는 점이다.

항상 연산량과 정보의 손실은 tradeoff관계이기 때문이다.

2014년에 나온 논문이며, 이 당시에는 뛰어난 성능을 보였지만, 지금은 transformer이 나왔다.

들어가기 전에 attention 매커니즘을 보고 넘어간다.

attention매커니즘이란, 각 셀의 출력을 모두 모아놓고, 출력단에서 이를 참조(연산)해서 출력에 영향을 미치는 매커니즘이다. attention 매커니즘은 쿼리는 무언가를 물어보는 주체이다. 어떤 단어가 다른 단어들과 어느정도의 연관성을 가지는지를 물어본다. Q(query), K(key), V(value)를 이용하여 연산을 진행하고, i am a teacher이 있을 때, am이라는 단어가 다른 단어들과 어느정도의 연관성을 지니는지 연산을 진행한다 가정하면, am은 query가 되고, i, am, a, teacher은 key가 된다. 어탠션 스코어로 구해진 단어의 실제 값을 의미한다.

여기서 multi-head attention이란 transformer에서 적용한 여러개의 attention 매커니즘(서로 다른 Q, K, V)을 적용하여 다양한 상황에서의 attention을 구하는 것이다.

transformer은 기존의 RNN, seq2seq, lstm과는 다르게, 문장 하나가 있을 경우 한 단어씩 cell에 집어넣는 것이 아닌,

모든 문장을 한번에 집어 넣어 빠른 성능을 제공한다. 하지만 이렇게 되면 각 단어의 순서를 알아볼 수 없게 되므로,

positional encoding(각 정보의 순서(위치 정보)를 제공함)을 사용해야한다. 

임베딩이 완료되면, 아까 말한 multi-head attention에 넣게 된다. 이 과정이 끝나게 되면, 각 단어들의 문맥 정보를 얻게 된다.

여기서 resnet에서 사용된 기법이고, 잔여학습을 의미한다. 이 잔여 학습이란, 어떠한 값을 반복적으로 계산하는 것이 아닌, 특정 레이어를 건너뛰어 그대로 넣어주는 기법이다. 비슷한 기법으로 skip connection이 있다.

이 기법의 장점은 기존 정보를 입력받고, 남은 학습량만 학습함으로써 수렴속도가 더 빨라진다.

여기서 나오는 feedforward 레이어란 입력차원과 출력 차원이 같은 레이어를 의미한다. 이렇게 하나의 인코더 블럭이 구성되면 이걸 여러개 돌려서 사용한다. 요렇게 구성된 인코더에서 마지막에 나온 인코더블럭에서 디코더의 입력 소스로 들어가게 된다.

디코더 파트에서 첫 attention은 각 단어가 서로에게 어떤 영향을 미치는지 가중치를 구한다. 인코더의 attention과 같음

2번째 attention은 인코더에서의 결과와 같이 들어가게되는데, 이 의미는 단어가 전체 문장중에서 어떤 연관성을 갖는지 학습한다. 여기서 가장 큰 특징은 회귀를 사용하지 않고, 회귀를 사용하지 않고 인코더와 디코더를 다수 사용한다는 점이다.

마지막으로 transformer은 RNN이나 CNN을 전혀 사용하지 않아 위치 관계를 파악할 수 있는 POSITIONAL ENCODING을 사용한다. 원본에서는 상대적인 주기함수를 활용한 공식을 사용한다. SIN함수, COS함수를 이용함. 꼭 이 함수만 아니어도 다른 위치에 대한 정보를 넣을 수 있다면 상관없다.

 

이제 자세한 수식은 생략하고, torch로 구현한 시계열 데이터 분석을 리뷰해보자.

 

 

 

 

출처 

 

https://coding-yoon.tistory.com/116 https://www.youtube.com/watch?v=4DzKM0vgG1Y