Attention Is All You Need
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin
arXiv:1706.03762 [cs.CL]
#1
기본적인 Input processing, Word Embedding, Position Embedding에 대한 이해
아래의 Youtube 영상을 바탕으로 내용을 정리한 글
Hedu - Math of Intelligence
Visual Guide to Transformer Neural Networks - (Episode 1) Position Embeddings
Input Processing
컴퓨터는 사람의 언어를 이해할 수 없고, 오직 숫자와 행렬을 이해할 수 있음
사람의 언어인 자연어를 컴퓨터가 이해할 수 있는 형식으로 변환
먼저 훈련 데이터에 있는 모든 단어들을 꺼내어 단어 사전을 만듦
만약 훈련 데이터가 Wikipedia 만큼 크다면, 우리의 단어 사전은 영어의 모든 단어로 구성될 것
예시로 "When you play the game of thrones"
단어 사전의 각 단어마다 인덱스를 부여
그리고 예시 문장에 사용할 단어들만 선택
Transformer의 입력으로 들어갈 것은 영어 단어들이 아닌 그에 대응하는 인덱스들
이 인덱스들을 'x' 라고 표현
Word Embedding
임베딩 (Embedding) : 단어의 벡터화;
사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 일련의 과정 전체;
단어나 문장 각각을 벡터로 변환해 벡터 공간으로 끼워 넣는다(embed)는 의미에서 임베딩이라는 이름이 붙음
임베딩 층은
우리의 단어 사전에 있는 모든 단어의 인덱스를 입력으로 받아서
각 인덱스를 벡터화
처음에 이 벡터들에는 랜덤한 숫자들이 들어가 있지만
모델이 학습하는 동안 벡터 안의 숫자들을 바꿀 것
여기서는 편의상 임베딩 벡터의 차원(d)을 5로 했지만
본 논문에서의 차원은 512
워드 임베딩 벡터의 각 차원은 그 단어에 대한 언어적 특징을 포착하려고 함
그 단어가 동사인지, 개체인지, 혹은 다른 어떤 것인지 등이 언어적 특징이라고 할 수 있음
실제로는 모델이 학습동안 모델 자신이 이런 특징들을 결정함
그림으로 표현하면, 각 차원의 값은 다차원공간 속 좌표들로 표시됨
만약 두 단어가 비슷한 언어적 특징을 공유한거나 비슷한 맥락에서 나타난다면
학습 동안 그들의 임베딩 값 또한 서로 가깝게 업데이트 될 것
play와 game은 둘이 같이 쓰이는 경우가 많기 때문에
학습 과정 동안 둘이 비슷해짐
거기에 caterpillar(애벌레)라는 단어를 비교하면
play와 game과는 다른 문맥에서 등장하기 때문에 전혀 다른 톤의 색을 띠고 있음
그림으로 표현하면
학습 과정 이후에 play와 game은 붙어있는 반면
caterpillar는 따로 동떨어져 있는 것을 볼 수 있음
임베딩 층은 입력 텍스트에 대응하는 워드 임베딩 벡터를 만들고 다음 단계로
만든 워드 임베딩 벡터를 'e' 라고 표현
정리하자면
임베딩 층은 앞에서 받은 입력 인덱스(x)를 벡터화하여 워드 임베딩 벡터(e)를 만들어 다음 층으로 전달
Position Embedding
왜 필요할까?
기존의 RNN 계열 모델인 LSTM 같은 경우 순차적으로 연산하기에 속도가 느리긴 하지만
어느 단어가 앞에 오는지, 뒤에 오는지 그 순서를 알 수 있음
Transformer는 한번에 행렬곱으로 연산하기에 속도가 빠르지만
어느 단어가 앞에 오는지, 뒤에 오는지 그 순서를 알 수 없음
예를 들어
Even though she did not win the award, she was satisfied.
Even though she did win the award, she was not satisfied.
'not' 의 위치 변화 하나로 아예 다른 말이 됨
그렇다면 어떻게 해야 할까?
위치 정보를 갖고 있는 벡터를 만들어 더해주는 것은 어떨까
위치 정보를 갖고 있는 위치 임베딩 벡터(p)를 기존의 워드 임베딩 벡터(e)에 더하여
위치 정보(순서)를 포함한 새로운 벡터를 만듦
하지만 이 위치 임베딩 벡터는 어떤 값을 가지고 있어야 할까?
- Simple indexing
첫번째 위치 임베딩 벡터에 0, 두번째 위치 임베딩 벡터에 1, ... 처럼 단순하게 인덱싱
좋은 방법일까?
순차적으로 숫자를 매기다보면 뒤로 갈수록 숫자가 커지기 때문에
나중에 나오는 텍스트 정보를 왜곡할 가능성이 높음
- Normalize simple indexing
인덱스가 커지는 것이 문제라면 모든 위치 임베딩 벡터의 값을 [0,1] 사이에 존재하도록 하기 위해서
위치 임베딩 벡터의 최대 개수 - 1 으로 나눠주면 되지 않을까?
주어진 위치에 있는 위치 임베딩 벡터는 시퀀스의 총 길이나 다른 변수와 상관없이 동일하게 유지되어야 하지만
이 경우 임의의 시퀀스 길이에 대응할 수 없음
예를들어
시퀀스 길이가 5라면 0.8은 4번째 원소를 의미하지만
시퀀스 길이가 20이라면 0.8은 16번째 원소를 의미함
그래서 논문의 저자는 위치 정보를 활용하기 위해 wave frequency의 개념을 사용함
- Sinusoidal (continuous binary vector)
첫번째 위치 임베딩 벡터를 예로 들면
pos : 단어의 위치 = 0
d : 워드 임베딩 벡터의 차원 = 위치 임베딩 벡터의 차원 = 5
i : 위치 임베딩 벡터의 각 차원의 인덱스 = 0,1,2,3,4
x축을 pos로 놓고, sin 그래프를 그림
sin 그래프의 y값이 x값(pos, 단어의 위치)에 따라 달라지기 때문에
y값을 x값(pos, 단어의 위치) 대신 사용할 수 있음
y값은 [1,-1] 사이의 고정된 범위 안에서 움직이고
sin 함수는 주기함수이기에 아무리 긴 길이를 가진 시퀀스에도 대응할 수 있음
그래서 위의 두 가지 방법의 한계점을 극복할 수 있지만 역시 문제가 있음
p0와 p6가 같은 값 → p0와 p6가 같은 위치 정보를 갖고 있음
pos=0과 pos=6은 다른 위치이기 때문에 달라야 함
그래서 위치 임베딩 벡터의 각 차원의 인덱스인 i 가 등장
i 값에 따라 다른 그래프를 그려보면, 다른 주파수(진동수)를 갖는 그래프들을 얻을 수 있음
왜 다른 주파수를 갖는 그래프인지?
파동(wave)과 관련된 개념
주기 (period, T) : 반복되는 현상에서 반복이 일어나는데 걸리는 시간 간격 [s]
주파수, 진동수 (frequency, f) : 단위 시간 동안 진동한 횟수 (f = 1/T) [Hz]
각주파수, 각속도 (angular frequency(velocity), ω) : 단위 시간 동안 회전한 각도 (ω = 2πf = 2π/T)
- 각주파수는 [rad/s]로 라디안 각도의 속도 표현 / 각속도는 [˚/s]로 일반 각도의 속도 표현
진폭 (amplitude) : 진동의 중심으로부터 최대로 움직인 거리
파장 (wave length, λ) : 연속적인 두 파동의 동일한 지점 간 거리 (시간적으로 대응되는 개념이 주기)
파수 (wave number, k) : 단위길이 당 파동이 반복된 횟수 (k = 2π/λ)
논문에 나온 식을 보면
x축을 pos(단어의 위치)로 했기에
sin(θ) 대신 sin(pos)
그렇다면 pos 앞의 분수가 결국 ω(각주파수)
d 값은 워드 임베딩 벡터의 차원이므로 위의 예시에서 5로 고정이고
i 값을 변화시킨다고 하면
i 값이 커지면, 분모가 커지고, ω(각주파수)는 작아지므로 T(주기)가 긴 파형이 나옴
i 값이 작아지면, 분모가 작아지고, ω(각주파수)는 커지므로 T(주기)가 짧은 파형이 나옴
그렇다면 왜 다른 주파수를 갖는 그래프를 활용할까?
i = 4 일때, p0와 p6가 같은 값을 가질 수 있어도
i = 2 또는 i = 0 일때, p0와 p6가 다른 값을 가지기 때문에
결과적으로 p0와 p6는 다른 위치 임베딩 벡터라고 할 수 있음
논문의 저자는 sin, cos 함수를 섞어서 사용
홀수 위치(pos)에 sin 함수
짝수 위치(pos)에 cos 함수
i 값과 pos 값으로
아래의 표에서
Position Embedding 벡터의 값을 찾을 수 있음
이렇게 워드 임베딩 벡터(e)에
sin함수와 cos함수를 이용해서 구한
위치 임베딩 벡터(p)를 더해서
최종적으로 Transformer의 입력으로 사용할 임베딩 벡터(e+p)를 생성
요약하자면
<Input Processing>
입력 시퀀스를 Tokenizing을 통해 잘라서
각 단어마다 인덱스를 부여한 단어 사전을 만듦
<Word Embedding>
앞에서 만든 인덱스를 입력으로 받아서
각 인덱스에 대응하여 벡터화
워드 임베딩 벡터를 출력
<Position Embedding>
위치 정보를 부여하기 위해서
워드 임베딩 벡터와 같은 크기의 위치 임베딩 벡터를 만듦
워드 임베딩 벡터 + 위치 임베딩 벡터 = Transformer의 입력
📝 참고
'Programming > NLP' 카테고리의 다른 글
Tokenizer 종류 (0) | 2023.01.25 |
---|---|
[DST] AG-DST (0) | 2022.04.04 |
[Seq2Seq] Sequence to Sequence Learning with Neural Networks (0) | 2022.03.11 |
Ontology, 온톨로지 (0) | 2022.03.10 |
음운(음소, 운소), 음절, 형태소, 단어, 어절, 문장 (0) | 2021.11.11 |