트랜스포머 아키텍처
출처:
유튜브 모두의AI, 초거대 언어모델 간단 알아보기: https://youtu.be/XwlLeVhWCCc?si=ymMOPMExeTPl-hqj
유튜브 Coding Opera Korea, 자연어처리 트랜스포머: https://youtu.be/-z2oBUZfL2o?si=P4HdHFZtqQbC7cjN
* 트랜스포머 아키텍처
현재 ChatGPT와 같은 전세계 자연어처리 모델(LLM)들을 이루는 가장 핵심 아키텍처
인코더와 디코더로 이루어져 있다
인코더: 말을 잘 이해하는 영역
아날로그 신호를 암호화된 디지털 신호로 바꾼다
디코더: 말을 잘 하는 영역
암호화된 디지털 신호를 아날로그 신호로 바꾼다.
트랜스포머의 원래 목적은 번역기였다
2017년 구글 논문에서, 번역 특화 모델로 트랜스포머가 제시되었다.
이전: RNN, LSTM - 직렬 연산 방식, 느리다
반면, 트랜스포머는 병렬 연산이 가능하다.
RNN 계열 모델들의 성능을 능가한다.
* 위 이미지에서 N은 인코더와 디코더의 개수를 뜻한다.
예를 들어, 2 Layer encoder decoder transformer는 다음과 같은 구조를 가진다.
* 트랜스포머 아키텍처의 구조
(1) Embedding
(2) Positional Encoding
(3) Multi-Head Attention
(4) Residual Connection
1. Embedding
딥러닝계: 숫자의 집합을 tensor라고 많이 한다
임베딩: 자연어를 AI가 알아들을 수 있게 tensor로 변환한다.
아날로그 -> 디지털
자연어 -> tensor
one hot encoding
TFIDF 등 다양한 인코딩 방식이 있다.
2. Positional Encoding
자연어에서 어순이 바뀌면?
의미가 달라진다.
순서가 중요하다.
하지만 트랜스포머는 병렬 연산을 하는 모델이다.
트랜스포머 모델은 단어의 순서가 없다.
따라서 단어의 순서를 알려주는 정보를 따로 만든다.
임베딩 vector: 의미를 가지고 있다.
여기에 positional encoding vector를 더해준다.
합쳐진 새로운 벡터는 단어의 위치 + 의미를 모두 알고 있다.
어떻게 위치를 알려주나?
사인과 코사인 함수를 활용한다.
ai 모델은 예측 가능한 범위에서 왔다갔다해야 한다.
안정적이어야 한다.
따라서 정규화를 많이 한다.
i: location of embedding vector(임베딩 벡터 = 단어의 의미, tensor는 벡터)
벡터의 순서를 i로 나타낸다.
짝수번째 i일 때, sin 함수 사용
홀수번째 i일 때, cos 함수 사용
번갈아가며 사용하는 이유: 경우의 수를 늘린다. 더 긴 문장도 겹치지 않게 하겠다.
sin함수 하나만 활용하면, 주기가 2파이(7보다 작다)
문장의 길이가 7보다 커지면 값이 겹쳐진다.
따라서 임베딩의 위치마다 사인 코사인을 번갈아가면서 사용한다.
d_model: 벡터 크기
정규화를 하기 위해 벡터 크기로 나눈다.
지수 부분에서 분모가 커지면 sin(0)에 수렴한다. 따라서 d_model로 나눠준다.
3. Multi-Head Attention
* Attention이란?
트랜스포머 구조에서 가장 중요한 부분이다. ⭐️
it이 무엇인지, 문맥 이해가 필요하다.
기계에게 이를 이해시키는 것이 어려웠다.
시간이 지나 Attention으로 해결
각 단어들마다의 관계를 다 계산한다.
(GPU로 병렬 연산하여)
Self-Attention
하나의 문장(시퀀스) 안에서 단어들 간 관계를 계산한다.
자기 자신의 문장에 대한 attention
각 단어들 사이의 상관관계를 알 수 있다.
I가 가리키는게 student라는 것을 알 수 있다.
입력 시퀀스 내에서 각 단어(또는 토큰)가 다른 모든 단어들을 참조해서 자신이 어디에 집중해야 할지를 계산하는 메커니즘이다.
The animal didn't cross the street because it was too tired.
문장에서 it이 가리키는 게 animal 이라는 것을 이해하려면, "it이 문장의 앞부분과 연결되어야 한다.
self-attention은 이런 연결을 "단어 간 관계(weight)"로 파악한다.
attention은 Query, Key, Value로 구성되어 있다.
Query, key: 관계형 데이터베이스에서 가져온 개념
모든 단어를 Query, Key, Value 벡터로 변환한다.
즉, Query, Key, Value는 입력 벡터에서 파생된 세 가지 벡터
연산을 위해 사용하는 것일뿐
자연어를 tensor(임베딩 벡터)로 만든다.
Query Layer = Neural Network. 인공 신경망
위는 self-attention이다.
쿼리랑, 키랑, value가 같은 값이 들어간다
다시 말해, Query Layer 등 레이어 값은 서로 다르지만 student를 변환한 임베딩 벡터는 똑같이 사용한다.
들어가는 인풋 값이 같은 것이다
output값은 다 다르다.
T: transpose(전치), 행과 열을 바꾸는 것
행렬 A의 전치 행렬을 A_T라고 쓸 때, 행렬의 (i, j) 원소가 전치 행렬에서는 (j, i) 위치에 있게 된다.
Q x K_T = (1 x 2)행렬 X (2 x 1) 행렬 = 스칼라 => Attention Score(Query와 Key의 유사도)
d_k: size of Embedding (student라는 인풋을 tensor로 변환했을 때 크기)
student 케이스는 d_k가 4
루트 4 = 2
Attention: 단어와 단어 사이의 관계에 의해서 결정되어야 한다.
루트 d_k로 나누는 것은 정규화를 해주는 것
Softmax: 출력층에서 사용되는 특수한 활성 함수 (주로 분류 문제)
출력값을 확률처럼 0~1 사이로 정규화하고 총합이 1이 되도록 만들어준다.
-무한대로 가면 0으로 가고
+무한대로 가면 1로 간다.
예시
Softmax 적용 결과:
Softmax(z)=[0.659,0.242,0.099]\text{Softmax}(z) = [0.659, 0.242, 0.099]
=> 첫 번째 값이 가장 클 확률이 높다고 판단
활성함수(Activation Function)
신경망의 각 뉴런이 얼마나 활성화될지 결정하는 함수
입력 신호를 받아서 비선형 변환을 해주고, 다음 층으로 넘겨주는 역할을 한다.
선형 함수만 계속 쓰면 신경망이 아무리 깊어져도 결국 하나의 선형 함수가 된다.
따라서 비선형성을 주기 위해 활성 함수가 필요하다.
Softmax(스칼라) 연산하면 스칼라인데, 벡터를 만들어주기 위해 Value를 곱한다.
Value를 조정을 해주는 것.
그 결과, Attention Value Matrix가 나온다.
Output: Value의 weighted sum (문맥 반영 결과)
예시
W_Q: Query Layer
W_K: Key Layer
W_V: Value Layer
레이어 통과하면 weight다
Self-Attention: 각 단어 간의 관계
자기 자신과의 관계는 1(행렬의 대각선 방향)
I와 가장 연관 관계가 높은 것은 student
이런 모델이 학습이 잘 된 모델이다
실제로 계산할 때는 통째로 넣는다
병렬 연산 해야 하니까
연산 속도가 1/4이 된다.
* 그렇다면 Multi-head Attention이란?
구글에서는 Single-head Attention보다 Multi-head Attention 성능이 더 좋았다고 말했다.
Multi-head Attention
self-attention을 병렬로 여러 번 수행하는 구조
일반 self-attention은 한 번에 한 관계만 잘 학습할 수 있다.
여러 Head를 사용하면 문맥을 더 풍부하게 이해할 수 있다.
ex.
"The cat sat on the mat because it was tired."
- Head 1: "it"이 "the cat"을 가리키는 걸 학습
- Head 2: "sat"과 "on the mat"의 위치 관계를 학습
- Head 3: "because"와 원인/결과의 논리 연결에 집중
concat = 옆으로 쌓는 것이다
✅ Multi-head Attention 구조
1. 입력:
시퀀스의 모든 토큰(예: 단어 임베딩들)
2. Head마다 따로 Self-Attention 수행:
보통 8개 또는 12개 Head가 있고, 각각 다른 W_Q, W_K, W_V 가중치를 사용함
즉, 각 head는:
3.출력들을 concat해서 하나로 합침
4. 최종 선형 변환
Masked: 가렸다는 의미
future words를 가려서 모델이 학습할 수 있게 한다
전체 중의 나 하나
Masked Multi-Head Attention은 자기 다음 단어(future words)를 보지 못하도록 가리는 Self-Attention이다.
주로 트랜스포머의 디코더에서 사용된다.
attention 행렬에 마스크를 씌워 softmax 시 확률을 0으로 만든다.
마스킹해서 attention weight를 0으로 만든다.
4. Residual Connection
* 인공 신경망
인간 뇌의 뉴런 구조에서 아이디어를 얻어 만든 수학적 모델
데이터를 입력받아, 여러 층의 계산을 거쳐, 최종 출력값을 만드는 함수의 집합
* Residual Connection
위에서 인풋 x이 여러 레이어를 거쳐 output으로 변환된다. => F(x)
F(x)에 자기 자신(x)을 더하는 것
이유는? Vanishing gradient problem 때문
Vanishing gradient problem이란?
모델이 깊어짐에 따라 마지막 input gate의 weight가 0으로 가는 현상
back propagation:
모델을 통해 output이 나오면,
output과 참값을 비교해 Loss를 구한다(모델의 아웃풋이 4인데, 참값은 5라면 loss가 1인 식이다)
loss가 있으면 output부터 레이어를 거쳐 input단까지를 업데이트하는 것
역으로 해주다보면 weight 값들이 1보다 작아진다.
예를 들어, 옆으로 갈 때마다 *0.9를 한다.
그럼 input단이 0으로 수렴한다. (기울기가 소멸한다)
왼쪽
뉴럴 네트워크 통과 시, 0.001이 곱해지는 예
오른쪽
gradient가 흐를 수 있는 우회로를 만들어준다.
정보가 소실되지 않게 도와주는 우회 통로다.
Residual Connection = 입력을 출력에 더해주는 연결
학습해야 할 것만 학습하고, 나머지는 그대로 통과시킨다.
정보 손실을 줄이고, 학습을 더 안정화시켜준다.
Layer Normalization: 각 데이터 샘플(토큰)의 특성 차원(feature dimension)을 기준으로 정규화를 수행하는 기법
모델 학습을 안정화하고 속도를 높이는 데 쓰인다.
Add a Norm = Add a Normalization
AI => 정규화가 중요하다
Layer normalization: Layer에 있는 것들을 정규화한 것
엡실론: 작은 값
개를 0, 고양이를 1이라고 할 때
어떤 ai는 어떤 개를 1로 판단하고, 어떤 고양이를 100으로 판단할 수 있다.
정규화가 필요하다.
min-max
100으로 나눠서 맞춰준다.