집중! - Transformer

Posted on Mar 21, 2023

기존 Sequential data 처리의 문제점

  • 사람의 말을 예시로 들어보면 다음과 같이 구성이 될수 있다.
    • 철수야 밥 먹었니?
    • 밥 먹었니, 철수야?
    • 밥 먹었니?
    • 철수, 밥 먹음?
    • 위의 예시와 같이 언어는 생략이 될수도, 어순이 바뀔수도 그리고 같은 의미지만 다르게 쓰일 수도 있다.
  • 위와 같은 사례를 처리하기 위해 나온것이 Tranformer(Attention is All You Need, 2017)이다.

Transformer

스크린샷%202023-03-21%20오후%201.19.30.png

  • 여기서 예시로 들것은 불어 문장을 영어로 바꾸는 것이다.
  • 먼저 번역 작업의 경우 단어 배열(Sequential Data)를 목적언어의 단어 배열로 바꾸는 작업이다.
    • 여기서 이전의 LSTM과 같은 전통적인 시퀀셜 데이터 처리와 다른점이 나온다.
    • 입력과 출력의 단어 갯수는 다를수 있다는 점이다.
    • 따라서 이전 LSTM과 같이 무조건적으로 입력 갯수에 맞추어 재귀적으로 출력되지는 않는다.

동작 방식 - Encoder

Untitled

  • 먼저 단어 각각을 토큰화 시켜 Encoder의 Self-attention 부분에 넣어준다.
  • 이렇게 되면, $Z_n$의 결과가 나오게 되는데 이 결과는 이전의 입력 토큰들을 활용하여 나온다.
  • 이렇게 된 결과는 Feed Forward 부분으로 넘어가 다음 Encoder에 그대로 넘겨준다.

$Z_n$을 뽑는 방법

스크린샷%202023-03-21%20오후%201.44.01.png

  • 위의 예시와 같이 단어 두 개가 들어왔을 때 $Z_n$를 계산하는 방법이다.
  • 각각 Query, Key, Value를 생성하여 가지고 있다가, 입력이 들어왔을 때 해당 단어에 대한 중요도(score)를 계산할때 사용한다.
  • 계산된 score는 이후 normalization을 통해 계산 후 value 벡터와 함께 계산하여 최종적으로 값이 나오게 된다.
  • 이 과정을 행렬로 표현하게 되면 다음과 같다.

%20%20%20%20스크린샷%202023-03-21%20오후%201.47.50.png

%20%20%20%20스크린샷%202023-03-21%20오후%201.48.06.png

  • 위의 입력 행렬의 경우 단어를 쌓아놓은 행렬이다.
  • 나머지의 Weight 행렬은 각각 Query, Key 그리고 Value에 해당한다.