← 용어사전
모델 구조

엔그램(N-gram 임베딩) — 곱셈 없이 표에서 꺼내는 기억

「표를 HBM 밖으로 내보낸다」는 말이 왜 FFN 에는 안 되고 엔그램에는 되는지. 최근 모델들이 메모리 벽을 우회하는 방식이다.

용어 풀이정리 2026-09-20모델 구조

엔그램은 최근 토큰 몇 개를 해시해 큰 표에서 행을 꺼내 쓰는 층이다. FFN 과 같이 「표에서 꺼내 잔차 스트림에 더한다」인데 꺼내는 방식이 다르다 — FFN 은 입력을 key 전부와 대 봐야 어디가 걸리는지 알고, 엔그램은 토큰 ID 만으로 읽을 행이 먼저 정해진다. 그 차이가 표를 어느 메모리에 둘 수 있느냐까지 끌고 간다.

핵심 포인트

  • 키가 벡터가 아니라 토큰 ID 다. 지금 토큰과 그 앞 한두 개를 이어 붙여 해시하면 행 번호가 나온다. 모델을 돌리지 않고 산수로만 나오는 값이라, 앞 층이 계산하는 동안 그 행을 미리 당겨 올 수 있다.
  • 그래서 표가 HBM 밖으로 나간다. 뉴스레터가 잰 DeepSeek-V4.1-Flash 기준으로 표는 196.6B(188.8 GiB)인데, 토큰 자리 하나가 실제로 읽는 양은 두 층에서 24행씩, 모두 합쳐 12.4 KiB 다. GPU 4 장에 나누면 한 장당 3.1 KiB. 크지만 가끔 조금씩 읽는 표라 DRAM 이나 NVMe 에 둬도 버틴다.

FFN 과 엔그램 — 21초짜리 한 바퀴

FFN -0.9 -0.8 -0.5 0.7 -0.5 0.9 벡터 896칸 중 6칸 — 값이 이어진다 표 전체와 하나씩 대 본다 표 전체를 읽는다 — 한 층 가중치 13,074,432개 HBM 에 있어야 한다 엔그램 125761 13 136742 토큰 ID 3개 — 번호가 딱 떨어진다 해시로 행 번호를 낸다 짚은 행만 읽는다 — 토큰 자리 하나당 12.4 KiB DRAM 으로 나갈 수 있다 표 — 어디가 걸릴지는 다 대 봐야 안다 표 — 읽을 자리가 먼저 정해진다 같은 일을 하는 둘이다 — 표에서 꺼내 잔차 스트림에 더한다 열쇠로 드는 것이 다르다 — 이어지는 값이냐, 딱 떨어지는 번호냐 찾는 법이 다르다. FFN 은 전부와 대 보고, 엔그램은 번지수를 계산한다 FFN 은 어디가 걸릴지 알려면 표를 끝까지 훑어야 한다 둘 다 결국 몇 칸만 쓴다 — 다른 것은 그 몇 칸을 언제 아느냐다 읽어야 하는 양이 갈린다 그래서 하나는 HBM 에 있어야 하고 하나는 DRAM 으로 나갈 수 있다
같은 일(표에서 꺼내 잔차 스트림에 더한다)을 하는 둘을 나란히 놓았다. 왼쪽은 표를 끝까지 훑어야 어디가 걸리는지 알고, 오른쪽은 토큰 ID 로 행 번호를 먼저 낸다. FFN 쪽 가중치 개수는 Qwen2.5-0.5B 에서 세었고, 엔그램 쪽 수치는 SemiAnalysis 뉴스레터 변환본에서 가져왔다.
  • FFN 은 같은 일을 못 한다. 어느 key 가 걸릴지는 입력을 전부와 대 봐야 알기 때문에 가중치 전체를 매번 읽어야 한다. 한 층에 13,074,432 개다. 그래서 HBM 에 있어야 하고, 이 자리를 줄이려고 나온 것이 MoE(여러 벌 중 일부만 돌린다)와 엔그램(아예 안 돌리고 읽는다)이다.
  • 해시라서 충돌이 난다. 토큰 조합은 표 크기보다 훨씬 많아서 다른 조합이 같은 행에 떨어진다. 그래서 꺼낸 것을 그대로 쓰지 않고, 지금 문맥과 얼마나 맞는지를 재서 게이트로 누른 뒤 더한다. 롱캣은 그 충돌을 줄이려고 표 크기를 어휘 크기의 정수배로 잡지 말라고 권한다.
  • 무엇을 외우는지는 사람 직관과 다르다. 게이트 점수를 훑어 보니 이름·코드 조각· 관계 표현과 함께 라이선스 문구나 API 뼈대 같은 상투 문구가 많이 걸렸다. 「중요한 사실」을 고르는 것이 아니라 다음 토큰 예측을 쉽게 만드는 것이 자리를 차지한다.
  • 떼어 낼 수 있는 사전이 아니다. 추론에서 엔그램을 빼면 이후 층의 표현과 전문가 선택 자체가 달라진다. 원 논문의 제거 실험에서 사실지식 벤치마크가 원래의 29~44% 로 떨어졌고, 모델이 스스로 전문가를 다시 고르게 놔두는 편이 손실을 일부 메웠다.
행 번호는 이 저장소에서 실제 토크나이저로 문장을 자른 뒤 원문이 적은 방식(곱셈 해싱 + XOR 섞기)으로 계산한 값이다 — 그 모델이 쓰는 해시 그대로는 아니고, 「토큰 ID 만으로 읽을 자리가 정해진다」를 보이려고 같은 꼴로 구현했다. 표 크기·읽는 양은 뉴스레터 변환본에서 가져왔다. 굽는 자리는 scratchpad/ngram_trace.py.