메모리에서 출발했다면 트랜스포머는 직접 발명할 수도 있었습니다

You could have invented transformers from memory

alexwang.ai ▲ 498 댓글 117 speckx

요약

선형층과 MLP, 셀프 어텐션은 모두 키-값 기억 장치이고, 뒤로 갈수록 담을 수 있는 기억이 크게 늘어납니다.

알렉스 왕이 개인 블로그에 쓴 글입니다. 비슷한 키로 물으면 저장해 둔 값을 꺼내 주는 연상 기억 장치에서 출발해 이를 조금씩 고치다 보면, 트랜스포머의 부품이 차례로 나온다고 설명합니다.

왜 중요한가

  • 트랜스포머의 층들이 왜 그런 모양인지를 기억이 덜 섞이게 꺼내는 능력이라는 한 가지 기준으로 설명합니다.
  • 층마다 기억을 얼마나 담을 수 있는지 대략 어림하는 잣대를 제시합니다.
  • 긴 문맥에서 어텐션 점수를 문맥 길이의 로그에 맞춰 키우는 기법(Qwen의 LogN-Scaling 등)이 왜 필요한지도 같은 틀로 설명합니다.

핵심 내용

  • 기억의 품질은 다른 기억이 목표 기억을 얼마나 흐리는지로 재고, 그 간섭이 신호만큼 커지는 지점을 용량으로 봅니다.
  • 키와 질의의 유사도에 ReLU(음수를 0으로 만드는 함수) 같은 비선형 함수를 씌우면 2층 MLP가 되고 간섭이 줄어듭니다.
  • 지수 함수를 쓰고 정규화하면 소프트맥스(점수를 합이 1인 비율로 바꾸는 함수)가 되어 셀프 어텐션과 같은 식이 됩니다.
  • 셀프 어텐션에서는 문맥 속 토큰 하나하나가 기억 하나를 저장하는 셈이라고 설명합니다.
  • 키 차원이 64일 때 용량은 가장 단순한 방식이 64개, ReLU MLP가 128개, 셀프 어텐션이 약 120만 개로 추산됩니다.

HN 반응

  • 오랜만에 보는 잘 쓴 글이라는 호평이 많았지만, 기호 정의가 부족해 수학 배경이 없는 독자는 따라가기 어렵다는 불만도 거셌습니다.
  • 무작위 키를 가정해 실제 데이터의 구조를 무시했다는 지적과, 트랜스포머가 당연해 보이게 끼워 맞춘 이야기라는 반론도 나왔습니다.

댓글

