프랑스어를 영어로 변역하고자 할 때,
인코더는 프랑스어를 표현하는 방법을 학습한 다음,
그 결과를 디코더에 보낸다.
인코더에서 학습한 표현을 입력받은 디코더는 최종적으로 영어로 변역한 문장을 생성한다.
어떻게 작동하는 걸까??
먼저 인코더 부터 알아야한다.
입력 문장 프랑스어는 가장 먼저 인코더에 들어간다.
인코더는 여러 개의 층(레이어)를 쌓을 수 있다.
결과적으로 인코더는 무엇을 얻기 위한 작업일까?
인코더는 표현 결과를 얻기 위한 작업을 수행한다.
즉, 최초 인코더에 대한 입력값으로 문장을 넣게 되고, 최종 인코더의 결과로 입력 문장에 따르는 표현 결과를 얻는다.
여기서 말하는 표현 결과란 무엇일까?
인간의 문장을 컴퓨터가 이해할 수 있도록 하려면 어떻게 변환해줘야할까?
일단은 "숫자" 일거고... 문장을 모두 나타내려면... 숫자의 나열.. 그것이 바로 "벡터"이다.
대충 만들어서 주면 문장을 이해하는게 어려움을 느낄 것이다.
잘 만들어서 줘야한다. 인코더가 담당한다.
우리는 오늘 인코더에서 배워보려고한다.
위 사진을 보면 인코더 중에서도 첫 번째 단계, Multi-Head Attention 이다.
A dog ate the food because it was hungry.
여기서 it이 의미하는 것이 무엇일까?
dog? food? 사람이 이 문장을 해석해보면 "개가 음식을 먹었다. 왜냐하면 그 개는 배가 고팠기 때문이다."라고 자연스럽게 it이 의미하는것이 dog라는 것을 알 수 있다.
왜냐 food가 배가 고플 수 없다는 것이라고 인간이 단어가 그 문장에서 갖는 의미를 알기 때문이다.
하지만 모델이 이를 알 수 있도록 하려면 어떻게 해야할까?
이 문장이 입력되었을 때, 가장 먼저 'A' 의 표현을, 그 다음으로 단어 'dog'의 표현을 계산한 다음 'ate'라는 단어의 표현을 계산한다.
각각의 단어를 계산하는 동안 각 단어의 표현들은 문장 안에 있는 다른 단어의 표현과 연결해 단어가 문장 내에서 갖는 의미를 이해한다.
이과 같은 연결 작업으로 모델은 'it'이 'food'가 아닌 'dog'와 관련이 있다는 것을 학습한다.
이걸 셀프 어텐션(Self-Attention)이라고 한다.
구체적을 셀프 어텐션의 내부 작동 원리에 대해서 설명하자면, "I am good" 이라는 문장이 있을 때 이 문장을 기준으로 각 단어의 임베딩(벡터)를 추출한다.
- (I): [0.1, 0.3, 0.5, 0.7
- x2 (am): [0.2, 0.4, 0.6, 0.8
- x3 (good): [0.9, 0.8, 0.6, 0.3
그 다음은 입력 행렬 X로부터 Query(Q) 행렬, Key(K) 행렬, Value(V) 행렬을 뽑아내야하는데,
일단, 이 행렬들이 왜 필요할까?
만드는 방법은 초기 가중치값을 랜덤하게 만들고 모델이 학습하면서 가중치값을 계속 바꿔보면서 최적의 Q, K, V 행렬을 찾게되면서 만들 수 있다고 대충 이해하면 된다. 중요한건 이 행렬들의 역할이다.
Q, K, V의 구체적 역할을 이해하는 비유
먼저 이해를 돕기 위해 "I am good"으로 예를 들어 비유를 들자면,
Query (질문)
- "I"라는 단어가 "이 문장에서 가장 중요한 단어는 누구지?"라고 질문.
Key (단서)
- 각 단어("I", "am", "good")는 "내가 중요한 정보를 담고 있는지?"를 나타내는 단서를 제공.
Value (정보)
- Key와 Query가 매칭된 후, 각 단어의 정보를 결과로 출력하기 위해 사용.
그래서 셀프 어텐션에서 Q, K, V 행렬이 필요한 이유는?
입력 문장의 각 단어가 문맥에서 서로 어떻게 관련되어 있는지 계산하기 위한 과정이다.
Query (Q)
- 특정 단어(예: "I")가 다른 단어("am", "good")와 어떤 관련성이 있는지 확인하려면, 이 단어를 Query로 사용해 다른 단어(Key)와의 유사도를 계산한다. 내적을 하게되는데, 두 벡터가 얼마나 유사한지를 알 수 있게된다.
Key (K)
- Key는 각 단어가 어떤 의미적 중요성을 가지고 있는지를 나타내는 기준점된다.
Value (V)
- Query와 Key를 통해 관련성이 높은 단어를 찾으면, 해당 단어의 정보를 가져오기 위해 Value가 사용된다.
Q, K, V를 사용하는 이유 요약
- Q: "현재 단어가 다른 단어들과의 관계를 찾기 위해 질문한다."
- K: "다른 단어들이 질문에 답하기 위한 단서가 된다."
- V: "질문-답변 과정에서 최종적으로 가져올 정보다."
셀프 어텐션의 4단계의 과정을 설명하겠다.
첫번째, 위에서 Query 행렬과 Key 행렬의 내적 연산을 수행한다. 수행된 결과 행렬을 Attention Score 행렬이라고 한다.
-> [ 질문 : 왜 내적한다고 했는가? ]
위 사진을 보면 내적한 결과(보라색 행렬에 겹치는 칸)는 stetland와 sheepdog의 유사도 점수가 들어가게된다.
이는 문장의 각 단어가 다른 모든 단어와 얼마나 유사한지 파악하는데 도움을 준다.
두번째, 쿼리 행렬과 키 행렬 사이의 내적 결과를 제곱근으로 나눈다. 별거 아님.
-> 안정적인 값으로 변환을 위해
세번째, 소프트맥스 함수를 사용해 정규화 작업을 진행한다.
-> 행렬 값들을 0~1 안에서 표현되도록 변환하여, 문장 내에 있는 각 단어가 문제에 있는 전체 단어와 얼마나 연관되어 있나 파악하기 쉽다.
네번째, 이렇게 만들어진 행렬을 Value 행렬을 곱하여 어텐션(Z) 행렬을 계산하는거다.
어텐션 행렬은 입력 단어 간의 유사도와 중요도 관계를 나타내는 행렬이다.
이는 각 단어가 다른 단어에 얼마나 주의를 기울여야 하는지를 수치적으로 표현한 값이다.
셀프 어텐션 행렬 생성과정의 예시
문장: "I am good"
1. 유사도 점수 행렬(행렬곱)
2. 소프트맥스 적용(정규화 과정 포함)
각 행에 대해 소프트맥스를 적용하여 값들을 0~1 사이로 정규화.
3. 어텐션 행렬 계산(행렬곱)
최종 어텐션 값은 소프트맥스 결과 A와 Value 행렬 V의 곱으로 계산된다.
이를 보면 단어 I의 셀프 어텐션은 "I"가 다른 단어들과 상호작용한 결과임을 알 수 있다.
단어 "I" 는 I가 60% am은 25% good은 15% 정도 감미된 결과이다.
각 단어는 자신의 Value 벡터뿐만 아니라, 어텐션 행렬 A를 통해 다른 단어들과의 관계가 반영된 정보로 업데이트되었다.
어텐션 행렬은 단어 간 관계를 효율적으로 파악하여 모델의 성능을 극대화하는 중요한 중간 결과물이다.
위치 인코딩으로 위치 정보 학습
이 작업은 입력 행렬 X 이 만들어졌을 때 맨 처음에 작업하는 내용이다.
이렇게 우리는 문장을 인코더에 넣고 모델이 학습하기 좋은 표현 결과값을 얻을 수 있었다.
다음은 이 표현 결과에 위치 정보도 추가로 넣어서 업그레이드된 표현 행렬을 만들어 보겠다.
우리가 구한 셀프 어텐션 행렬은 위치 정보가 없다.
"i am good"이나 "good amd i"은 서로 동일한 어텐션 행렬을 가질 수 있습니다.
문장의 의미를 이해하기 위해서는 단어의 순서(문장의 단어의 위치 정보)가 중요하기 때문이다.
어텐션 메커니즘만으로는 이 두 문장의 차이를 알 수 없다.
위치 정보를 반영하는 방법: Positional Encoding
입력 행렬을 트랜스모퍼에 바로 입력하면, 단어의 순서를 알 수 없다.
단어의 위치를 표현하는 정보를 제공해야 한다.
이를 위해 인코딩이라는 새로운 방법을 사용하는 것이다.
단어의 임베딩에 위치 값을 포함하여 단어 간의 상대적 또는 절대적 순서를 반영할 수 있도록 한다.
이런식으로 셀프 어텐션을 구하기 이전 입력 행렬에 PE라고 위치 정보를 더해주는 것이다.
위치 인코딩을 하는 방법 중 대표적인 방법론이 "사인파 함수"를 이용하는 방법이다.
즉, 사인(sin) 코사인(cos) 함수를 활용하는 것인데..
왜 사인과 코사인을 사용하나?
- 사인과 코사인은 주기적 함수로, 단어의 상대적인 위치를 잘 반영할 수 있는 점
- 사인과 코사인 값을 다른 차원에서 교대로 사용하면 서로 다른 주파수로 위치 정보를 표현할 수 있는 점
그래서 모델은 이 주기적 패턴을 활용해 단어 순서와 상대적 거리를 학습할 수 있다.
하나의 함수만 사용하지 않는 이유는 주기함수이기 때문에 첫번째 단어의 위치가 0이라고할 때
한바퀴를 돌고 왔는데도 문장의 위치 인코딩이 끝나지 않았다면 N번 째의 단어도 위치 정보가 0이 될 수가 있는 것이다.
실제 위치는 다르지만 모델은 같은 위치라고 학습하게 된다는 말이다.
이를 방지하고자 다른 차원에서 교대로 서로 다른 주파수로 위치 정보를 표현하는 방식을 사용한 것이다.
공식은 다음과 같다.
pos : 위치
i : 차원의 인덱스
d : 임베딩 벡터의 차원
그냥 짝수는 사인함수 홀수는 코사인 함수를 사용한다는 말이다.
그래서 교대로 값을 계산한다.
공식대로 채워넣으면 다음과 같이 정리가 된다.
이렇게 구한 PE(위치 정보)값을 입력 행렬 X에 더해주면 된다.
이 입력 행렬로 구한 셀프 어텐션 행렬은 단어들 사이의 관계뿐만아니라 각 단어의 위치정보까지 함께 알고 있게 된다.
큰 그림에서 오늘 배운 내용이 어딘지 찾아보라.
'A.I.(인공지능) & M.L.(머신러닝)' 카테고리의 다른 글
[ComfyUI] ComfyUI 설치 및 간단 사용법 정리 (1) | 2025.02.05 |
---|---|
intel npu acceleration library - window (0) | 2025.02.03 |
Sana: Efficient High-Resolution Image Synthesis with Linear Diffusion Transformer (2) | 2024.12.02 |
런웨이 & 루마 AI API (1) | 2024.09.22 |
CogVideoX (0) | 2024.09.04 |