다음과 같은 여러 sequence data 형태들 때문에 sequential modeling이 어렵다
Trimmed sequence : 몇개의 뒤 단어가 빠짐
Omitted sequence : 중간 단어가 빠짐
Permuted sequence : 단어가 밀리거나 permutation 발생
위와 같은 sequence data 다루기 위해 Transformer 등장
Transformer
Transformer는 attention 기반의 최초의 seqeunce transduction model이다
-> 재귀적인 구조가 없고 attention 구조를 활용함
기계어 번역 외에도 이미지 분류, detection, 이미지 생성 등 다양한 task에서 활용된다.
Description
입력과 출력 sequence 길이와 도메인은 달라도 된다 (Machine Translation)
인코더와 디코더 구조로 되어 있다
-> 동일한 구조이지만 네트워크 파라미터가 다른 encoder, decoder가 stack된 구조
한 번에 모든 sequence 데이터를 인코딩한다
한 번의 n개의 단어를 처리하고 computational cost는 n2에 비례
-> length가 길어지면 처리하기 힘들어진다는 한계 (메모리 많이 잡아먹음)
인코딩하려는 단어와 문장의 다른 단어들에 따라 인코딩 된 값이 달라진다
입력이 고정되더라도 출력이 달라질 수 있어서 다양한 내용을 표현할 수 있다
-> MLP보다 flexible한 모델
반면, 생성할 때(디코딩)는 하나씩 만든다
주요 고려사항
n개에 단어가 어떻게 한 번에 인코더에서 처리 되는가
인코더와 디코더 사이에 어떤 정보를 주고 받는지
디코더가 어떻게 generation 하는지
Encoder 데이터 처리
Encoder layer
하나의 Encoder layer는 Self-Attention과 Feed Forward Neural Network를 하나씩 가짐
Encoder는 Encoder layer가 반복되는 구조
인코더와 디코더의 Self-Attention은 Transformer가 왜 잘 되는지를 나타내는 핵심 구조
Feed Forward Neural Network는 MLP와 동일
데이터 처리
각 단어를 embedding vector로 표현
Transformer 는 self-attention을 활용하여 각 단어를 feature 벡터로 인코딩
xi가 zi로 넘어갈 때 xi뿐만 아니라 나머지 x의 정보도 같이 활용한다
feed-forward network는 dependency가 없다
Self-attention
문장에서 한 단어를 이해할 때는 단어 자체의 의미뿐만 아니라 해당 단어가 문장 속에서 다른 단어들과 어떻게 interaction이 일어나는 지를 이해해야 한다
-> Transformer는 특정 단어를 인코딩 할 때 문장에서 다른 단어들과의 관계성을 학습
진행 과정
각 단어 embedding 벡터마다 query, key, value 벡터 만든다
query, key, value 벡터 활용해서 x Embedding 벡터를 새로운 벡터로 바꾼다
Score 벡터 계산
인코딩을 하고자 하는 벡터의 query 벡터와 모든 단어의 key 벡터를 내적함으로서 해당 단어가 문장의 다른 단어들과 얼마나 유사도(관계)가 있는지 학습
Score 벡터를 normalize 해준다 (key dimension의 root 값(dk) 으로 나눔)
-> 값이 너무 커지지 않게 하기 위해
softmax를 이용하여 scaling을 진행함으로써 attention weights 계산
각각의 단어가 자기 자신 혹은 다른 단어들과 얼마나 interaction을 해야 하는지를 보여 줌
weight의 총합은 1이 된다
final 인코딩은 value 벡터의 weighted sum을 계산한 값이다
-> attention weight와 value 벡터를 weighted sum 해준다
위 과정을 통해 하나의 단어에 대한 인코딩 벡터가 나온다
유의사항
query, key 벡터는 차원 같아야 한다
-> 두 벡터 내적해야 하므로
value 벡터는 차원 달라도 된다
-> weighted sum만 해주면 됨
최종 인코딩 벡터 차원은 value 벡터 차원과 동일 (위의 setting에서는)
Self-Attention에서 Matrix 계산
행렬 형태의 X에서 Q, K, V를 계산한다
X의 행 : 단어의 수
X의 열 : 단어의 임베딩 차원
X를 Z로 나타내는 과정을 한 줄 수식으로 표현 가능하다
Row-wise softmax 취해 줌
Value 벡터 차원은 Query, Key 벡터 차원과 반드시 같을 필요는 없음
Multi head Attention
하나의 인코딩 된 벡터에 대해서 query, key, value 벡터를 head 개수(n)만큼 만든다
-> Multi head를 가진 Attention
n개의 attention을 반복하면 n개만큼의 인코딩 벡터가 나온다
n개의 인코딩 벡터를 추가적인 학습 가능한 linear map을 이용하여 차원 조절한다
실제로는 embedding 벡터를 head 개수로 나누고 해당 dimension의 입력 벡터를 활용
Positional encoding
단어의 순서와 상관없이 각 단어가 encoding되는 값은 같음(order에 independent)
-> sequence 데이터의 위치를 표현하기 위해 기존 embedding 벡터에 Positional encoding 값 더함
Decoder
Transformer는 최상위 인코더의 key(K)와 value(V)를 디코더에 전달한다
-> query는 디코더에 들어가는 단어로 만들어진 query 벡터 활용
output sequence는 autoregressive하게 순서대로 생성됨
Decoder self attention
Decoder self attention layer는 soft 단계 이전에 future position을 마스킹하여 수행되는 output sequence의 earlier position만 활용할 수 있게 한다
-> 입력과 출력 정답을 알고 있으면 학습하는 의미가 없으므로
Encoder-Decoder attention
Encoder-Decoder attention layer는 그 아래 레이어에서 query matrix를 생성하고 encoder stack에서 key와 value를 가져오는 것을 제외하면 multi-headed self-attention과 동일하게 작동한다
decoder input query와 encoder로부터 생성된 key, value 활용
-> encoder와 decoder 사이에서 interaction 하게 됨
final layer
final layer는 decoder output stack을 단어에 대한 분포로 변환한다
여러 가지 Transformer 종류
Vision Transformer(ViT)
이미지 분류에서 활용되는 Transformer -> Encoder만 활용
인코딩 벡터를 분류기에 집어 넣음
이미지를 영역별로 잘라서 각 영역을 linear layer에 통과시켜 하나의 입력처럼 활용
-> position Encoding 더해 줌