반복해서 재귀적으로 들어가는 구조가 RNN이였는데,
transformer는 이러한 재귀적인 구조가 없다.
sequence를 다루는 모델인데 attention을 활용했다.
기계어 번역 문제에 transformer가 어떻게 활용될까?
sequential한 data를 처리하고 encoding하는 방법이기때문에 NMT문제에만 적용되진 않고 이미지 분류, detection, visual transformer에도 활용된다. dali라는 방법론은 문장이 있으면 문장에서 나오는 이미지를 생성해준다.
주어진 sequence를 다른 sequence로 바꿔준다.
영어 -> 한국어 (NMT)
입력 3개단어, 출력 4개단어
1. 수 다를 수 있음
2. 도메인 다를 수 있음
하나의 모델이 있다.
원래 RNN은 3개의 단어 들어가면 3번 돌아간다.
encoder는 3개든 100개든 재귀적으로 돌아가지 않고, 한번에 n개의 단어를 한번에 처리할 수 있는 구조이다. 동일한 구조를 가지지만 네트워크 파라미터가 다르게 학습되는 encoder와 decoder가 있다.
그렇다면
1. n개의 단어가 어떻게 encoder에서 한번에 처리될까?
2. encoder와 decoder사이에 어떤 정보를 주고받을까?
3. decoder가 어떻게 generation할 수 있을까?
하나의 encoderdpsms self-attention과 feed forward neural network가 있다.
feed forward neural network는 MLP와 동일하다.
그럼 transformer가 해주는 것은?
n개의 단어가 들어올 수 있지만 3개의 단어가 들어온다고 가정하자.
각 단어마다 벡터를 찾아준다. 벡터에서 벡터로 가는게 self-attentiondms x1에서 z1으로 넘어갈 때, x2,z2의 정보를 같이 고려한다.
i번째 x벡터를 zi로 바꿀 때 나머지 n-1개의 벡터를 같이 고려한다.
그래서 self-attention은 dependencies가 있다.
self-attention은 그 단어가 다른 단어와 그 문장 속에서 어떤 관계를 맺고 있는지 아는 것이 중요하다.
문장 안의 it을 인코딩할 때, 문장 전체 구조 속에서 it이 다른 단어 중 어떤 단어와 관계성이 높은지 알 수 있다.
Query, Key, Value는 하나의 입력이 주어졌을 때 하나마다 세개의 벡터를 만들게된다.
Thinking을 찾을 때 각각의 단어마다 q,k,v를 만든다. 그리고 첫번째로 score vector를 만든다. 내가 인코딩하고자하는 벡터의 쿼리벡터와 다머지 모든 단어의 벡터에 대한 key vector를 구하고 그 두개를 내적한다. 즉 이 두 단어가 얼마나 유사도가(관계)있는지 구한다.
인코딩하고자 하는 벡터의 쿼리벡터와 자기자신을 포함한 다른 키벡터 사이의 내적을한다. i번째 단어와 나머지 단어사이에 얼마나 interaction해야하는지 알아서 학습해야한다.(attention)
score vector가 나오면 normalize한다 8로 나눈다. key vector가 몇차원을 만들지 하이퍼파라미터한다.
64의 sqrt. key벡터의 차원(=query벡터 차원)
그 후 softmax 취하면 자기자신과의 interaction은 0.88 다른 단어와는 0.12
사용할 값은 embedding해서 나오는 value벡터들과 weighted sum을 한게 최종적으로 나오는 단어의 embedding vector의 encoding된 벡터다.
query벡터와 key벡터는 내적해야하기때문에 차원이 같아야된다. 근데 value벡터는 차원이 달라도 된다. 왜냐하면 value벡터는 weighted sum을 하기만 하면 되기 때문이다.
matrix를 사용하면 앞서 과정들을 쉽게 표현할 수 있다.
파이토치로 한두줄로 구현할 수 있다.
중요한점.. 왜 이게 잘될까?
high level로 생각해보자 이미지 하나를 CNN으로 했을 때 operation해서 나오는 output이 고정된다.
transformer는 내가 인코딩하려는 단어와 그 옆에 있는 단어에 따라서 인코딩하는 값이 달라진다. 옆의 입력에 따라 출력이 달라질 수 있는 여지가 있기 때문에 많은걸 표현할 수 있고 많은 compute가 필요하다.
encoder에서 decoder로 어떤 정보가 전해지는가?
key,value를 보낸다.
attention을 여러번한다.
Vision Transformer: 이미지 분류를 할 때 encoder만 활용한다.
NMT에서는 단어들의 sequence가 주어졌었는데, 여기선 이미지를 패치로 나눠서 하나의 인풋으로 넣는다.
이미지를 패치로 나눠서 인풋으로 넣을 때, positional encoding이 필요하다.