Transformer
복잡한 ML 모델을 이해하기 위한 순서 팁
- 모델이 풀고자 하는 문제는 무엇인가?
- 분류, 번역 등 어떤 문제를 해결하는 것인지 알아야합니다.
- 추론(inference) 단계를 먼저 이해
- 학습된 모델이 어떤 ‘입력’을 받아 어떤 ‘출력’을 계산하는지 파악할 것
- 무엇이 학습되는가 (모델의 파라미터는 무엇인가?)
- 모델 파라미터와 입력, 그리고 그 둘의 함수를 구분할 것
- 어떻게 학습되는가(모델 파라미터를 어떻게 학습하는가?)
- 어떤 에러함수를 사용하는가?
이 순서를 따라서 transformer 모델을 이해해 보도록 하겠습니다.
다음 사이트의 내용들을 많이 참조했습니다. https://jalammar.github.io/illustrated-transformer
이 모델이 풀려고 하는 문제
- seq2seq
순차입력이 주어졌을 때 순차적인 출력을 내는 작업을 의미합니다.
- 기계번역, 질의응답 등의 문제가 있습니다.
추론단계 이해
사진 1
위 사진은 프랑스어를 영어로 바꾸는 기계번역의 예시입니다.
입력과 출력을 먼저 생각해볼 수 있습니다.
저 블랙박스 모델을 좀 더 자세하게 살펴보도록 하겠습니다.
사진 2
모델을 인코더와 디코더 부분으로 나뉩니다. 이 인코더 부분은 input들을 받고 디코더는 output을 담당합니다. 구조를 더 자세하게 살펴보면 다음과 같습니다.
사진 3
인코더만 따로 떼어내서 살펴보겠습니다.
사진 4
단어의 임베딩이 self-attention의 input으로 들어가고 단어들의 주변 문맥을 이해해서 새로운 단어 임베딩을 출력으로 내보냅니다.
이후 feed forward 계층을 각각의 임베딩에 적용합니다. self-attention과 다른점은 서로다른 단어간의 의존성이 없다는 것 입니다.
덕분에 이 계층은 병렬적으로 적용될 수 있습니다.
사진 5
각각의 임베딩은 다음 인코더의 입력값으로 들어가게 됩니다. 각각의 단어마다 하나의 임베딩을 지닌채로 학습되게 됩니다.
단어의 의미는 문맥에 의해 결정되며 같은 단어라도 문맥에 의해 뜻이 달라집니다. 따라서 임베딩을 통해 표현되는 현재 단어의 의미는 주변 단어들의 의미의 조합(weighted sum)으로 표현됩니다.
사진 6
self attention
사진 7
각각의 단어 임베딩에서 query, key, value 벡터를 각각 생성합니다.
이 벡터들은 세개의 weight 행렬을 통해 생성됩니다. weight의 행 갯수는 임베딩의 차원 수와 같습니다.
각각의 벡터의 크기는 사용자가 정해줄 수 있습니다. 위 사진에서는 벡터의 크기(size_per_head, h)가 3이 되도록 설정한 것을 볼 수 있습니다.
여기에서 입력은 단어의 임베딩이 될 것이고, 모델 파라미터는 weight 행렬들이 될 것입니다. 출력은 query, key, value 벡터들이 됩니다. 이 self attention을 학습한다는 것은 weight 행렬을 최적화시킨다는 것과 같은 의미를 지닙니다.
이 벡터들을 가지고 attention 행렬을 만들것입니다.
사진 8
attention 행렬은 i번째 단어에 미치는 j번째 단어의 영향의 크기가 $a_{ij}$에 기록된 행렬입니다.
한 단어의 쿼리와 모든 키 벡터의 dot product를 계산해줍니다.
사진 9
그 후 임베딩의 크기에 루트를 씌워준 값으로 나눠주게 됩니다. 여기서는 그 값이 8이라 가정합니다.
이렇게 나눠주는 이유는 gradient 학습을 좀 더 안정적으로 만들어주기 때문이라 합니다.
이렇게 쿼리와 키를 dot product로 계산하고 softmax를 적용한 것을 행렬로 만들면 attention 행렬이 나오게 됩니다. 예시는 첫번째 행만 구한 것입니다.
사진 10
구해진 가중치를 value와 곱해주면 value의 값들이 update되게 되는데, 이렇게 구해진 value들을 모두 더해 sum 을 구하게 됩니다.
논문에서는 input x 의 행의 갯수는 sequence lengths, s 라 나타내고 열의 갯수는 input embedding size,d 로 나타냅니다. 일반적으로 d는 512가 많이 사용된다 합니다.
댓글남기기