요즘은 LLM이 문장을 이해하고 생성하는 능력이 뛰어나서
LLM을 가져다가 '뇌 대리'로 쓰는 경우가 많습니다.
그게 왜 그렇게 똑똑한지 알고 싶으면 LLM의 기반이 되는 트랜스포머 모델이 뭔지 알아봅시다.
쉬움
딥러닝은
딥러닝이 뭐냐면 데이터를 넣어서 데이터를 예측하는 짓인데
예를 들어 모의고사성적을 입력해서 수능성적을 예측해봅시다.
모의고사성적a + b = 예측한수능성적
그럴려면 일단 모의고사성적에 이거저거 곱하고 더해서 수능성적을 예측하는 수식을 세워봅니다.
모의고사성적0.8 + 10 = 예측한수능성적
그리고 a와 b자리에 일단 대충 아무거나 때려넣습니다.
그럼 모의고사성적을 입력했을 때 예측한 수능성적이 나오겠죠?
예측한 수능성적이 70점인데 실제 수능성적은 100점이라면 차이가 30점이나 발생합니다.
그 차이를 최소화 시키도록 수식에 있던 a와 b를 조절하라고 컴퓨터에게 시키는게 딥러닝입니다.
근데 수식을 만들 때 뉴럴네트워크, 활성함수를 쓰고
a와 b를 조절할 때 back propagation이라는걸 쓰는데 자세한건 몰라도 됩니다.
다음 단어 예측
딥러닝은 데이터로 데이터를 예측할 수 있기 때문에
문장을 주었을 때 다음에 올 단어도 예측해볼 수 있습니다.
문장a + b = 다음단어
코드상에선 문자도 숫자로 변환이 가능하니까 이런 짓이 가능합니다.
하지만 이렇게 대충 수식을 만들면 예측 성능이 별로 아닐까요.
그래서 수식을 어떻게 만들어야 예측이 잘되는지 연구를 굉장히 많이 하고 있는데
예측 결과가 아주 좋은 수식이 하나 있습니다.
트랜스포머라고 부릅니다.

뭔가 복잡해보이지만 트랜스포머를 쉽게 말하면
그냥 단어들 간에 서로 얼마나 연관이 있는지를 수치로 계산해주는 수식 같은 것입니다.
1. 임베딩
2. 단어의 포지션정보 더하기
3. attention 계산
4. 마스킹
5. 노멀라이즈 & feed forward
이런 계산 단계를 거쳐서 단어 간에 서로 얼마나 연관이 있는지를 수치로 표현해보고
그걸 바탕으로 다음 단어를 예측해보는 수식까지 마지막에 더해주면
'트랜스포머로 만든 다음단어 예측 AI 모델'이 되고 그걸 사이즈를 키우면 LLM이 됩니다.
구체적인 계산 과정 1. 임베딩
하지만 실제 계산 과정을 봐야 이해가 됩니다.
일단 문장에 있는 단어들을 전부 숫자로 변경해야 수식에 넣을 수 있기 때문에 숫자로 변경해줍니다.
The quick brown fox jumps
예를 들어 이런 문자가 있으면 the는 1, quick은 2, brown은 3으로 바꾸면 되는 것입니다.
하지만 숫자 하나 말고 숫자 여러개를 쓰는 경우가 많습니다.
the는 [0.1, 0.3, 0.2]
quick은 [0.2, 0.4, 0.5]
brown은 [0.5, 0.1, 0.7]
이런 식으로 여러 숫자가 담긴 리스트로 표현을 하는데 이 리스트를 멋있게 임베딩이라고 부릅니다.
임베딩을 사용하면 많은 뜻을 내포하게 할 수 있어서 씁니다.
- 처음엔 대충 랜덤한 숫자들로 넣어도 됩니다.
- 참고로 단어 단위가 아니라 글자 단위, 토큰 단위로로 하는 경우도 있습니다.
구체적인 계산 과정 2. 포지션 정보 더하기
그리고 포지션 정보를 임베딩에 더해줍니다.
왜냐면 트랜스포머는 모든 단어들을 동시에 집어넣고 한 번에 쫙 계산을 해버리는 식으로 동작합니다.
한 번에 집어넣으면 문제가 뭐냐면 단어들의 순서 구분이 어렵습니다.
"I like you"
그니까 이런 문장을 집어넣어도
"You like I"
이런 문장 집어넣은거랑 똑같이 처리가 될 수 있다는 것임
그래서 단어의 순서도 저장을 따로 해두는 부분이 있어야 합니다.
예를 들어서 첫 단어는 [0.1, 0.1, 0.1]
둘째 단어는 [0.2, 0.2, 0.2]
이런 식으로 임베딩으로 표현해서 기존에 있던 단어 임베딩에 더해줍니다.
the는 [0.1, 0.3, 0.2] + [0.1, 0.1, 0.1]
quick은 [0.2, 0.4, 0.5] + [0.2, 0.2, 0.2]
이런 식인데 그냥 행렬 덧셈 같은걸 하면 됩니다.
이해를 돕기 위해서 그냥 [0.1, 0.1, 0.1] 같은 심플한 값으로 해봤습니다.
구체적인 계산 과정 3. attention 계산

