Transformer

NLP 글 목록

한빛미디어의 <밑바닥부터 시작하는 딥러닝 2>를 요약 정리한 글이다.

Transformer는 Attention is All You Need(2017)에서 제안된 구조이다.

구현 예제로는 hyunwoongko/transformer를 참고할 수 있다.

RNN 구조의 한계

RNN은 시간축 방향으로 순차 계산을 수행한다.

현재 시점의 hidden state를 계산하려면 이전 시점의 hidden state가 필요하다.

따라서 계산 순서가 강제된다.

이 구조는 시계열 데이터를 자연스럽게 다룰 수 있다는 장점이 있지만, 병렬 계산에는 불리하다.

특히 GPU처럼 병렬 계산 자원을 활용할 때, RNN은 모든 시점을 한 번에 처리하기 어렵다.

이 문제를 완화하기 위해 RNN 대신 합성곱 계층으로 병렬화된 seq2seq를 구성하는 연구도 등장했다.

대표적으로 Convolutional Sequence to Sequence Learning이 있다.

Transformer는 RNN이나 CNN 없이 Self-Attention을 중심으로 시퀀스를 처리한다.

Self-Attention

Self-Attention은 하나의 시계열 데이터를 대상으로 한 attention이다.

하나의 시계열 데이터 안에서 각 원소가 다른 원소들과 어떻게 관련되는지 살펴본다.

Self-Attention 개념

Attention is All You Need(2017) 기반 self-attention 아키텍처는 다음과 같다.

Self-Attention architecture

여기서 NxN_x는 같은 계층이 NN개 쌓여 있다는 의미이다.

Transformer는 이처럼 attention 기반 블록을 여러 층 쌓아 입력과 출력 시퀀스를 처리한다.

Self-Attention에서의 출력 방식

입력 시퀀스를 다음과 같이 두자.

[x1,x2,,xT][x_1, x_2, \dots, x_T]

각 토큰 xix_i는 세 가지 벡터로 변환된다.

  • Query: qi=xiWQq_i = x_i W_Q
  • Key: ki=xiWKk_i = x_i W_K
  • Value: vi=xiWVv_i = x_i W_V

여기서 WQW_Q, WKW_K, WVW_V는 학습 가능한 가중치 행렬이다.

출력 계산

각 위치 ii의 출력 ziz_i는 해당 위치의 Query qiq_i와 모든 Key kjk_j의 유사도를 기반으로 계산된다.

그 유사도로 얻은 가중치 αij\alpha_{ij}를 Value vjv_j에 적용해 가중합하면 ziz_i가 된다.

먼저 유사도 score를 계산한다.

sij=qikjdks_{ij} = \frac{q_i \cdot k_j}{\sqrt{d_k}}

여기서 dkd_k는 Key 벡터의 차원이다.

dk\sqrt{d_k}로 나누는 이유는 dot product 값이 차원이 커질수록 커지는 것을 완화하기 위해서이다.

다음으로 softmax를 통해 attention weight를 계산한다.

αij=exp(sij)j=1Texp(sij)\alpha_{ij} = \frac{\exp(s_{ij})}{\sum_{j'=1}^{T} \exp(s_{ij'})}

마지막으로 Value 벡터들의 가중합으로 출력 ziz_i를 만든다.

zi=j=1Tαijvjz_i = \sum_{j=1}^{T} \alpha_{ij} v_j

각 출력 ziz_i는 해당 위치의 Query qiq_i로부터 시작한다.

이 Query는 시퀀스 전체의 Key들과 유사도를 계산하고, 그 결과로 얻은 가중치 αij\alpha_{ij}를 Value에 적용하여 새로운 표현을 만든다.

따라서 Self-Attention에서는 각 토큰이 자기 자신의 관점에서 전체 시퀀스를 스캔한다.

그리고 자기와 관련 있는 정보를 선택적으로 집약한 벡터가 출력된다.

Transformer란 무엇인가

Transformer는 RNN이나 CNN 없이 Self-Attention 메커니즘을 핵심으로 사용하는 시퀀스 처리 모델이다.

Vaswani et al. (2017)의 “Attention is All You Need” 논문에서 처음 제안되었고, 이후 BERT, GPT, T5 등 다양한 최신 모델의 기반이 되었다.

