Transformer 분석(1): Transformer의 기초 개념
왜 Transformer인가…?
과연 Transformer의 시대하고 할 수 있다. 현대 딥러닝 알고리즘 Transformer 이전과 이후로 나뉠 정도로 큰 영향을 미치고 있다. Transformer는 초기 NMT를 위해 발표되었으나 현재는 Transformer의 flexible한 아키텍처 특성으로 인해 그동안 CNN, RNN 등이 사용되어 있던 분야에서 Transformer를 사용하고 있다.
NLP
- NMT, language modeling, named entity recognition etc..
Computer Vision
- image classification, object detection, image generation, video processing etc..
Audio Application
- speech recognition, speech synthesis, speech enhancement, music generation etc..
Multi-modal
- visual question answering, visual common-sense reasoning, caption generation, speech-to-text translation, text-to-image generation etc..
Transformer 논문은 인용횟수가 23766회로 매우 높은 인용 횟수를 보이고 있다. (2021/07/10 기준)
RNN/LSTM의 문제점
RNN과 그 변형인 LSTM과 GPU는 Transformer가 등장하기 전까지 모든 NLP 애플리케이션에서 사실 상 표준 아키텍처로 사용되었다. NMT (Neural Machine Transformer)에 RNN기반 seq2seq는 잘 실행되었고, seq2seq에 어텐션 메커니즘을 도입하여 번역 성능을 향상시켰다. 하지만 RNN기반 NLP 애플리케이션은 큰 한계가 있었다.
- 긴 문장에서 멀리 떨어져 있는 단어간 장기 의존성을 다루는 것에 대한 어려움이 있다.
- 입력 시퀀스를 한 번에 한 단어씩 순차적으로 처리하기 때문에 이전 단계(t-1)의 계산이 완료될 때까지 현재 단계(t)에 대한 계산을 수행할 수 없어 training/inference 속도가 느리다.
CNN은 컨볼루션을 더 빠르게 처리하기 위해 병렬처리를 통해 연산할 수 있지만 장기 의존성을 처리하는데 제한을 가지고 있다. 컨볼루션은 커널 크기에 맞는 충분히 가까운 이미지의 일부(만일 텍스트에 적용한다면 단어 수준)만 서로 작용할 수 있다. 멀리 떨어져 있는 항목을 처리하기 위해선 훨씬 더 깊은 네트워크가 필요하다.
Transformer란?
Transformer는 어텐션 메커니즘을 기반으로 RNN를 완전히 제거하여 RNN의 장기 기억 의존성과 계산 속도를 개선하였다.
어텐션(Attention)
Transformer의 획기적인 성능의 핵심은 바로 어텐션을 사용한다는 점이다. 단어 처리에 어텐션을 사용하면 모델이 특정 단어와 밀접한 단어를 집중할 수 있다.
Transformer의 모델 아키텍처
Transformer는 Seq2Seq와 유사하게 크게 Encoder stack과 Decoder stack 구조로 구성되어 있다. Transformer의 Encoder stack은 입력 문장의 표현을 배우고 Decoder stack은 Encoder stack이 배운 표현을 받아 출력 문장을 생성한다.
Encoder stack과 Decoder stack은 각 입력에 Embedding 레이어와 Positional Encoding 레이어가 있고 최종 출력을 생성하는 Output 레이어가 있다.
Encoder는 입력 시퀀스에서 문장 내 단어간의 관계를 계산하기 위한 셀프-어텐션 레이어와 Feed-Forward 레이어가 있다.
Decoder에는 셀프어텐션 레이어와 Feed-Forward 레이어 외 Decoder-Encoder Attention 계층이 있다.
Transformer의 학습 과정
Transformer의 학습 목표는 입력과 타겟 시퀀스을 모두 이용하여 타겟 시퀀스를 출력하는 방법을 학습하는 것이다. Transformer가 영어(입력 시퀀스)를 스페인어(타겟 시퀀스)로 번역하는 사례을 통해 Transformer의 학습하는 과정을 살펴보기로 하자.
- 입력 시퀀스(“I am good”)을 임베딩 후 Positional Encoding을 더한 후 Encoder로 입력한다.
- 입력 시퀀스는 Encoder Stack를 거치면 인코딩된 표현으로 변환된다.
- 타겟 시퀀스의 시작에 Start of Sentence 토큰을 알리는”<sos>”을 포함한 타겟 시퀀스에 임베딩 후 Positional Encoding을 더한 후 Decoder로 입력한다.
- Decoder Stack은 Encoder Stack에 의해 인코딩된 표현를 이용하여 타겟 시퀀스의 인코딩된 표현을 생성한다.
- Linear 레이어와 Softmax 레이어를 통과하면 단어의 확률을 계산하여 최종 출력 시퀀스로 변환한다.
- Transformer의 Loss 함수는 5단계에서 생성된 출력 시퀀스와 학습 데이터(“Je vais bien”)과 비교하고 back-propagation를 통해 학습한다.
Transformer의 추론 과정
Transformer의 추론 과정에는 Encoder stack에 전달되는 입력 시퀀스만 있고 Decoder stack에 입력할 타겟 시퀀스없이 출력 시퀀스를 생성하는 것이 목표이다.
Seq2Seq와 비교하였을 때, 이전 단계에 생성된 출력 시퀀스를 Decoder stack의 입력으로 사용하는 것은 동일하나 Seq2Seq가 이전 단계에서 생성된 단어를 전달하는 반면, Transformer는 누적된 전체 출력 시퀀스를 전달한다.
- Seq2Seq의 Decoder에 전달되는 출력 시퀀스 : “<sos>” → “Je” → “vais”
- Transformer의 Decoder에 전달되는 출력 시퀀스 : “<sos>” → “<sos>Je” → “<sos>Je vais”
- 학습과정과 동일
- 학습과정과 동일
- 타겟 시퀀스가 없이 <sos> 시퀀스만을 임베딩 후 Positional Encoding을 더한 후 Decoder로 입력한다.
- 학습과정과 동일
- 학습과정과 동일
- 출력 시퀀스의 마지막 단어를 예측 단어로 사용하여 Decoder의 입력 시퀀스의 그 다음 위치를 채운다. Decoder stack은 “<sos> Je”가 포함된 출력 시퀀스를 출력한다. 6단계가 끝나면 출력 시퀀스 “<sos> Je”를 Decoder stack의 입력으로 전달하고 (3)~(6) 과정을 문장의 마지막 토큰을 예측할 때까지 반복한다.