어쩌다데싸
Transformer 쉽게 이해하기 1편 본문
Transformer 모델이 현재 많은 LLM 모델의 근간이 된다 정도만 알아도 되겠지만, 어떤 원리로 구현이 되는건지 이해하고 넘어가고 싶어 공부한 내용을 정리해봅니다.
처음에는 attention, seq2seq, lstm, rnn 등 알아야 할 개념이 너무 많아 시작도 하기 전에 지쳐 포기할까 했었습니다. 이 글에서는 Transformer를 이해하는데 필요한 최소한의 배경지식만 알아보고 본격적으로 모델에 대해 알아보겠습니다.
이 글은 위키독스의 딥러닝을 이용한 자연어 처리 입문을 정리하며 이해에 도움이 되는 내용을 추가한 글입니다.
1. Seq2Seq 모델과 Attention 등장
Transformer는 아키텍처는 다르지만 seq2seq 모델의 인코더-디코더 모델 구조는 똑같이 사용하고 있습니다. 인코더는 입력 문장을 압축한 Context Vector를 디코더에 전송하고, 디코더는 이를 번역된 단어로 순차적으로 출력하는 기능을 합니다. 이 때, RNN에 기반해서 만들어진 seq2seq 모델은 현 시점에서 먼 단어의 영향력은 낮아져, 입력 문장이 길면 번역 품질이 떨어지는 문제가 있었습니다.
이를 해결하기 위해 등장한 개념이 바로 Attention 입니다. 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점에서 인코더의 전체 입력 문장을 참고하는데, 모든 단어를 동일 비율로 참고하는 것이 아닌 중요한 부분에 집중(attention)해서 보는 것입니다.
rnn, seq2seq에 대해 이해가 어렵다면 이렇게 seq2seq 모델이 인코더-디코더 구조를 가지고 있고, RNN에 기반하기 때문에 발생하는, 문장이 길어질 때의 번역 품질 하락 문제를 보정하기 위해 Attention이 등장했다는 개념만 이해하고 넘어가도 될 듯 합니다.
2. Transformer 와 Self-Attention
"Attention is all you need" 논문에서 처음 등장한 Transformer는 Attention을 RNN 보정 목적이 아닌, 그 자체만으로 인코더와 디코더를 구현한 모델입니다.
설명에 앞서 내용을 쉽게 이해하는데 필요한, 논문에서 사용한 하이퍼 파라미터를 정리하겠습니다.
2.1 Transformer의 입력
트랜스포머는 seq2seq의 인코더-디코더 구조는 유지하지만, 인코더와 디코더가 각각 하나의 RNN으로 구성되었던 것과 달리 인코더와 디코더라는 단위가 N개로 구성되는 구조입니다. 해당 논문에서는 num_layers 파라미터 대로 6개의 인코더와 디코더를 사용했습니다.
위 그림에서처럼, Transformer는 인코더로부터 정보를 전달받고, 디코더가 <sos>를 시작심볼로 입력받아 종료 심볼 <eos>가 나올 때까지 연산해서 출력 결과를 만들어내는 구조는 seq2seq와 같습니다. 하지만 RNN이 문장의 단어를 순차적으로 입력 받아서 처리해 그 자체로 위치 정보를 가지고 있었던 것과 달리, Transformer는 단어 입력을 순차적으로 받는 방식이 아니기 때문에 위치 정보를 따로 알려줘야 합니다.
단어의 위치 정보를 얻기 위해 각 단어의 임베딩 벡터에 위치 정보를 더한 값을 입력으로 사용하는데, 이를 포지셔널 인코딩(Positional Encoding)이라고 합니다.
위의 그림에서 처럼 각 단어별 임베딩 벡터에 각 단어의 위치 정보를 포함한 값을 더해줘 임베딩 벡터 값을 조정하는 것입니다. 이렇게 되면 똑같은 단어라도 다른 벡터값을 가질 수 있게 됩니다. positional encoding 값은 단어의 순서 정보를 전달하기 위해 백터 내의 차원 인덱스가 짝수일 때는 사인 함수의 값을, 홀수일 때는 코사인 함수의 값을 사용해서 만들어지게 됩니다. 이렇게 위치 정보를 더해준 단어 임베딩 벡터가 Transformer의 입력값으로 사용됩니다. 참고로 해당 그림에서는 단어의 벡터가 4차원으로 표현되었지만 실제로는 d_model 하이퍼파라미터대로 512의 값을 가집니다.
2.2 Self-Attention (Q=K=V)
Transformer에는 3가지 Attention이 있는데 그 중 왼쪽은 인코더의 Self-Attention 구조입니다. 인코더는 크게 Multi-head Self-Attention 과 피드 포워드 신경망인 Position-wise FFNN으로 세부 기능이 나뉘게 되는데, 우선 Transformer의 핵심인 Self-Attention에 대해 알아 보겠습니다.
Attention 함수는 주어진 쿼리(Query)에 대해 모든 키(Key)와의 유사도를 구해서, 이 유사도를 키와 맵핑된 각각의 값(Value)에 반영해주고, 이 유사도가 반영된 값을 모두 더해서 리턴합니다. 이를 어텐션 값(Attention Value)라고 합니다.
여기서 Query, Key, Value는 무엇일까요? 홍대의 맛집 장소를 찾기 위해 인터넷에 검색한다고 합시다. '홍대맛집' 이라는 검색어는 Query가 되고 해당 검색어와 유사하다고 생각되는 콘텐츠 제목이 Key, 그 안에 든 내용이 Value가 됩니다. Attention 함수는 예측하고자 하는 단어(Query)에 대해 입력 문장의 모든 단어(Key)와의 유사도를 구하게 되는데, Self-Attention은 Query, Key, Value가 동일한 경우를 말합니다. 즉 모든 입력 문장의 단어에 대해 모든 입력 문장 단어와의 유사도를 계산하는 것이죠. 여기서 Query, Key, Value가 동일하다는 것은 완전히 같다는 것을 의미하는게 아닌 벡터의 출처가 같다는 것을 의미합니다.
이제 자기 자신에게 어텐션을 수행하는 Self-Attention의 동작 메커니즘을 살펴 보겠습니다.
1) Q, K, V 벡터 얻기
Query에는 앞서 Positional encoding 값이 반영된 단어의 임베딩 벡터를 입력하고, Key와 Value는 이를 복사해서 사용합니다. 다만, 이때의 입력 문장의 단어 벡터들은 인코더의 초기 입력인 d_model 차원의 단어 벡터는 아니고 이 단어 벡터들로부터 더 작은 차원의 Q벡터, K벡터, V벡터를 얻는 작업을 선행합니다. 여기서 Q, K, V 벡터의 차원은 d_model 차원(512)과 병렬 수인 num_heads(8)에 의해 결정되는데 d_model * (d_model / num_heads) 크기의 가중치 행렬을 각 단어 벡터에 곱해 (d_model / num_heads) 차원인 64 차원의 Q, K, V 벡터를 얻어 Attention을 진행하게 되는 것입니다.
과정이 복잡한 듯 보이지만, 기존 단어 벡터 크기보다 작은 차원의 동일한 Q, K, V 벡터를 만든다 정도만 기억해 넘어가 보겠습니다.
2) Scaled Dot-Product Attention
Attention의 종류는 여러가지가 있지만, 논문에서는 수식적으로 이해하기 쉬운 Dot-Product Attention을 사용했습니다. Attention 연산은 크게 각 단어별 Q벡터가 모든 단어의 K벡터에 대해 어텐션 스코어를 구하고, 어텐션 스코어를 Softmax 함수에 넣어 어텐션 분포를 구한 뒤, 이를 V벡터에 가중합 한 Attention Value를 출력하게 됩니다.
그림을 통해 다시 설명해보면, Q_I는 'I' 단어의 조정된 임베딩 벡터 값이고 K_I, K_am, K_a, K_student는 입력 문장 모든 단어 각각에 대한 조정된 임베딩 벡터값입니다. 위에 붙은 T는 내적 연산을 위한 전치 표시이고, 해당 값들에 곱해지는 루트d_k 값은 두 벡터의 내적 연산에 대한 스케일링하는 값인데 그렇구나 정도로 넘어가 보겠습니다. 그러면 Q벡터에 대해 모든 입력 단어에 대한 어텐션 스코어가 나오게 되고, 이 값은 softmax 함수를 거쳐 합이 1인 어텐션 분포가 되게 됩니다. 해당 단어와 모든 단어들의 연관도가 되는 것이죠. 최종적으로 각 단어의 V벡터에 어텐션 분포(Attention Distribution)를 곱해준 값을 가중합 해 어텐션 값(Attention Value)를 출력하는 것입니다.
그림에서는 하나의 Q벡터 별로 연산을 하는 것처럼 그려졌지만, 실제로는 모든 Q 단어 벡터 행렬을 이용해 한 번에 처리되게 됩니다.
목표는 가벼운 개념과 함께 구현된 코드를 분석하는 것이었는데, 모델을 이해하고 싶은 욕심에 개념 정리글이 복잡하고 길어졌네요. 한 번에 다루기에는 너무 많은 내용이라 2편에 이어서 작성해 보겠습니다.
< Reference >
트랜스포머 https://wikidocs.net/31379
어텐션 메커니즘 https://wikidocs.net/22893
트랜스포머(Transformer)와 어텐션 매커니즘(Attention Mechanism)이란 무엇인가? https://velog.io/@jhbale11/%EC%96%B4%ED%85%90%EC%85%98-%EB%A7%A4%EC%BB%A4%EB%8B%88%EC%A6%98Attention-Mechanism%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
* 이미지 출처는 위키독스의 딥러닝을 이용한 자연어 처리 입문 글과 Attention is all you need 논문입니다.
'Generative AI' 카테고리의 다른 글
LLM - Fine Tuning(미세조정) (0) | 2024.03.17 |
---|---|
LangChain으로 RAG 구현하기 (0) | 2024.02.04 |
LLM(Large Language Model)이란? (1) | 2023.12.19 |