사람의 입장에서는 다음에 올 단어 예측은 어떻게 하죠?
지금 써있는 글의 문맥부터 파악해야 합니다.
그래서 컴퓨터상에서 문맥정보를 어떻게 계산할까 많이들 생각을 해보다가 attention이라는 방법을 하나 만들었습니다.
단어들간에 얼마나 서로 영향이 있는지를 계산해보게 하는거에요.
그랬더니 결과가 좋았다는데 어떤 식이냐면

1. Q, K, V라는 이름의 행렬을 준비해서 아무 숫자나 넣어줍시다.
어짜피 학습이 진행되며 알아서 조절되니까 대충 같은 숫자들을 넣어뒀습니다.
그리고 예제로 쓸 문장은 this is a book이고 각각 임베딩은 저렇다고 가정합시다.

2. 각 단어를 Q, K, V 행렬과 곱해서 결과를 뽑습니다.
행렬 곱을 하면 되는데 그럼 위와 같은 값이 나옵니다.

3. this의 Q값과 다른 단어들의 K값들을 곱해서 숫자를 뽑습니다.
행렬 곱을 하면 되는데 그럴려면 K값을 Transpose해서 세로로 발딱 세운 다음에 곱하면 되겠습니다.
2, 0, 1, 2가 나옵니다.

4. 계산한 숫자를 √3으로 나누고 softmax 함수에 넣었다가 뺍니다.
Q값 길이가 3이면 √3으로 나누면 됩니다.
softmax는 큰값은 더 커지고 작은 값은 더 작게 만들어서 과장해주는 함수입니다.
전부 합했을 때 값이 1 나오도록 맞춰주는 효과도 있습니다.

5. 그 값들을 V와 곱해줍니다.
그리고 전부 세로로 더하면 attention value라는게 나옵니다.
this가 this, is, a, book이라는 단어들을 얼마나 참고하고 있는지를 나타내는 값들이 압축되어 들어있습니다.
이게 왜 '다른단어들 참고수치'인지 의문일 수 있는데 그냥 그렇게 생각하기로 한 것일 뿐입니다.
학습이 진행되면 진짜 참고수치 비슷한게 나옴
그리고 이걸 기존 임베딩에 더해주면 되겠습니다.
지금은 this값을 기준으로 곱해봤는데 is, a, book 단어도 똑같이 곱셈해보고 attention value 뽑고 기존 임베딩에 더해주면 됩니다.
구체적인 계산 과정 4. 마스킹
우리는 다음 단어 예측 모델을 만들고 있잖습니까
근데 "this is a book" 문장 전체를 입력해버리면 모든 단어가 노출되기 때문에
단어 예측같은걸 할 수가 없습니다.
그래서 일부러 마스킹을 합니다.
예를 들어 this의 Q값 x 다른 단어 K값 과정을 하고 있으면
this 이후에 나오는 단어의 K값들은 전부 0으로 바꿔서 계산하고
is의 Q값 x 다른 단어 K값 과정을 하고 있으면
is 이후에 나오는 단어의 K값들은 전부 0으로 바꿔서 계산하고
이런 식으로 왼쪽에 오는 단어만 보게 하는 것입니다.
이걸 Causal Mask라고 합니다.
구체적인 계산 과정 5. Normalize, Feed Forward
Attention 값들을 뽑았다면
Normalize라고 해서 나온 값들을 평균 0에 분산 1로 맞춰서 조절해주면 좋으니 그걸 시도때도 없이 해주는 과정도 해주면 좋습니다.
그리고 대충 초딩도 할 수 있는 곱셈만 해서 값을 뽑았는데
곱셈 정도로는 선형적인 예측밖에 할 수가 없다고 딥러닝 강의 시간에 한 것 같은데
그래서 비선형적 예측을 하려고 활성함수에 한 번 넣었다가 뺍니다.
활성함수는 값을 짜부시키는 역할입니다.
그래서 그 결과를 임베딩에 또 더해줍니다.

