• Attention Is All You Need

    2022. 7. 4.

    by. haong_

    Transformer 가 나오게 된 계기

    기존 기계번역을 위한 seq2seq 모델은 모든 입력 문장을 하나의 고정된 크기의 벡터로 변환해서 문장이 길어질수록 모델 성능이 급격하게 하락한다. 이를 보완하고자 필요한 정보에 주의를 집중(attention)하게 하자는 것이 어텐션의 핵심 아이디어이다. 하지만 어텐션을 메커니즘을 적용해도 기존 RNN구조는 계속 유지되고 있어서 병렬계산이 불가능해 연산이 느리다는 단점이 존재했다. 그래서 어텐션으로만 이루어진 모델을 만들 수 없을까? 하는 생각에서 나온 self-attention을 하는 Transformer라는 모델이 나오게 되었다.

    • 기존 RNN기반 Attention : 디코더 과정의 값을 인코더 과정에 가져와서 연관성을 확인하는 방식. 병렬 연산 안됨.
    • Transformer : 다른 언어를 보지 않고 Attention을 진행하는 self-attention 적용. 본인 주변의 단어만 보고 본인의 의미를 표현해 냄. 문장내 모든 단어를 한번에 병렬로 처리. 독해,요약, Sentence representation에서 효과적. SOTA 달성.

    모델 구조

    전체적인 구조

    • 기계번역 모델은 일반적으로 Encoder-Decoder 구조
    • 입력 임베딩 벡터 (x1, x2..)가 인코더를 통해 단어가 압축표현된(z1, z2..) 벡터로 매핑
    • z를 활용해 디코더에서 output sequence를 순차적으로 auto-regressive하게 생성

    모델의 전체구조

    Encoder 구조

    • 6개의 동일한 레이어로 구성
    • 각 레이어는 두개의 서브레이어로 구성
      • Multi-head Self-attention
      • Position-wise Fully Connected Feed-forward network
    • 각 서브레이어는 Residual 및 Layer Normalization 적용
      • Residual ?
        • y - x ⇒ Residual (잔차)
        즉, output에서 이전 레이어에서 학습했던 정보를 연결함으로써 해당층에서는 추가적으로 학습해야 할 정보만 학습하면 된다
        • 동일한 연산을 하고 나서 Input x를 더하는 것이 residual block (F(x) + x )
      • Layer Normalization?
        • 미니 배치 샘플간의 의존관계 없고 배치 사이즈에 영향을 많이 받지 않음
        • 각 input의 feature들에 대한 평균과 분산을 구해서 각 미니배치에 있는 각 input을 정규화
         

    Decoder 구조

    • 6개의 동일한 레이어로 구성
    • 각 레이어는 세개의 서브레이어로 구성
      • Masked Multi-head self-attention
        • Masked : 디코딩 시 자기자신과 그 이전 정보만 참고 할 수 있도록 뒤에 있는 정보는 안보이게 마스킹. 뒤를 본다는 건 정답을 보는 것과 마찬가지이기 때문에 가려주고 예측작업 진행.
      • Encoder의 output에 대해 multi-head self-attention
        • 인코더의 정보를 Key, Value로, 디코더의 정보를 Query로 self-attention 계산
      • Position-wise Fully Connected Feed-forward network

    Self-Attention

    Self-attention 과정에는 연산을 하기 위해 Q, K, V 벡터가 존재한다.  각 벡터는 Randomly initialized 되어있다.

    • Query : 지금 집중하고 있는 벡터. 다른 벡터와 연관성을 계산할 때 기준이 되는 벡터
    • Key : 비교 대상이 되는 벡터. 연관성을 계산할 때 비교대상이 되는 벡터
    • Value : Q, K 로 구한 연관성(attention score)을 반영할 벡터

    Seq2seq attention의 경우 Q는 디코더의 hidden state, K, V는 인코더의 hidden state.
    Transformer의 self-attention 과정은 Q, K, V 모두 동일한 입력 문장 내부에서 진행한다. 

    self-attention 계산과정

    1. Query 벡터와 Key 벡터를 dot product ⇒ Attention score
    2. Attention Score를 Key벡터 차원의 제곱근 으로 나눠줌 (ex. 64차원이면 8로 나눠주기)
      - 제곱근으로 나눠주는 이유 : score 값이 너무 커져 gradient가 작아지는 현상 방지
    3. 나눠준 값들에 softmax 함수 적용해서 확률 값으로 변경
    4. Softmax 확률 값에 Value 벡터를 곱함
    5. 곱한 Value 벡터들을 다 sum (가중합) ⇒ Z 벡터 생성
      - 가중합 : 확률 값이 높아서 중요한 값은 유지되고, 낮은 단어는 제외되는 과정

    계산과정 요약 그림

    Multi-head self-attention

    • 단일 Attention layer보다 h개의 구조가 더 성능이 뛰어남을 확인
    • 각 head 개수 만큼 어텐션 계산이 다르게 이뤄지기 때문에 여러 표현의 Attention 값을 참고 할 수 있다.
    • 논문에서는 head를 8개 사용할 때 제일 성능이 좋았다고 함.
    • 각 head에서 위의 self-attention 과정을 거쳐 나온 z 행렬들을 concatenate 하고 가중치 행렬과 곱해서 최종 Z 행렬을 얻어냄.

    Z 행렬을 concat하고 곱해서 최종 z를 얻어내는 과정 그림

    최종 Self-attention 계산 과정 요약

    Positional Encoding

    트랜스포머는 입력문장에서 단어의 순서를 고려하지 않고 계산하기 때문에, 모델에게 단어의 순서 정보를 주기 위해 위치별로 특정 패턴을 따르는 positional encoding 벡터 추가

    • 주기 함수인 sin, cos 삼각함수를 이용해 홀수, 짝수번째 단어별로 포지션 인코딩
    • 두 포지션이 가까우면 내적이 크고 멀면 내적이 작아지도록 설계한 수식으로 길이가 다양한 데이터셋에 적용이 가능
    • 임베딩 벡터에 포지션 인코딩 적용 후 어텐션 레이어로 들어감

    성능비교 및 실험

    Why Self-Attention

    1. 각 레이어마다 줄어든 계산 복잡도
    2. Recurrence를 없앰으로 병렬 처리 가능
    3. 장기의존성 Long-term dependency에 대해 효율적 처리

    layer 타입별 계산복잡도 표

    • Computational Complexity :
      • n < d 인 경우 Recurrent보다 빠름
    • Sequential Operations :
      • Recurrent는 작업이 순차적 수행 O(n)
      • Self-Attention은 동시에 모든 포지션 연결 O(1)
    • Maximum Path Length :
      • Recurrent는 작업이 순차적 수행 O(n)
      • Self-Attention은 동시에 모든 포지션 연결 O(1)
      • Convolution은 Kernal size에 영향 받음 O(logk(n))
    • 해석 가능한 모델 :

    • 어텐션 결과를 시각화 해서 어떤 식으로 학습했는지 볼 수 도 있음
    • 문장 자체에서 어느단어에 집중해야 하는지 스스로 파악해서 구조와 관련성을 학습하는 것으로 보임

    Transformer 학습

    Training Data & Batching

    • 약 450만 문장 쌍(영어-독일어 세트) 공유된 약 37000 Token 사용
    • 약 3600만 문장 쌍(영어-프랑스어 세트) 공유된 약 32000 Token 사용
    • Byte Pair Encoding(BPE) 사용

    Hardware and Schedule

    • 8개의 P100 GPU 사용
    • Base 모델 ⇒ 1 step : 0.4 Sec, 100,000 step 및 12시간 학습
    • Bid 모델⇒ 1 step: 1 Sec, 300,000 Step 및 3.5일 학습

    Optimizer

    • Adam optimizer 사용 learning rate는 warmup step =4000으로 두고 학습 진행

    Regularization

    • Dropout : 0.1
      • 각 서브레이어 residual 수행 전에 Dropout 적용
      • 임베딩 및 포지셔널 인코딩 Sum 이후 적용
    • Label smoothing : 0.1
      • 불확실함을 추가 학습하여 정확도와 BLEU 점수 향상

    실험결과

    Machine Translation

    - 상대적으로 적은 훈련비용으로 우수한 성능을 얻어냄

    Transformer의 구조에서 몇 가지 요소들을 변경하면서 영어-독일어 번역 task에 적용한 실험 결과

    • (A) : head 개수 key, value dimension 변경한 경우 : head가 너무 많으면 오히려 성능이 떨어짐
    • (B) : key의 차원만 변경 : 차원을 줄이면 성능이 떨어짐
    • (C) : 모델의 크기를 키운경우 : 모델이 커지면 성능이 더 좋아짐
    • (D) : 과적합 방지 : dropout을 적용 하면 성능이 더 좋아짐
    • (E) : Learned positional embedding에 대한 고찰 : 성능이 거의 동일

    다른 task에 대한 실험 : English Constituency parsing task에 트랜스포머 적용. 최고의 성능은 아니어도 상당히 좋은 성능 제공

    Conclusion

    • Self-Attention 제안 : 빠른 학습 가능, 여러 분야에서 SOTA 달성
    • 향후 과제 : decoder에서 sequential한 과정을 축소하는 방법, 오디오나 비디오 같은 큰 입출력의 효율적 처리

    댓글