외운 다음에 비로소 이해하기 시작할 때
grokking을 384개 설정으로 재현해 일반화 시점을 멱법칙으로 정리한 논문을 해설합니다. 데이터가 왜 가장 센 레버인지, weight decay 1.0의 경계가 무엇을 가르는지 따라갑니다.
원문 논문 보기
이번에 다룰 논문은 Quantifying the Memorization-to-Generalization Transition: Scaling Laws and Phase Structure in Grokking으로, arXiv에 2609.10657 번호로 공개된 연구입니다. 이 논문은 grokking이 일어나는 시점을 멱법칙 하나로 정리할 수 있다고 말합니다. 원문 링크는 제목 아래에 걸어두었습니다.
학습 정확도가 먼저 100%에 닿은 뒤 한참이 지나 테스트 정확도가 갑자기 뛰어오르는 현상을 두고, 저자들은 두 은닉층 MLP와 모듈러 연산 과제를 384개 설정으로 바꿔가며 그 시점을 측정했습니다. 제가 이 논문을 고른 이유는 단순합니다. grokking을 신기한 일화로 두지 않고, 언제 일어나는지 숫자로 답하려 했기 때문입니다.
외운 뒤에 찾아오는 늦은 이해가 왜 낯설지 않을까요
시험 전날 밤을 떠올리면 이해가 됩니다. 문제를 통째로 외웠는데, 다음 날 아침에 갑자기 풀이 구조가 보이는 순간이 있죠. 신경망에서도 비슷한 장면이 나옵니다. 학습 데이터는 이미 완벽하게 맞히는데, 보지 못한 데이터는 한참 동안 틀리다가 어느 순간 정확도가 수직으로 올라갑니다. 연구자들은 이 늦은 점프를 grokking이라고 불렀습니다.
저는 이 논문에서 가장 흥미롭게 본 부분이 바로 그 늦음을 대하는 태도였습니다. 많은 설명이 grokking을 우연한 지연이나 운 좋은 수렴처럼 다루는데, 여기서는 다릅니다. 저자들은 외움과 이해 사이에 재현 가능한 거리가 있다고 보고, 그 거리를 너비와 데이터와 학습률과 weight decay로 설명하려 합니다. 그래서 이 글은 신기함을 구경하는 순서가 아니라, 그 거리를 재는 도구를 뜯어보는 순서로 갑니다.
그런데 여기서 바로 질문이 생깁니다. 외움 다음에 오는 이해를 시계로 잴 수 있을까요. 논문의 답은 잴 수 있다는 쪽이고, 그 시계를 T_grok이라고 부릅니다. 학습 정확도가 포화된 뒤 테스트 정확도가 올라오는 데 걸리는 시간인데요. 이 정의를 먼저 잡아야 뒤에 나오는 지수들이 읽힙니다.
무엇이 외움과 이해를 가르는 걸까요
모듈러 연산 과제를 생각하면 구분이 쉬워집니다. 덧셈표를 통째로 외우는 방법과, 덧셈 규칙 자체를 파악하는 방법은 전혀 다른 해입니다. 둘 다 학습 데이터에서는 100점을 받습니다. 그런데 새로운 숫자 조합이 나오면 한쪽만 살아남죠. 외운 표는 낯선 조합 앞에서 무너지고, 규칙을 잡은 쪽은 그대로 통과합니다.
이 차이는 겉보기보다 큽니다. 학습 손실만 보면 두 해가 똑같아 보이거든요. 그래서 학습 곡선만 오래 쳐다본 사람은 이해의 점프를 놓치기 쉽습니다. 겉으로는 아무 일도 없는 구간이 길게 이어지다가, 뒤늦게 테스트 곡선만 움직이기 때문입니다. 저는 여기서 멈칫했습니다. 우리가 평소에 모니터링하는 지표가 정작 그 전환을 보여주지 않는다면, 무엇을 봐야 할까요.
논문이 대신 보자고 하는 것은 가중치의 움직임입니다. 학습 정확도가 멈춘 뒤에도 가중치는 계속 움직이는데, 그 방향이 바깥으로 팽창하는 게 아니라 안쪽으로 조여드는 쪽이라는 겁니다. 외운 표를 지탱하던 크고 복잡한 가중치가 조금씩 가벼워지면서, 규칙에 가까운 형태로 정리된다는 이야기입니다. 생각해보면 사람도 비슷하게 배웁니다. 처음에는 이것저것 다 외우다가, 나중에는 한 줄짜리 원리로 묶어내죠.
384번 반복하면 무엇이 보일까요
한두 번의 성공담으로는 법칙을 말하기 어렵습니다. 그래서 저자들은 두 은닉층 MLP라는 작고 다루기 쉬운 구조를 고정하고, 너비 H와 데이터량 D와 학습률 eta와 weight decay lambda를 바꿔가며 384개 설정을 돌렸습니다. 모듈러 연산이라는 단순한 과제 덕분에 외움과 이해의 차이가 선명하게 드러나고, 작은 모델 덕분에 많은 반복이 가능했던 셈입니다.
저는 이 숫자보다 그 뒤의 구조가 더 중요하다고 봅니다. 384라는 숫자는 성실함의 표시가 아니라, 네 변수를 동시에 흔들어야 상호작용까지 볼 수 있다는 판단에 가깝기 때문입니다. 하나씩 바꾸면 각 변수의 효과가 보이지만, 같이 바꿔야 현실에서 벌어지는 일이 보입니다. 데이터가 많을 때 학습률을 올리면 어떻게 되는지, 너비가 클 때 weight decay가 어떻게 작용하는지 같은 질문은 격자를 촘촘히 쌓아야 답이 나옵니다.
물론 범위가 제한적이라는 점은 분명히 해둘 필요가 있습니다. 두 은닉층 MLP와 모듈러 연산에서 얻은 숫자라서, 바로 대형 언어 모델로 가져갈 수는 없습니다. 여기서는 조금 조심해서 읽을 필요가 있습니다. 그럼에도 이 설계가 값진 이유는 비교의 기준선을 만들기 때문입니다. 작은 세계에서라도 전환 시점을 잴 수 있으면, 큰 세계에서 무엇을 재야 할지 감이 생기죠.
데이터를 두 배로 주면 왜 네 배 빨라질까요
이제 논문이 내놓은 식을 그대로 옮겨보겠습니다. 일반화가 시작되는 시점 T_grok은 H의 마이너스 0.27제곱, D의 마이너스 2.04제곱, eta의 마이너스 0.50제곱, lambda의 마이너스 0.64제곱에 비례합니다. 지수의 마이너스는 값이 커질수록 시점이 빨라진다는 뜻이고, 숫자가 클수록 그 레버가 세다는 뜻입니다.
여기서 재미있는 질문이 생깁니다. 네 변수 가운데 진짜 주인은 누구일까요. 답은 데이터입니다. D의 지수가 마이너스 2.04로 압도적으로 크거든요. 데이터를 두 배로 늘리면 이해에 도달하는 시간이 대략 4배 빨라집니다. 반면 너비를 두 배로 늘리면 빨라지는 정도는 1.2배 수준에 그칩니다. 같은 모델에 같은 질문을 던져도 데이터 구성에 따라 결과가 크게 달라질 수 있다는 것을 경험으로 알고 있죠. 그 경험이 여기서는 숫자로 확인된 셈입니다.
이 차이는 운영 감각과도 이어집니다. 모델을 키우는 일은 보통 비용이 크고 서빙 부담까지 따라오는데, 효과는 상대적으로 조용합니다. 그런데 데이터를 늘리는 일은 같은 비용으로도 전환 시점을 크게 당깁니다. 저희가 새로운 AI 아키텍처를 볼 때도 benchmark 숫자만 보지는 않습니다. 실제로 무엇이 바뀌었고, 그 변화가 시스템에서 어떤 비용 구조를 만드는지를 함께 봅니다. 이 논문 앞에서라면 저는 데이터를 먼저 묻겠습니다. 어떤 조합을 얼마나 더 보여줘야 이해가 빨라지는지 말이죠.
모델을 키워도 왜 조용할까요
너비 지수가 마이너스 0.27로 작다는 결과는 처음 보면 허전합니다. 모델을 키우면 뭐든 빨라질 것 같은데, 여기서는 존재감이 옅거든요. 그런데 곰곰이 뜯어보면 그럴 만한 구석이 있습니다. 모듈러 연산처럼 규칙 자체는 단순한 과제에서는, 표현력이 이미 충분한 구간을 넘어서면 너비를 더해도 풀어야 할 문제가 달라지지 않기 때문입니다.
그렇다면 너비는 아무짝에도 쓸모없을까요. 그렇게 말하기에는 이릅니다. 너비가 넓으면 서로 다른 해를 담을 그릇이 커지고, 그 가운데 단순한 해가 선택될 여지도 생깁니다. 다만 그 선택을 실제로 밀어붙이는 힘은 다른 곳에서 옵니다. 이 논문에서는 데이터와 weight decay와 학습률이 그 힘을 나눠 갖죠. 너비는 무대를 넓혀주지만, 막을 올리는 신호는 따로 있다는 이야기로 읽힙니다.
개인적으로 인상 깊었던 점은, 이 결과가 모델 키우기 경쟁을 부정하지 않는다는 것입니다. 오히려 언제 모델을 키워야 하는지를 가려줍니다. 규칙 발견이 병목인지, 표현력 자체가 병목인지를 먼저 물어보라는 뜻으로 들렸습니다. 작은 과제에서 규칙 발견이 병목이라면 너비를 두 배로 늘리는 대신 데이터를 두 배로 늘리는 쪽이 훨씬 쌉니다. 반대로 모델이 너무 작아서 규칙을 담을 그릇조차 안 된다면 이야기는 달라지겠죠. 그 경계를 재는 눈금이 바로 다음에 나옵니다.
weight decay 1.0 앞에서 무엇이 갈라질까요
논문에서 가장 드라마틱한 장면은 weight decay lambda가 1.0 근처를 넘을 때 나타납니다. 그 값을 기준으로 grokking이 일어나는 영역과 일어나지 않는 영역이 비교적 날카롭게 갈립니다. 점진적으로 빨라지는 정도가 아니라, 일어남과 일어나지 않음이 갈라지는 경계라는 점에서 상전이 같아 보입니다.
왜 하필 weight decay일까요. weight decay는 가중치를 계속 안쪽으로 잡아당기는 힘입니다. 외운 표처럼 크고 빽빽한 해는 이 당김 앞에서 버티기 어렵고, 규칙처럼 작고 단단한 해는 버텨냅니다. 그래서 일정 수준을 넘기면 학습 뒤쪽 구간이 완전히 달라집니다. 학습 정확도는 똑같이 100%인데, 그 뒤에 따라오는 궤적이 갈리는 것이죠. 문제는 그다음입니다. 그 경계가 모든 과제에서 1.0일까요. 아닐 겁니다. 이 숫자는 이 실험 설정에서 관측된 위치라서, 과제나 구조가 바뀌면 위치도 움직일 수 있습니다.
그렇다면 이 경계는 어디에 써먹을까요. 저는 일종의 operating point로 읽었습니다. weight decay를 너무 낮게 잡으면 외운 채로 멈추고, 너무 높게 잡으면 학습 자체가 흔들릴 수 있는데, 그 사이 어딘가에 이해로 넘어가는 통로가 있다는 뜻이니까요. 실제 학습을 돌리는 입장에서는 다음 질문이 바로 생깁니다. 우리 과제에서의 경계는 어디에 있는지, 그리고 그 경계를 학습 도중에 찾을 신호가 있는지 말이죠. 논문은 작은 세계에서 그 신호의 후보로 가중치 노름을 가리킵니다.
가중치가 가벼워지는 동안 무슨 일이 일어날까요
가중치 노름 궤적은 이 논문에서 제가 두 번째로 오래 머문 그림입니다. 학습 정확도가 포화된 뒤에도 노름은 단조롭게 줄어드는데, 바로 그 구간에서 테스트 정확도가 뒤늦게 올라오기 때문입니다. 겉으로는 조용한데 속으로는 정리가 진행되는 것이죠. 외운 흔적들이 조금씩 지워지면서 더 작은 해로 이동하는 모습으로 읽힙니다.
저자들은 이 움직임을 implicit regularization이 단순한 해를 고르는 과정과 결이 같다고 설명합니다. 명시적으로 단순하라고 가르치지 않아도, 최적화 과정 자체가 작은 쪽으로 기울어져 있다는 이야기입니다. 일종의 오답 노트처럼요. 틀린 것을 고치는 게 아니라, 외운 것을 가볍게 만드는 방식으로 답에 다가갑니다. 이 해석은 grokking을 왜 나중에 일어나는지로도 연결됩니다. 가벼워지는 데는 시간이 걸리니까요.
다만 여기서 과장하지 않으려 합니다. 노름이 줄었다는 사실이 곧 규칙을 찾았다는 증명은 아니기 때문입니다. 노름은 그럴듯한 대리 지표이지, 회로 수준의 증거는 아닙니다. 그럼에도 실무적으로는 쓸모가 있습니다. 테스트 세트를 계속 까볼 수 없는 상황에서도, 학습 뒤쪽 구간에서 노름이 어떻게 움직이는지는 볼 수 있으니까요. 밤사이 긴 학습을 돌려놓고 아침에 로그를 확인할 때, 테스트 곡선만 기다릴 게 아니라 노름 곡선의 기울기를 함께 보면 전환이 가까운지 짐작할 수 있습니다.
0.73이라는 설명력을 어떻게 받아들여야 할까요
멱법칙의 설명력은 R제곱 0.732였고, 상호작용 항을 넣으면 0.821까지 올라갑니다. 이 숫자를 어떻게 읽어야 할까요. 매우 잘 맞는다는 쪽도, 아직 덜 맞는다는 쪽도 아닌 그 사이 어딘가에서 읽어야 합니다. 네 변수만으로 전환 시점 변동의 70% 넘게를 설명한다는 것은 꽤 단단한 결과입니다. 동시에 남는 20% 안팎은 이 식이 다 담지 못하는 구조가 있다는 뜻이기도 합니다.
상호작용 항을 넣었을 때 설명력이 올라간다는 대목이 바로 그 힌트입니다. 변수들이 따로 노는 게 아니라 서로 얽혀 있다는 뜻이거든요. 데이터가 많을 때 learning rate의 효과가 달라지고, 너비가 클 때 weight decay의 당김이 다르게 느껴질 수 있습니다. 현실의 학습은 한 변수씩 따로 돌아가지 않으니 당연한 일인데요. 식이 단순한 곱셈에서 살짝 벗어나는 순간 설명력이 올라간다는 것은, grokking이 단일 레버가 아니라 레버들의 조합으로 움직인다는 방증으로 보입니다.
저는 이 숫자를 낙관도 비관도 아닌 실용으로 읽었습니다. 0.73이면 다음 실험의 출발점으로 삼기에는 충분하고, 그대로 믿고 예산을 걸기에는 부족합니다. 특히 모듈러 연산이라는 깨끗한 과제에서 얻은 숫자라서, 노이즈가 많고 분포가 흔들리는 실제 데이터에서는 설명력이 낮아질 가능성이 있습니다. 그래서 이 식을 정답지로 쓰기보다 나침반으로 쓰는 편이 맞습니다. 방향은 데이터 쪽, 그다음은 weight decay와 학습률 쪽, 너비는 보조라는 방향 말이죠.
실제 학습을 돌리는 입장에서는 무엇이 달라질까요
이론을 잠시 내려놓고 계산서를 펼쳐보면 이야기가 달라집니다. 데이터를 두 배로 늘리는 일과 모델 너비를 두 배로 늘리는 일은 비용 구조가 전혀 다릅니다. 너비를 키우면 매 스텝의 연산과 메모리가 함께 불어나고, 서빙 단계까지 그 무게가 따라갑니다. 반면 데이터를 늘리는 일은 학습 단계의 비용은 키우지만 서빙 무게는 그대로 둡니다. 전환을 4배 당기는 쪽과 1.2배 당기는 쪽 가운데 어디에 돈을 쓸지는, 이 숫자 앞에서는 고민이 짧아집니다.
물론 데이터에도 함정이 있습니다. 같은 것을 두 배로 보여준다고 이해가 빨라지지 않거든요. 분포를 넓히는지, 규칙을 드러내는 조합을 더 보여주는지가 중요합니다. 논문에서 말하는 D는 단순한 파일 개수가 아니라 과제 복잡도와 얽힌 양이라서, 무작정 복사해서 늘린 데이터와는 다릅니다. 좋은 건 알겠는데, 이걸 실제로 어떻게 모을까요. 이 질문이 바로 실무의 목입니다. 모듈러 연산에서는 가능한 조합을 체계적으로 늘릴 수 있지만, 현실에서는 어떤 조합이 규칙을 가르치는지부터 찾아야 합니다.
그래서 저는 이 논문을 인프라 이야기로도 읽었습니다. grokking을 기다리는 학습은 길고 조용한 뒷구간을 필요로 해서, 중간에 멈추지 않고 돌릴 수 있는지가 관건이 됩니다. 체크포인팅과 재개, 긴 꼬리를 버티는 스케줄러, 뒤쪽 구간에서 노름과 테스트 신호를 함께 보는 모니터링이 그 뒷받침이죠. 짧게 돌려서 되는 과제라면 몰라도, 늦은 이해를 노린다면 학습 시스템 자체가 기다림에 최적화되어야 합니다.
저는 이 논문을 앞으로 어떻게 써먹을까요
정리하면 남는 문장은 짧습니다. 이해가 늦는 데는 이유가 있고, 그 이유는 재볼 수 있으며, 가장 센 지렛대는 데이터라는 것입니다. weight decay 1.0 부근의 경계와 가중치 노름의 단조로운 압축은 그 이야기를 옆에서 받쳐줍니다. 설명력 0.73과 0.82 사이 어딘가에 있는 한계까지 합치면, 과장 없이 받아들일 수 있는 그림이 됩니다.
제가 앞으로 보고 싶은 것은 세 가지입니다. 첫째, 모듈러 연산을 벗어나면 지수가 어떻게 바뀌는지입니다. D의 마이너스 2.04가 과제마다 유지되는지, 아니면 과제 복잡도에 따라 움직이는지가 궁금합니다. 둘째, 노름 말고 더 직접적인 회로 증거가 뒤따라오는지입니다. 어떤 회로가 언제 생겨나는지까지 보이면 압축 이야기가 훨씬 단단해집니다. 셋째, 경계 너머의 세계입니다. weight decay를 더 올리면 이해가 더 빨라지는지, 아니면 학습 자체가 무너지는지가 실무에서는 바로 다음 질문이 되니까요.
마지막으로 사람 이야기로 닫겠습니다. 외운 다음에 이해가 오는 순서는 기계만의 습관이 아닙니다. 저도 새로운 분야를 만지면 처음에는 용어부터 외우고, 한참 뒤에야 구조가 보입니다. 그렇다면 기다림을 설계하는 일이 남습니다. 언제까지 외움 구간을 버틸지, 어떤 신호를 보고 기다림을 이어갈지, 그리고 데이터를 어떻게 더 보여줄지를 미리 정해두는 것이죠. 이 논문은 그 기다림을 감이 아니라 숫자로 다루자고 제안합니다. 저는 그 제안이 마음에 들었습니다. 기다림의 길이를 잴 수 있으면, 기다림은 막연한 인내가 아니라 계획이 되기 때문입니다.