Hello Computer Vision

Positional Encoding 공부해보기 본문

딥러닝

Positional Encoding 공부해보기

지웅쓰 2023. 4. 4. 23:23

Transformer 구조를 살펴보다 보면 input에 대하여 Embedding을 입힌 후 Positional Encoding하는 과정을 거치는 것을 확인할 수 있다. ViT에서는 안하는 추세이지만 NLP에서는 위치가 중요하다.

 

Positional Encoding 사용 이유

RNN, LSTM 과 다르게 Transformer에서는 가장 큰 특징인 병렬화를 사용하기 때문에 각 단어 토큰에 대한 순서를 보장하지 않는다. 예를 들어

"I do want to buy ice cream, but i can not' 

'i do not want to but ice cream, but i can' 방금 급조한 두개의 문장을 비교해본다면 들어간 단어는 똑같으나 단어의 순서에 따라 의미가 확 변하는 것을 확인할 수 있다. 그러므로 적어도 NLP에서는 단어의 순서가 중요하다는 것을 직관적으로 알 수 있다.

 

PE 에 필요한 가정

1. 모든 위치값은 다 같아야 한다.

--> 첫번째 문장에서의 첫번째 위치 벡터의 크기와, 두번째 문장에서의 첫번째 위치 벡터의 크기가 다르다면 안된다.

 

2. 위치를 알려주는 값이 너무 크면 안된다.

Transformer 의 구조를 보면 Embedding을 입힌 후 PE값은 summation하는 것을 확인할 수 있는데 사실 가장 중요한 것은 각 단어의 의미정보라고 할 수 있는데 이에 비해 위치 값이 더 크게 된다면 학습이 잘 안될 것이다.

 

PE  만들어보기

1. 첫번째 위치는 1, 두번째 위치는 2, .... 10번째 위치는 10을 줘보자.

딱봐도 이상하고 위에서 말한 PE에 필요한 가정 2번째에 어긋난다.

 

2. 첫번째 위치0, 마지막 위치1, 그 사이사이 숫자들을 1/단어수

ex) 단어 10개면, 0, 0.1, 0.2.. 1

이 역시 필요한 가정 1번에 어긋난다. 길이가 10인 문장과 길이가 20인 문장과의 PE값이 각각 다를 것이다. 길이가 10인 문장의 두번째 단어의 PE값은 0.1 이지만 길이가 20인 문장의 두번째 단어 PE값은 0.05일 것이다.

 

해결책

사인, 코사인 함수를 활용한다. 두 함수가 어떤 모습을 하고 있는지 살펴보자

코사인함수

 

사인함수

 

두 함수 모두 -1, 1사이에 있다는 것을 확인할 수 있으며 주기함수이다. 

Q: 주기함수이므로 위치값이 겹칠 수도 있지 않나?

Embedding값이 512라면 PE값도 512크기의 벡터를 가질 것이고 이를 사인 함수와 코사인 함수를 적절히 섞어 조합한다면  겹치지 않을 것이다.

pos 은 각 position을 뜻하며 i는 차원수를 의미한다. 

 


References

https://arxiv.org/pdf/1706.03762.pdf

https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding