좋았어 두 번째 글
뉴스
2026년 1월 5일, 젠슨황 선생님께서 CES에서 발표를 하심
할 얘기가 참 많았는데 공부할 것도 많아서 뒤늦게 하나씩 썰을 풀어보고자 함
우선 KV 캐시
KV 캐시에서 병목이 생기고 있고, 에이전트로 가면서 병목이 더 심해지고, 차세대 베라 루빈 시스템에서는 이걸 따로 관리하기 위해서 별도의 메모리 구조를 갖추고 그걸 운영하는 칩셋도 따로 만들었다고 함. 그걸 구동하려면 낸드 사용량이 폭발한다고 함
한국인 투자자로서 메모리 수요 늘어나면 좋기는 한데, 왜 늘어나는지 얼마나 늘어나는지 언제까지 늘어나는지 감을 좀 잡아야겠음
나름대로 트랜스포머 구조에 대해서 공부했다고 생각했는데, 매우 얄팍했다는 걸 깨닫고, 좀 더 공부함
주안점
KV Cache가 뭔데?
왜 문제가 되는데?
솔루션은?
낸드가 공급부족이 된다고? 진심?
KV Cache가 뭐냐면
트랜스포머부터
트랜스포머 구조가 뭔지부터 설명을 해야겠는데. 트랜스포머 구조를 아는 사람이면 그냥 넘어가도 됨. 사실 트랜스포머 구조를 잘 아는 사람이면(KV Cache가 뭔지 아는 사람이면) 이 글 자체를 안 읽으셔도 됨. 대단한 인사이트가 아니라 그냥 공부한 거 정리한 포스팅임
트랜스포머를 이해하려면 우선 언어 번역 알고리즘을 만드는 시절로 거슬러 올라가야 함. 규칙 기반이니 뭐니 하는 이야기는 집어치우고, 구글 이야기부터. 구글은 언어는 확률이다, 통계적 분포로 언어를 이해할 수 있다는 큰 가설을 가지고 이런저런 시도를 하고 있었음. (구글이 최초는 아님)
우리가 사용하는 언어는 상당히 많은 생략된 정보를 담고 있음. 'Apple'이라고 하면 사과인지 아이폰 만드는 회사인지 모름. '사과'라고 하면 apple인지 apology인지 모름. 문장 중에 it이 나오면 그게 뭘 지칭하는지 모름. 인간은 대화의 전반적인 맥락에서 해당 단어가 구체적으로 뭘 의미하는지 대충 알아들음. (말그대로 대충 알아듣는 거라서, 인간과 인간 간의 대화도 삑사리가 많이 남)
언어를 다루려면 우선 문장을 토큰화해야 함. 의미가 뭔지를 이해하기 전에, 의미를 가진 단위들로 일단 문장을 쪼개야 그 의미를 알든가 말든가 할 거 아님? 언어에서 의미를 가진 최소단위를 토큰이라고 함. (정확히는, 모델이 언어를 이해하기 위한 최소단위라서, 형태소보다 더 잘게 쪼개기도 함.) 예를 들어, 방금 앞 문장에서는 "언어/에서/의미/를/가지/ㄴ/최소/단위/를/토큰/이라고/하/ㅁ" 이런 식으로 문장을 분해할 수 있음. 이렇게 분해된 각각이 토큰임. 언어별로, 모델별로 토큰을 쪼개는 방식이 다양하긴 한데, 그건 넘어가자.
언어모델이 언어를 학습한다는 건 여러 과정이 있는데, 그중 하나가 임베딩임. 임베딩은 토큰을 N차원 공간에 배치하는, 즉 언어의 지도를 그리는 작업임. 토큰을 임베딩하고 나면 신기한 현상을 발견할 수 있는데. 언어에서도 연산이 가능하다는 거. '서울'이 배치된 위치에서 '- 한국 + 프랑스'를 연산하면 '파리'가 나옴. (서울이 위치한 벡터(행렬)에서 한국의 벡터만큼 마이너스 덧셈을 하고 프랑스의 벡터만큼 더하면 파리가 나온다는 뜻. 행렬연산은 다들 할 줄 알잖음?)
참고로 말이 N차원이지, 지금의 언어모델에서 N의 값은 수천~수만에 달함. 이 각각의 차원이 뭐냐면, 아마도 먹는 거, 입는 거, 인간관계, 물리적인 실체, 감정, 뭐 이런 다양한 범주들일 건데, 그게 뭔지는 사실 모름. 인간은 이해할 수 없음. 그냥 학습시켜놓고 나면 고양이와 강아지는 가깝고, 공룡과는 멀고, 공룡은 고대와 가깝고 인간은 현재와 가깝고, 뭐 그렇게 배치가 되는 거임. 뭘 기준으로 이렇게 배치했는지는 모름. (이걸 알아내려고 하는 별도의 연구분야도 있기는 함)
암튼 이렇게 언어를 쭉 배치해놓고 나면, 영어에서의 언어 배치와 한국어에서의 언어 배치가 상당한 유사성을 띌 거 아님? 물론 차이가 있겠지만 그 차이도 확률적으로 유의한 어떤 연산이 존재할 가능성이 높음. 우리는 영어 텍스트를 학습시켜서 영어가 임베딩된 지도를 가지고 있고, 한국어 텍스트를 학습시켜서 한국어가 임베딩된 지도를 가지고 있음. 그러면 영어에서 'apple'이라는 인풋이 들어왔을 때, 한국어 지도에서 이 토큰이랑 가장 유사한 위치에 있는 토큰이 뭐야?를 찾아보면 신기하게도 거기에 '사과'가 있다는 거임
근데 아까 말한 것처럼 apple이 사과인지 애플사인지는 맥락에 따라 정해지니까. 그걸 알아야 번역을 할 수 있을 거 아님? 그래서 등장한 게 '컨텍스트 벡터'임. 쿼리 문장을 쭉 읽은 다음에, 모델에 넘기기 전에, 우선 이 문장 자체가 뭐에 대한 이야기를 하는지를 정함. 휴대폰 사용에 관한 이야기를 하고 있었다면 apple은 아이폰 만드는 애플일 가능성이 높고, 농장에서 일하는 중이라면 apple은 사과일 가능성이 높겠지. 그렇게 컨텍스트 벡터랑 합쳐서 쿼리를 모델에 집어넣으면, apple이 실제 의미하는 그 위치로 뿅 하고 가게 된다는 거임. (정확히는 value라는 어떤 값을 생성하는 거)
이걸 가지고 번역모델을 만든 게 RNN(Recurrent Neural Network)임. 번역이 꽤 잘됨. 신남
근데 문장이 길어지면 성능이 떨어짐. 왜? 맥락이라는 게 시간이 갈수록 변하잖아. 우리가 대화를 할 때에도 주제가 계속 바뀌잖음. 영화에서도 장면이 계속 바뀌고. (장르가 바뀌기도 하고 ㅋㅋ) 이런 컨텍스트 드리프트의 문제도 있고, 컨텍스트 벡터는 한번 뽑으려면 인풋 토큰 전체를 연산해야 함. 문장이 길어질수록 부하가 많이 생김. (사실 이 문제는 트랜스포머에서도 상당히 남아있음)
그래서 여기에 더해서, 하나의 문장(혹은 여러 개의 문장들) 안에서 각 토큰이 다른 토큰과 가지는 상대적인 관계를 측정해보면, 토큰의 의미를 좀 더 정확하게 알 수 있지 않을까? 라는 가설을 가지고 시도한 게 '셀프 어텐션'임
"나는 고양이를 좋아해"라는 문장이 있으면, "나/는/고양이/를/좋아/해"로 토큰을 쪼개고, "나"라는 토큰이 다른 각 토큰과 얼마나 거리가 떨어져 있는지, "는"이라는 토큰이 다른 모든 토큰과 얼마나 떨어져 있는지 등을 모든 토큰에 대해서 계산하는 거임. 그럼 여기서 "는"은 "나"와 가깝고 다른 토큰과는 떨어져있음. "를"은 "고양이"와 가까우면서 "나", "좋아"와도 꽤 가까움
이걸 어디다 쓰냐고? 다음 문장을 보자.
"The animal didn't cross the street because it was too tired."
여기서 it이 지칭하는 바는? animal임. 셀프 어텐션 함수에 넣으면 it과 animal이 가깝다는 결과가 도출됨. tired가 animal과 가깝기 때문. 그 결과를 통해 모델은 it이 animal을 지칭한다고 알게 됨. 만약 마지막 'tired'를 'wide'로 바꾼다면?
"The animal didn't cross the street because it was too wide."
여기서 it은 street과 가깝다는 결과가 나옴. it과 가까운 wide가 animal보다는 street과 가깝기 때문.
이렇게 컨텍스트 벡터에 더해서 셀프 어텐션을 넣으니까 문장이 길어져도 번역이 꽤 잘됨. 매우 신이 남. 근데 컨텍스트 벡터 계산도 힘든데 셀프 어텐션까지 계산하려니 연산량이 어마어마함. (한 토큰이 가지는 value 하나를 뽑는 데 수천 행을 가진 행렬곱이 들어감)
여기서 신박한 아이디어가 떠오름. 컨텍스트 벡터가 없어도 되지 않을까? 셀프 어텐션을 넣으니까 성능이 너무 좋아져서, 야 이거 사실 컨텍스트 벡터는 필요없는 거 아닐까 해서 컨텍스트 벡터를 빼봤어. 근데 와, 성능이 너무 잘 나오는 거임. 속도도 빨라지고. 그래서 나온 논문이 기념비적인 "Attention is All You Need"임. 대 트랜스포머의 시대를 연 논문임. 이 논문 발표 이후 컨텍스트 벡터를 사용하던 RNN 아키텍쳐에서 에서 어텐션만 사용하는 트랜스포머 아키텍쳐로 대세가 급격히 변함
그리고 번역을 잘하는 언어모델을 가지고 있으면, 이걸 그대로 활용해서 챗봇도 만들 수 있음. 영-한 번역용 언어모델이 영어를 인풋으로, 한국어를 아웃풋으로 해서 두 언어 지도에서 유사한 위치를 찾아내는 과정이라면, 인풋인 영어 지도를 그대로 두고, 아웃풋을 '한국어 지도'에서 '영어 텍스트에서 하나의 토큰에 이어지는 다음 토큰'으로 바꾸면 그대로 챗봇이 됨. 이게 언어의 범용성임
현시대의 생성형 AI는 대부분 트랜스포머 기반임. 챗봇은 물론이고, 그림이든 동영상이든 자율주행이든 기본적으로 트랜스포머 아키텍쳐를 사용함. 이제 여러분은 어디서 누가 인공지능이 어쩌고 LLM이 어쩌고 할 때 "트랜스포머 아키텍쳐 기반 LLM에서는..."이라고 하면서 약간 아는척할 수 있게 되었음
KV는 Key, Value
이 셀프 어텐션이라는 녀석이 '관계 계산'을 한다는 게 핵심인데, 그걸 어떻게 하는지를 좀 자세히 살펴보자. (여기서부터가 어제오늘 공부한 내용임.)
우선 어텐션 함수는 다음과 같음
여기서 Q는 Query, K는 Key, V는 Value, T는 Transpose(행렬연산을 하기 위해서 변환), dk는 디멘션의 크기임. 공식이 나오니까 머리가 어질어질한데, 잠깐 눈좀 깜빡거리고 바깥풍경 좀 본 다음에 계속 진행하자. 눈은 소중하니까.
이제 알아야 할 개념이 Query(Q), Key(K), Value(V)임. 트랜스포머는 인풋으로 들어온 ...











