Transformer: Attention is all you need
아래는 Transformer와 관련한 대표적인 논문에 대한 수업을 들으면서 기억에 남고, 정리하고 싶은 자료를 바탕으로 글을 작성했다. 이번 글은 positional embedding에 관련한 내용을 작성했다.
아래는 이번 글을 작성하면서 매우 많은 도움을 받은 글이며, 아래 글과 자료를 바탕으로 다음의 내용들을 작성했다.
https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding
트랜스포머(Transformer) 파헤치기—1. Positional Encoding
트랜스포머 Transformer Attention is All You Need Postional Encoding
www.blossominkyung.com
아래에서 소개한 positional encoding은 input 문장을 토큰화하고, 토큰 인코딩, 토큰 임베딩까지 거친 후의 작업이다.
1. 토큰화(Tokenization)
input 문장을 더 작은 단위(토큰)로 분해하는 과정이며, 해당 토큰들을 단어, 단어+문자, 문자 단위로 분해할 수 있다.
2. 인코딩(Encoding)
각 토큰을 고유한 정수 ID로 매핑하는 과정이며, 이 ID는 모델이 토큰을 내부적으로 인식하고 처리할 수 있는 방식이다. 흔히 정수 인코딩이나 원 핫 인코딩을 주로 사용한다.
3. 임베딩(Embedding)
인코딩된 각 토큰은 임베딩 행렬을 통해 고차원 벡터로 변환되고, 해당 행렬은 Encoder stack과 Decoder stack의 입력으로 들어가게 된다.
전체 Transformer 구조

Positional Encoding
RNN과 LSTM과 다르게 transformer는 입력되는 단어가 병렬적으로 처리되기 때문에 입력되는 단어의 순서를 고려하지 않는다. 따라서, 단어의 위치 정보를 별도로 넣어줘야 한다. 예를 들어, 단어의 위치가 달라지면 문장의 의미가 완전히 달라지기 때문에 input에서 단어의 위치가 제대로 고려되지 않으면 output 문장의 결과도 완전히 달라지게 된다.

E: word embedding vector, p: word positional embedding vector
Word Embedding Vector에 위치 정보값을 부여할 때 주의할 점
1. 모든 positional encoding vector는 Input 내용에 관계없이 동일한 식별자(vector 값)을 가져야 한다. 시퀀스(input)가 변경되더라도 positional embedding을 동일하게 유지하도록 하기위해서이다.

2. word embedding vector에 부여하는 positional embedding vector 값을 크게 설정하면 안 된다. 위치값이 너무 커버리면 단어의 의미적 정보와 위치 정보 사이의 균형을 맞추기 어렵게 되고, 모델 자체가 위치 정보에 너무 의존하는 것과 같은 정보 불균형성 문제가 발생할 수 있다.

따라서, 위 두 가지 사항을 모두 만족하는 방식이 존재하는데 바로 word embedding vector에 각각의 위치값을 sin과 cos 함수로 부여하는 방법이다.
Positional Encoding with Sin & Cos func
일단, sin과 cos 함수는 -1~1 사이의 주기 함수이기 때문에 값이 크지 않아 위치 정보 값으로 사용하기에 적절하다는 장점을 갖고 있다.
하지만, 왜 -1~1 사이의 값을 갖는 sigmoid 함수를 이용하지 않았을까?
아래 그래프를 확인할 수 있듯이 sigmoid 함수는 word의 positional index가 많아질수록 값이 점점 1에 수렴하게 되면서, positional embedding vector의 값 차이가 거의 없는 문제가 발생할 수 있다. 따라서, sin과 cos 함수를 이용하면 -1과 1 사이에서 word의 position에 따라 값이 지속적으로 변하기 때문에 input 문장이 길더라도 위치 정보의 차이를 잘 표현할 수 있게 된다.

그런데 sin과 cos 함수는 주기 함수이기 때문에 해당 함수를 변형하지 않고 바로 사용하면, 아래 그림처럼 p0와 p8에 위치한 단어처럼 positional embedding vector 값이 동일해지는 경우가 발생한다.

이러한 positional embedding vector 값이 동일해지는 경우를 방지하고, 최대한 유일한(unique한) 위치값을 부여하기 위해 Transformer 모델에서 사용하는 positional encoding 방식은 아래 두 가지 조건을 만족한다.
1. word position에 따라 다른 주기 함수 적용
짝수 위치의 word index에서는 sin 함수를, 홀수 위치의 word index에서는 cos 함수를 사용해 위치 정보를 표현한다. sin 함수는 0에서 시작하고, cos 함수는 1에서 시작하는걸 고려했을 때, 두 함수는 서로 다른 점에서 시작하며 상호 보완적인 주기 함수이다. 이런 특징을 이용해 짝수와 홀수의 word index에서 두 함수를 번갈아 사용함으로써, 각 input에 대해 단어의 위치 정보를 더 풍부하고 균형 있게 표현할 수 있다.
2. word position에 매우 큰 값 나눠주기
각 word position에 10000^(2i/dmodel) 이라는 매우 큰 수를 나눠줌으로써 word의 position 정보가 매우 천천히 변하도록 한다. 즉, input이 아무리 길어도 word position에 매우 큰 수를 나눠줬기 때문에 positional embedding vector값은 미세하게 변화한다.

Appendix
Word embedding vector에 위치 정보를 추가할 때 왜 Concatenation이 아닌 Addition을 사용할까?
직관적으로 Concat을 이용하게 되면 차원이 늘어나기 때문에 나중에 output으로 나오는 최종 결과 벡터의 차원이 변경된다. (transformer는 input과 output의 차원이 동일하게 유지됨) 따라서, output 차원이 변경되면 당연히 처리해야할 데이터의 크기가 증가하겠고, 계산 복잡도나 메모리 문제와 같은 비용 문제가 발생할 것이다.
따라서 word embedding vector에 positional embedding vector를 더하게 되면, 위치 정보가 단어 의미 정보에 직접적으로 영향을 미치기 때문에 모델이 두 종류의 정보를 함께 학습하고 최적화하는 데 도움을 준다. 반면, Concat 방식은 모델이 두 종류의 정보를 별도로 처리하다가 나중에 합치기 때문에, 학습 과정에서 더 많은 매개변수와 복잡성을 요구할 수 있다.
'글 & 논문 > Generative Model' 카테고리의 다른 글
| GPT 실습 (2) (0) | 2024.03.27 |
|---|---|
| GPT 실습 (1) (0) | 2024.03.13 |
| Transformer - Attention Mechanism (2) (0) | 2024.03.13 |