30개 표시 · 전체 117개
  1. ketothekingdom HN

    안녕하세요, 글쓴이입니다! 도움이 될 것 같아서 짧은 요약도 올려 둡니다: https://x.com/heyyalexwang/status/2111158818730397932?s=46

  2. rd11235 HN

    근래 본 블로그 글 중에서 손꼽히게 잘 쓴 글이네요. 감사합니다.

  3. ketothekingdom HN

    감사합니다! 오랫동안 머릿속에만 담아 두었던 이야기인데, 드디어 여러분과 나눌 수 있게 되어 기쁩니다.

  4. 3abiton HN

    정말 잘 읽었습니다. 저도 제가 떠올린 아이디어를 꽤 많이 기록해 뒀고, 사람들과 이야기하면서 더 늘었습니다. 안타깝게도 앉아서 정리하고 글로 쓸 시간은 아직 못 냈지만요. 이 글을 보니 많은 영감이 됩니다!

  5. nico HN

    훌륭한 글을 써 주셔서 감사합니다.

    충실도(fidelity)와 재현율(recall)이라는 개념, 그리고 맨 위의 이미지와 애니메이션을 보니 이 주제들을 건드리는 작고 재미난 프로젝트가 떠올랐어요: https://nicobrenner.github.io/lossy-git/

  6. ketothekingdom HN

    정말 기발한 아이디어네요! 저도 해 보고 싶어졌어요.

  7. plasticeagle HN

    솔직히 말해서 글에서 몇 가지가 꽤... 거슬립니다. 글은 잘 쓰셨는데, 초반에 여러 용어를 정의하지 않고 넘어가요.

    d_k가 뭡니까? k 벡터의 차원이라고 짐작은 합니다. 마찬가지로 d_v는 v 벡터의 차원일 테고요. 그럼 이 이른 단계에서 "i" 첨자는 뭘 위한 겁니까? 굳이 없어도 되는데 혼란스럽기만 합니다.

    키가 "유사도에 기반한 조회에 쓰인다"고 하셨는데, 이게 무슨 뜻입니까? 무엇과의 유사도입니까? 기존 키들입니까, 아니면 다른 무엇입니까?

    첫 번째 예시에서는 또 "M"이라는 식별자가 나오는데, 기억의 개수인 듯합니다. 이것도 정의되어 있지 않습니다. 다시 유사도를 이야기하더니 "가중치(weights)"를 끌어들입니다. 그런데 Mxd_k 행렬은 키 전체로 이루어진 행렬이지 "가중치"가 아니잖아요. 적어도 이 용어는 갑자기 튀어나온 겁니다. "토큰(tokens)"이라는 말도 이 즈음 등장하는데, 이것 역시 정의가 필요합니다.

    처음 읽는 사람의 눈으로 글 전체를 훑어보셔야 한다고 생각합니다. 쓰는 용어는 전부 정의하고, 불필요한 표기는 빼고, 이런 "기억 저장소"에 왜 관심을 가질 만한지도 처음에 설명하면 좋겠습니다.

    지금 무슨 일이 벌어지는지 제대로 설명해 주는 글이 필요합니다. 저는 아직 그런 글을 못 찾았습니다.

  8. justinnk HN

    글 맨 처음에 나오는 "Here are the terms we’ll use throughout."(앞으로 쓸 용어들입니다.) 문장 뒤에 많은 것이 분명하게 정의되어 있던데요(예를 들어 M, d_k, d_v).

  9. newsy-combi HN

    거기서 d_k나 R^d_k가 무슨 뜻인지는 말하지 않잖아요. 그런 예는 얼마든지 더 있고요. 저는 수업을 들은 적이 있어서 알지만, 독자 모두가 그랬을 거라거나 고등교육이라도 받았을 거라고 가정하는 건 말도 안 되고 불쾌합니다. 고등학교 수학도 아니고, 그렇다고 엄청나게 어려운 것도 아니라서 더 답답하죠. 글쓴이가 이런 것들을 설명하는 데 조금만 더 공을 들였어도 독자층이 몇 배로 늘었을 겁니다. 그런데 다른 관점에서 생각하지 못하는 건지, "뻔한 것"을 정의하느라 시간을 낭비하지 않는 척하며 동료들에게 아부하는 건지 모르겠네요. 순수한 학계의 맹점이 그대로 드러난 글입니다.

  10. newsy-combi HN

    100% 동의합니다. 수학자들은 글을 정말 못 써요. 아무리 애써도 사소하지 않은 중요한 정의를 대충 넘어가 버립니다. 이 글쓴이도 노력은 한 것 같은데, 동시에 또 하나의 학계 속물처럼 부정적인 피드백은 무시하는 것 같네요.

  11. jkman HN

    본인이 더 거만하고 짜증 나게 굴기 전에, 그런 걸 알아내려고 다른 글이나 자료를 찾아보기라도 해 봤습니까? 대학 신입생이나 할 법한 불평이네요.

  12. zmmmmm HN

    이런 블로그 글을 읽을 수 있어서 좋네요.

    저는 이 부분에서 멈칫했습니다.

    If the keys are random unit vectors (키가 무작위 단위 벡터라면)

    그러면 이 글은 우리가 "백색 잡음"을 저장하려 한다는 전제 위에 서 있는 셈이잖아요. 그런데 현실의 데이터에는 그보다 훨씬 많은 구조가 있습니다. 구조가 하나 있을 때마다 더 압축할 여지가 생기죠. 그러니 여기서 나온 결론은 참된 추정치가 아니라 상한이나 하한일 뿐입니다.

    이 점은 다음 문장으로 해명된다고 봅니다.

    In fact we haven’t actually considered the training data at all, which affects what actually is being represented in the keys and values (사실 우리는 학습 데이터를 전혀 고려하지 않았는데, 이것이 키와 값에 실제로 무엇이 표현되는지를 좌우한다)

    하지만 이건 핵심을 너무 가볍게 말한 겁니다. 모델의 압축성은 물론이고 지능도 상당 부분은 분명히 데이터의 구조에서 나옵니다. 그런 것 없이도 MLP와 트랜스포머 구조를 유도해 낼 수 있다는 건 아주 흥미롭습니다. 하지만 진짜 힘은 이것들이 데이터의 구조와 상호작용하는 데서 나옵니다.

  13. _kulang HN

    임베딩 공간에서는 백색 잡음이 되는 거 아닐까요? 완벽한 압축은 백색 잡음과 구별되지 않는 결과를 낳으니까요. 적어도 제가 이해한 기본 개념은 그래요. 데이터가 무엇이든 완벽하게 압축하면 백색 잡음처럼 보인다는 거요.

  14. tooDumbForML_th HN

    대부분은 따라갈 수 있을 것 같고, 질문하면서 Claude와 같이 읽으면 어차피 이해하게 되겠지만, 일단 사람들에게 먼저 물어보려고요.

    카파시(Karpathy)의 영상은 대부분 봤는데 꽤 오래전이라서, 제 질문이 멍청하게 들린다면 아주 오래전 기초 수준에 머물러 있어서입니다.

    이걸 구체적인 예로 바꿔 보려고 미국 50개 주의 주도를 사실로 저장한다고 해 볼게요. 가장 단순한 토큰화를 쓰면 ['AL': 1, 'AK': 2, 'AZ': 3, ... 'WI': 49, 'WY': 50, 'Montgomery': 51, 'Juneau': 52, ... 'Cheyenne': 100]이 됩니다.

    (여기에 임베딩 행렬이 필요합니까? 맨 처음 선형 예시에서도 "토큰"마다 하나씩 100x64 임베딩 행렬이 필요할 것 같은데요? 아니면 50x64 행렬 두 개가 필요한 걸까요?)

    그다음에는 무작위로 초기화한 V와 K 행렬을 학습하는 거죠. 'AL' 행을 K와 내적하고 'Montgomery' 행을 V와 내적한 다음 그 둘을 다시 내적하고, 나머지 주들도 똑같이 처리하면서 손실 함수를 최적화해서 성능이 좋은 V와 K를 얻을 때까지요?

    한 걸음 더 나아가서 'StateHasCapital' 토큰과 'IsCapitalOf' 토큰(각각 101, 102번이라고 하죠)을 추가하고, 이걸 이용해 ['StateHasCapital'+'AL': 'Montgomery'] 같은 복합 키로 학습시키고 싶기도 했습니다. 정말 사실을 학습하는 거라면 50개 주→주도 전체와 주도→주 일부(25개쯤)로 학습시킨 다음, 학습에 쓰지 않은 나머지 주도로 "사실"을 배웠는지 시험해 볼 수 있지 않을까요? 예를 들어 주도가 올림피아인 주가 어디인지 조회해 보는 식으로요.

    처음의 선형 예시에 맞지 않는 단계들을 마구 뒤섞어서 복잡하게 만들고 있을 수도 있고, 뒤쪽 예시에 너무 많은 걸 끼워 맞추려는 것일 수도 있습니다(셀프 어텐션을 다루는 부분 어디에서도 'Query' 행렬이 안 보이는데, 어쩌면 이 글은 "기억이 이렇게 동작한다"는 이야기이지 LLM이 어떻게 동작하는지에 대한 글이 아닐지도 모르겠네요.

  15. pocksuppet HN

    임베딩 행렬은 항상 있어야 합니다. 어떤 벡터가 토큰 'AL'이고 어떤 벡터가 'AK'이고 어떤 벡터가 'Cheyenne'인지를 정하는 게 임베딩 행렬이에요. 'AL'은 1,0,0,0,0,..., 'AK'는 0,1,0,0,0,..., 'Cheyenne'은 ...,0,0,0,0,1처럼 단순하게 정할 수도 있는데, 그것도 여전히 임베딩 행렬입니다. 규모가 커지면 쓸 수 없는 것일 뿐이죠.

    저는 이 글을 결론까지 제대로 따라가지 못했습니다. "거듭제곱이 높을수록 좋다"는 말의 논리적 귀결은 당연히 거듭제곱을 무한대로 보내는 극한을 취하는 것이고, 그건 가장 비슷한 키를 찾아서 그에 대응하는 값을 돌려주는 것과 같잖아요. 높은 거듭제곱이 더 잘 작동한다는 걸 알면서 왜 모든 거듭제곱을 조합해 쓰는 겁니까?

    우리가 왜 "기억"을 이런 식으로, 그러니까 결국 일종의 트랜스포머가 되는 방식으로 동작하게 해야 하는지는 글 어디에도 설명이 없었습니다.

    컨텍스트 토큰이 기억을 저장한다는 이야기는 말이 안 됩니다. 정의상 그것들은 전부 현재 프롬프트에서 온 것이니 기억이 아니죠!

    글 전체가 트랜스포머가 당연한 발명품이었다고 믿게 만들려고 꾸며 낸 그럴싸한 이야기처럼 느껴집니다.

  16. yoz-y HN

    글에서 "you"가 되려면 어떤 요건을 갖춰야 하는지 정의해 주면 좋겠네요.

  17. penguin_booze HN

    이 글이, 그리고 이런 부류의 다른 글들이 말하는 'you'에는 당신도, 나도, 우리 같은 사람들도 확실히 포함되지 않습니다.

    얼마 전에 젠슨 황이 자기가 어디 사는지(주소) 모른다고 태연하게 말했다고 하더군요. 여기서 'you'가 처한 상황도 젠슨 황의 경우와 비슷합니다. 어느 쪽도 상대편이 어떤 처지인지 이해하지 못하니까요.

  18. layer8 HN
  19. yoz-y HN

    이거 정말 유용하네요. 일반적인 "you"가 "one"을 뜻한다는 건 몰랐습니다. 저는 늘 "독자인 당신"이라는 뜻으로 읽었고, 이런 글을 읽을 때마다 일주일에 한 번씩 절망했거든요.

  20. wk_end HN

    저는 영어 원어민인데, "독자인 당신"으로 읽습니다. 아니면 "독자인 당신"과 "임의의 독자", 혹은 "one" 사이에 실질적인 차이가 있다고 느끼지 못한다고 해야겠네요. 원래 댓글은 제목에 대한 좋은 비판이라고 생각합니다.

  21. aatd86 HN

    꼭 독자일 필요는 없어요. 일반적으로 "you"는 구체적으로 누구를 가리키는지 알 수 없는데, 같은 경험을 공유하는 누구든 뜻하기 때문이죠. (제가 여기서 뭘 하려는지 보이시나요?) 그런 구문은 아마 글을 읽다가 접해 봤을 겁니다 ;). 구어체 영어에서 'One'은 들어 본 적이 없어요.

  22. wongarsu HN

    'one'은 일반적인 'you'보다는 일반적인 'I'에 좀 더 가깝다고 생각할 수도 있겠네요.

  23. mdp2021 HN

    추상화입니다. 바로 "당신"이지만 당신 한 사람만이 아니라 추상적으로 "대상화된" 아무 사람이라는 거죠(1인칭을 성찰적으로 취한 정신적 사례까지 포함해서요).

  24. coldtea HN

    This is actually useful. I didn’t know that generic “you” meant “one”. I always interpreted it as “you the reader” and felt desperate once a week when reading articles like these. (이거 정말 유용하네요. 일반적인 "you"가 "one"을 뜻한다는 건 몰랐습니다. 저는 늘 "독자인 당신"이라는 뜻으로 읽었고, 이런 글을 읽을 때마다 일주일에 한 번씩 절망했거든요.)

    이런 글에서는 "독자인 당신", 혹은 "내가 염두에 둔 독자층(예컨대 박사 과정 동료들) 중 임의의 독자"라는 뜻이 맞습니다.

    "one"의 뜻으로 쓰는 건 다른 용법이고, 좀 더 격식 있는 말투에서 쓰입니다.

  25. zahlman HN

    그렇긴 해도 이 글의 독자층은 여전히 꽤 좁습니다.

    (3b1b가 트랜스포머가 무엇인지 설명한 영상조차 독자층은 좁은 편이니까요.)

  26. sam345 HN

    제 짐작에는 그 댓글이, 제목에서 "you"가 보통은 길거리의 평범한 사람을 가리키는데 이 글에서는 수학이나 컴퓨터 과학 등의 박사 학위가 있는 평범한 사람을 뜻한다는 의미였던 것 같습니다. 저는 전부 이해가 안 됐고, 링크를 클릭한 사람의 95%(HN인 점을 고려하면 그보다 조금 적겠지만)도 마찬가지였을 겁니다. 그래도 저는 이 제목을 제가 받을 자격이 없는 칭찬으로 받아들이겠습니다.

  27. layer8 HN

    저는 "누구나 가능하다"가 아니라 "누군가는 가능하다"로 읽었어요.

  28. alex-moon HN

    "You could have invented..."(당신도 발명할 수 있었다...)

    아, 이건 수학이 나오겠구나 싶었죠. (링크를 클릭하고)

    "Here are the terms we will use throughout: a 'memory store' is a function f..."(앞으로 쓸 용어들입니다. '기억 저장소'는 함수 f이고...)

    그래, 역시. 하하! 맞네!

  29. monktastic1 HN

    상당히 정교한 수학적 구조를 수학을... 하나도 안 쓰고 설명해 주기를 바라셨던 건가요?

  30. newsy-combi HN

    수학을 쓰면서도 사소하지 않은 표기법을 설명하는 데 몇 줄 쓸 수 있죠. 이 경우에는 어렵지도 않았을 거고, 글이 명백히 폭넓은 독자를 겨냥한 거니까 관련된 여러 정의를 대충 넘어간 건 글쓴이의 실수입니다.

Hacker News에서 보기 ↗