이제 계산과정 3~5 부분을 계속 반복해주면서 임베딩에 덧셈을 계속 해나가면 되겠습니다.
그리고 마지막에 다음 단어가 뭐가 올지 예측하는 계산과정도 하나 만들어줍니다.
그럼 단어를 숫자로 예측해줄텐데 예측단어 vs 실제단어의 차이가 너무 심하면 수식을 조절하고
그걸 계속 반복하다보면 결국 다음 단어를 정확도 높게 예측해줍니다.
그럼 다다음 단어 예측은?
this is a book
이런 단어를 집어넣어서 다음 단어를 예측하면
this is a book for
이런 문장이 나오고 이런 문장을 또 집어넣어서 다음 단어를 예측하면
this is a book for your
이런 문장이 나오고 이런 문장을 또 집어넣어서 다음 단어를 예측하면
this is a book for your friend
이런 식입니다.
이 작업을 계속 반복하면 긴 문장을 뱉게 됩니다.
그래서 LLM은 기본적으로 단어간의 관계를 파악해서 다음 단어를 계속 예측하는 기계일 뿐인데
모델 사이즈를 키우고 수많은 학습 데이터를 집어넣으면
복잡한 추론도 할 수 있고 코딩도 할 수 있고 그런 신기한 능력이 마법처럼 생기게 됩니다.
그 이유는 아마 수많은 자료를 학습하고 저장해뒀기 때문이 아닐까요.
딥러닝은 학습과정 자체가 그냥 복잡한 숫자계산이기 때문에 인간이 모델을 들여다본다고 해서 구체적으로 원리를 이해할 수는 없긴 합니다.
ChatGPT는 질문답변 형태인데?
다음 단어 예측을 하는 모델이랬는데 ChatGPT는 어떻게 질문 답변 형태로 동작하는거냐면
User: 1+1는?
Assistant: 2입니다.
이런 형태의 문장을 계속 학습시켜서 모델을 만들면 되는 겁니다.
그리고 유저가 예를 들어 "2+2는?" 이런 질문을 한다면
User: 2+2는?
Assistant:
이 문장을 모델에 집어넣으면 되는 것임
그러면 답변을 해줄 것이고 그걸 유저에게 다시 전달해주면 되겠습니다.
그리고 ChatGPT같은 경우 모델이 이상한 답변을 내면 그걸 인간이 개입해서 혼내고 수정하는 '강화학습' 과정을 굉장히 많이 거쳤습니다.
그래서 거의 처음 트랜스포머로 모델사이즈를 크게 키우고
질문답변을 깔쌈하게 할 수 있는 모델을 만들어서 세상밖에 내놓았는데 사람들이 그 답변 성능에 감탄하기 시작했고
덕분에 다음단어 예측기를 AI처럼 쓸 수 있게 되었습니다.
우리도 GPT 미니버전 같은 정도는 직접 만들어볼 수 있는데 그건 딥러닝 강의에서 다루고 있긴 합니다만