Transformer는 순환 구조를 사용하지 않기 때문에 입력 시퀀스의 여러 위치를 병렬로 처리할 수 있다.

또 attention을 통해 멀리 떨어진 토큰 간 관계도 직접 계산할 수 있다.

Transformer의 구조

Transformer는 크게 Encoder와 Decoder 블록으로 구성된다.

Encoder는 입력 토큰 시퀀스를 문맥적 표현으로 변환한다.

Decoder는 이전 출력 토큰과 Encoder 출력 정보를 바탕으로 다음 토큰을 생성한다.

1. Encoder

Encoder는 입력 토큰 시퀀스를 임베딩한 뒤 positional encoding을 더해 순서 정보를 부여한다.

Self-Attention 자체는 순서 정보를 직접 알지 못하므로, positional encoding이 필요하다.

각 Encoder layer는 크게 두 가지 모듈로 구성된다.

  1. Multi-Head Self-Attention
  2. Position-wise Feed-Forward Network

Multi-Head Self-Attention에서는 모든 입력 토큰이 서로를 참조하여 문맥 정보를 반영한다.

Position-wise Feed-Forward Network는 각 위치별로 동일하게 적용되는 비선형 변환이다.

이 두 모듈을 여러 층 쌓으면 깊은 Encoder가 된다.

최종적으로 Encoder는 입력 시퀀스에 대한 문맥적 표현을 산출한다.

2. Decoder

Decoder는 출력 토큰을 생성할 때 사용하는 모듈이다.

각 Decoder layer는 세 가지 모듈로 구성된다.

  1. Masked Multi-Head Self-Attention
  2. Encoder-Decoder Attention, 즉 Cross-Attention
  3. Position-wise Feed-Forward Network

Masked Multi-Head Self-Attention은 미래 토큰을 보지 못하도록 mask를 적용한다.

출력 시퀀스를 생성할 때 시점 tt에서는 tt 이전 토큰까지만 참조할 수 있어야 한다.

미래 토큰을 보면 정답을 미리 보는 것이 되므로 학습과 생성의 조건이 달라진다.

Cross-Attention은 Decoder의 Query와 Encoder의 Key, Value를 결합한다.

이 계층이 입력 시퀀스와 출력 시퀀스를 연결하는 핵심이다.

번역 문제라면 Decoder가 현재 생성하려는 단어에 맞춰 Encoder 출력 중 어떤 입력 단어를 참고할지 결정한다.

Self-Attention의 활용 방식

Transformer 안에서 Self-Attention은 위치에 따라 다르게 사용된다.

Encoder Self-Attention

Encoder Self-Attention에서는 입력 시퀀스 내부의 단어들이 서로를 바라보며 문맥을 반영한다.

예를 들어 다음 문장을 생각할 수 있다.

The animal didn't cross the street because it was too tired.

여기서 itanimal을 참조해야 한다는 관계를 학습할 수 있다.

Decoder Masked Self-Attention

Decoder Masked Self-Attention은 출력 시퀀스를 생성할 때 아직 보지 못한 미래 토큰을 참조하지 못하도록 막는다.

예를 들어 시점 tt에서 단어를 예측할 때는 tt 이전 토큰까지만 참조해야 한다.

이를 위해 attention score matrix에서 미래 위치를 mask 처리한다.

Cross-Attention

Cross-Attention은 Decoder가 Encoder 출력을 바라보며 입력과 출력 사이의 연결을 만든다.

번역 문제에서는 출발어 문장의 특정 단어를 도착어 문장의 특정 단어와 올바르게 대응시키는 역할을 한다.

이때 Decoder의 hidden state가 Query가 되고, Encoder 출력이 Key와 Value가 된다.

핵심 요약

Transformer는 Self-Attention, Feed-Forward, Residual connection, LayerNorm을 쌓아올린 구조이다.

Encoder는 입력 문맥을 학습한다.

Decoder는 이전 토큰과 Encoder 출력을 기반으로 새 토큰을 생성한다.

Transformer의 장점은 다음과 같다.

  • 병렬 처리가 가능하다.
  • 장기 의존성 학습이 쉽다.
  • 대규모 데이터 학습에 효율적이다.

결과적으로 Transformer는 NLP뿐 아니라 이미지, 음성 등 다양한 도메인에서 표준 모델로 자리 잡았다.