Abstract
본 논문은 순환 구조와 합성곱을 완전히 배제하고, 오직 Attention 메커니즘에만 기반한 단순한 신경망
아키텍쳐인 Transformer를 새롭게 제안.
Introduction
그동안 시퀀스(문장)을 처리할 때 이전의 계산이 완료 되어야 다음 단계를 계산할 수 있는 순차적 연산의 성질을 가진다.
이러한 특성은 훈련시에 병렬 처리를 불가능 하게 만들어, 문장이 길어질수록 메모리 제약 등으로 인해 치명적인 병목 현상이 일으킨다.
RNN 구조를 버리고, 전적으로 어텐션 메커니즘에만 의존하여 입력, 출력 간의 전역적 의존성을 이끌어내는 모델을 제안.
Background
CNN 기반 모델들의 한계
이들은 병렬 처리는 가능했지만, 멀리 떨어진 두 위치(단어) 사이의 신호를 연결하기 위해서는 거리가 멀어질수록 연산량도 함께 증가해야 했다 .
이로 인해 문장 내에서 거리가 먼 단어들 간의 관계, 즉 장기 의존성(long-range dependencies)을 학습하기가 매우 어렵다는 단점이 있었다.
트렌스포머의 해결책
트렌스포머는 아무리 멀리 떨어진 단어라도 단 한번의 연결 만으로도 관계를 파악할 수 있도록 연산 횟수를 줄여 이 문제를 해결.
셀프 어텐션(Self-attention)
단일 시퀀스 내의 다양한 위치들을 서로 연결하여 그 시퀀스 전체의 표현(문맥)을 계산해 내는 메커니즘
트랜스포머는 RNN이나 CNN을 전혀 사용하지 않고 오로지 이 셀프 어텐션에만 의존하여 입력과 출력의 표현을 계산하는 최초의 변환 모델이다.
Model Architecture
Architecture의 왼쪽은 Encoder, 오른쪽은 Decoder이다.
Input&Output Embedding
input token과 output token을 모델이 처리할 수 있는 d_model(512차원)의 벡터로 변환(학습된 Embedding을 사용)
Posotional Embedding(⊕)
단어들이 어떠한 순서로 입력되었는지 모르기 때문에 sequence 순서 정보를 모델이 활용 할 수 있게 하려면
토큰의 상대적이거나 절대 적인 위치를 모델에 별도로 주입해줘야 함.
입력 인코딩에 위치 인코딩을 더해 주는데 두 값이 더해 질 수 있도록 위치 인코딩은 임베딩과 동일 한 d_model(512 차원)을 가지게 된다.
단어들을 병렬 처리 하기 때문에 각 단어 벡터에 위치 정보를 담은 벡터를 위치 인코딩을 강제로 더해준다.
더하기 연산을 위해 512로 차원을 맞춰 준다.
Encoder
아키텍쳐의 인코더
Nx(논문에서는 N=6) 똑같은 구조가 N번 반복해서 쌓여있음을 알수있다.
Multi-Head Attention
입력된 문장 내의 모든 단어들이 서로 어떤 연관성을 가지는지 파악하는
self-Attention 수행
Feed Forward
어텐션 결과를 각 위치별로 독립적으로 처리하는 fully connected(완전 연결)
신경망
Add & Norm
attention, feed forward를 둘러싸고 있는 화살 표는
원본 입력 값을 결과에 그대로 더해주는 residual connection(잔차 연결)을 뜻함
더한 이후에는 Layer Normalization(계층 정규화)를 거친다.
Decoder
Masked Multi-Head Attention
단어를 순차적으로 예측해야 하기 때문에
현재 위치보다 뒤에있는 즉 미래의 단어들을 참조 하지 못하도록 가리는 masking처리를 함.
Multi-Head Attention
입력된 문장 내의 모든 단어들이 서로 어떤 연관성을 가지는지 파악하는
self-Attention 수행
Feed Forward
어텐션 결과를 각 위치별로 독립적으로 처리하는 fully connected(완전 연결)
신경망
Add & Norm
attention, feed forward를 둘러싸고 있는 화살 표는
원본 입력 값을 결과에 그대로 더해주는 residual connection(잔차 연결)을 뜻함
더한 이후에는 Layer Normalization(계층 정규화)를 거친다.
Linear
디코더 스택의 모든 연산을 마치고 나온 512차원의 최종 출력 벡터를 모델이 학습한 전체 어휘 사전의 크기만큼 차원을 투영시킵
Softmax
Linear 계층을 거쳐 나온 수치들에 소프트맥스 함수를 적용하여, 이 값들을 0과 1 사이의
예측된 다음 토큰(단어)의 확률로 변환
최종 출력
Output Probabilities : 출력 확률 이됨
어휘 사전 내의 모든 단어들에 대해 다음에 올 단어가 무엇일지를 나타내는 확률 생성되며,
모델은 이 확률을 바탕으로 다음 단어를 예측한다.
Attention
Scaled Dot-Product Attention
Scaled Dot-Product Attention은 입력으로
d_k차원을 가지는 Q,K 그리고 d_v 차원을 가지는 V를 사용한다.
MatMul(matrix multiplication , 행렬 곱)
d_k차원의 Q행렬과 K행렬을 Dot-product(내적)해서 각 단어들 사이의 연관성을 계산한다.
Scale
앞에서 구한 내적의 값을 d_k로 나눠줌 차원의 크기가 클 경구 내적값이 지나치게 커져서 softmax 함수의 gradientr가 극도로 작아지는 현상을 방지하기 위한 과정.
Mask
디코더 내부에서 사용될 때, 자동 회귀 특성을 보존 하기 위해서
미래의 위치를 참조하지 못하도록 softmax입력 값에서 해당 연결 값을 -∞로 설정
softmax를 거친 이후 가중치가 0이 되기 때문에 미래 단어들이 현재 단어 생성에 영향을 주지 못하게함
softmax
스케일링을 거친 값에 softmax 함수를 적용해서 각 값에 곱해줄 가중치를 얻음
최종 MatMul(matrix multiplication , 행렬 곱)
도출된 가중치 확률을 d_v 차원의 값 V 행렬과 곱해서 최종 어텐션 값을 산출한다.
최종 수식
Multi-Head Attention
Linear (선형 투영)
기존 d_model차원의 Q,K,V를 그대로 사용하지 않고, 학습 가능한 서로다른 파라미터 행렬들을 사용하여 h번 선형 투영
이러한 과정을 거치면 Q와K는 d_k(64)차원으로 V는 d_v(64)차원으로 축소된 h개의 투영 그룹이 만들어짐
Scaled Dot-Product Attention (h개의 병렬 어텐션)
투영되어 작아진 h개의 Q,K,V 그룹들은 각각 독립적으로 Scaled Dot-Product Attention 계층에 동시에 입력됨
그 결과 d_v 차원을 가지는 h개의 출력값(head)들이 나옴
단일 헤드인 경우 여러 정보가 하나로 평균화 되면서 중요한 세부 정보가 억제될 수 있지만 여러 헤드를 사용하면 서로 다른 위치에 있는 representation subspaces(다양한 표현 부분 공간)의 정보들을 참조할 수 있게 된다.
Concat
병렬 연산으로 나온 h개의 독립된 head들을 하나로 이어 붙임
최종 Linear
이어 붙인 값에 마지막 파라미터 행렬(W^O)를 곱해 최종적인 선형 투영을 수행하여 통합된 출력값을 산출한다.
최종 수식
각 헤드 차원을 d_k = d_v = d_model/h = 64로 전체 차원을 나누어 축소 시켰기 때문에 head가 여러개 임에도
전체 연산 비용은 전체 차원을 사용한 단일 head attention과 유사한 수준으로 유지된다.
Applications of Attention in our Model
transformer model은 mult-head attention을 크게 세 가지 방식으로 활용
각 방식은 Q,K,V의 출처와 목적에 따라 구분됨
Encoder-Decoder attention
Q는 이전 디코더 계층에서 올라오고, K,V은 인코더의 최종 출력에서 넘어온다.
decoder의 모든 위치가 input sequence의 모든 위치를 살펴볼 수 있게 해줌
이는 기존 seq2seq 모델들에서 사용되던 전형적인 encoder-decoder attention 메커니즘을 모방한 것이다.
Encoder self-attention
Q,K,V가 모두 같은 곳 즉 인코더의 이전 계층 출력에서 온다.
인코더 내의 각 위치가 이전 계층에 있는 모든 위치의 단어들을 자유롭게 참조할 수 있도록 하여
입력 문장 내의 문맥과 단어간의 관계를 파악 한다.
Decoder self-attention
encoder와 마찬가지로 Q,K,V가 모두 같은 곳 decoder 내부에서 온다.
decoder 내의 각 위치가 해당 위치를 포함해 그 이전에 등장한 모든 위치만 참조할 수 있도록 한다
decoder는 단어를 순차적으로 예측하는 자동 회귀(auto-regressive) 모델이어야 하므로,
정보가 왼쪽으로 흐르는 것(아직 생성되지 않은 미래의 단어를 미리 참조하는 것)을 반드시 막아야 한다.
이를 위해 스케일드 점곱 어텐션 내부에서 미리 보아서는 안 되는 불법적인 연결에 해당하는 값들을 −∞로 가려버리는(masking out) 방식을 적용
Position-wise Feed-Forward Networks
encoder와 decoder의 각 layer(계층)에는
어텐션 메커니즘 sublayer 직후에 이 fully connected(완전 연결된) 피드포워드 신경망이 포함되어있다.
position-wise
문장 내의 각 단어(위치) 벡터마다 개별적이고 동일하게(separately and identically) 이 신경망이 적용
옆에 있는 다른 단어의 정보는 참조하지 않고 오직 자기 자신의 정보만 가공
This consists of two linear transformations with a ReLU activation in between.
두 번의 선형 변환(Linear transformation)을 거치며, 그 사이에 비선형 활성화 함수인 ReLU를 통과하는 구조
이 연산은 마치 kernel size가 1인 두개의 covolution연산이 일어나는 것과 같다고 설명.
수식
차원 확장 축소(512 -> 2048 -> 512)
이 신경망의 input과 output은 기본 규격인 d_model로 유지
하지만 두 linear transformation 사이에 있는 linear-layer(내부 은닉층)의 차원의 크기는 2048로 확장됨
즉 어텐션 계층을 통과한 512차원의 정보를 d_ff = 2048차원으로 넓혀서 더복잡하고 유용한 특징을 추출한 뒤,
다음 layer로 넘기기 위해 512로 압축해 내보내는 구조
이 선형 변환에 사용되는 가중들은 하나의 동일한 계층 내의 모든 단어 위치에 대해서는 똑같이 공유되어 적용되지만,
층(layer to layer)이 달라지면 서로 다른 파라미터를 사용
Embeddings and Softmax
모델의 가장 밑단(단어의 벡터화)과 가장 윗단(최종 단어 예측)에서 일어나는
데이터 변환 과정과 그 효율적인 처리 방식에 대해 설명
Embeddings
트랜스포머는 학습된 임베딩(learned embeddings) 계층을 사용하여 텍스트 형태의 입력 토큰과 출력 토큰을 모델이 연산할 수 있는 d_model (512) 차원의 벡터로 변환
Linear & Softmax
Linear transformation과 Softmax 함수를 거쳐 디코더 스택의 최종 출력값을 예측된 다음 토큰(단어)의 확률로 변환
Weight Matrix Sharing
연산과 메모리의 효율성을 위해 세 개의 서로 다른 계층이 완벽하게 동일한 가중치 행렬(Weight Matrix)을 공유하여 사용
공유 하는 세 가지 계층
특정 거리(k)만큼 떨어진 위치의 인코딩 값(PE_{pos+k})이 원래 위치의 인코딩 값(PE_pos)의 선형 함수로 표현될 수 있으므로,
모델이 단어들 사이의 상대적인 위치(거리)를 훨씬 쉽게 학습할 수 있을 것이라 가설
모델의 각 계층을 구성할 때 기존에 널리 쓰이던 순환 계층(RNN)이나 합성곱 계층(CNN) 대신 왜 셀프 어텐션을 사용했는지 3가지 기준을 통해 비교 분석
문장의 길이가 모델의 차원크기(d 예:512)보다 짧은게 대부분 이기 때문에 self-attention의 연산량이 RNN보다 적어 속도가 더 빠르다.
하나의 kernel이 모든 입력과 출력 위치를 한번에 연결 할 수 없다.
여러 층을 쌓아야지 경로의 길이가 늘어 나기 때문에 O(log_k(n))의 경로가 필요하다.
셀프 어텐션은 모든 위치의 단어들을 단 한 번(O(1))의 순차 연산만으로 동시에 연결하고 계산할 수 있으므로, 훈련 과정에서 극대화된 병렬 처리가 가능
RNN은 t−1 시점의 계산이 끝나야 t 시점을 계산할 수 있는 한계 때문에 문장 길이에 비례하는 O(n)번의 순차 연산이 강제된다.
첫댓글 Scaled Dot-Product Attention 에서 Dot-Product 의 의미는?
번역문제에서 토큰사이의 Dot-Product 의 의미는?
Attention 블럭에서 Q,K,V의 의미는?
encoder블럭에서는 Q=K=V인데 decoder블럭에서는 ouputs->Q, encoder->K=V인 이유는?
층정규화(layer normalization)과 배치정규화(batch normalization)의 차이는?
왜 트랜스포머 모델에서는 배치정규화보다 층정규화가 효과가 좋을까요?
Masked mha에서 mask의 역할은?
Masking 연산을 행렬연산으로 구현하는 방식을 설명하라.
residual connection(잔차 연결)의 역할은?
RNN와 transformer의 차이는?
decoder블럭의 입력(아래쪽)에 있는 outputs와 출력(위쪽)에 있는 output의 차이는?