어텐션을 통째로 바꾸지 않고 통과시키는 법, TinyCeNN-LM이 보여준 품질 게이트 변환
학습된 어텐션을 무작정 대체하지 않고 표현과 손실 두 관문을 함께 통과한 층만 바꾸는 TinyCeNN-LM의 셀룰러 리커런트 변환을 구조와 숫자, 운영 관점에서 읽어봅니다.
원문 논문 보기
arXiv에 공개된 TinyCeNN-LM: Quality-Gated Conversion of Pretrained Attention with CeNN-Inspired Cellular-Recurrent Layers (2609.21139)는 학습된 언어 모델의 어텐션을 셀룰러 리커런트 층으로 바꾸는 연구입니다. 이 논문은 대체 자체보다 호환성을 묻고, 표현과 손실이라는 두 관문을 함께 통과한 층만 변환한 뒤 나머지는 원래대로 두자고 제안합니다. 원문 링크는 제목 아래에 걸어 두었습니다.
왜 저는 이 논문을 끝까지 읽었을까요
안녕하세요, 패트릭입니다. 저는 어텐션을 대체하겠다는 논문을 보면 보통 속도 그래프부터 찾는데요, 이번에는 그래프보다 질문이 먼저 눈에 들어왔습니다. 그 질문은 대체 층이 그럴듯해 보여도 뒷층이 기대하던 표현을 받지 못하면 어떻게 되느냐는 것이었고, 저에게는 꽤 현실적으로 들렸습니다. 학습된 모델에서 한 층을 바꾼다는 것은 부품 하나를 바꾸는 일로 끝나지 않습니다. 그 뒤에 이어진 모든 층의 입력 분포를 흔드는 일이기 때문입니다.
생각해보면 사람 조직도 비슷합니다. 회의에서 요약 담당자가 바뀌면 회의록 문체는 달라지고, 그 문체에 맞춰 일하던 다음 담당자는 같은 지시도 다르게 받아들입니다. 모델에서도 앞층이 내놓는 hidden state가 조금만 달라져도 뒷층의 계산은 어긋날 수 있는데, 논문은 이 지점을 정면으로 다룹니다. 그래서 저는 이 숫자보다 그 뒤의 구조가 더 중요하다고 봅니다, 라는 말을 이번 글에서는 조금 아껴두고 싶습니다. 숫자는 뒤에서 다룰 텐데, 먼저 구조가 왜 이렇게 생겼는지를 따라가 보시면 전체 이야기가 훨씬 잘 읽힙니다.
여기서 재미있는 질문이 생깁니다. 어텐션을 더 좋은 무언가로 통째로 교체하는 대신, 통과할 수 있는 층만 골라 바꾸면 어떨까요. 논문은 바로 그쪽을 택했고, 저는 그 선택에서 운영자의 냄새를 맡았습니다. 전부 바꾸겠다는 선언보다, 어디까지 바꿔도 안전한지를 재는 태도가 더 오래가기 때문입니다.

어텐션을 떼어내면 왜 뒷층이 당황할까요
학습된 Transformer에서 어텐션은 혼자 일하지 않습니다. 각 층이 만든 표현은 다음 층의 query와 key, value 계산으로 들어가고, 정규화와 잔차 연결을 거치면서 다음 층이 익숙해진 범위를 유지합니다. 그런데 어텐션을 다른 연산으로 바꾸면 출력의 결이 달라지는데, 평균과 분산이 미세하게 이동하거나 특정 위치에 대한 강조가 바뀌는 식입니다. 이런 어긋남은 한 층에서는 작아 보여도 쌓이면 커집니다.
저는 이 대목을 읽으면서 예전에 겪은 마이그레이션 작업이 떠올랐습니다. 데이터 파이프라인에서 전처리 하나를 고쳤을 뿐인데, 그 뒤에 붙은 피처 스케일러와 모델 입력이 전부 흔들린 적이 있죠. 코드는 정상이었고 단위 테스트도 통과했지만, 분포가 달라지니 전체 품질이 미묘하게 내려갔습니다. 모델 내부도 마찬가지라서, 대체 모듈의 단독 성능이 좋아 보여도 연결된 상태에서의 거동은 별개로 봐야 합니다.
그렇다면 무엇을 재야 할까요. 논문은 손실 하나만 보지 않습니다. 최종 출력의 정확도에 해당하는 신호와 함께, 층 출력 자체가 원래와 얼마나 닮았는지를 함께 봅니다. 최종 점수가 유지돼도 내부 표현이 크게 달라졌다면 뒷층이 우연히 버틴 것일 수 있으니까요. 이런 구분은 실제 시스템 관점에서 보면 다음 질문이 바로 생깁니다, 라는 문장을 쓸 만한 장면인데, 저는 여기서 멈칫했습니다. 손실이 괜찮으면 된 것 아닌가 하는 생각이 들었기 때문입니다. 그런데 다음 절의 탈락 사례를 보면 왜 두 잣대가 필요한지 감이 옵니다.
통과하지 못하면 돌려보내면 되지 않을까요
논문이 든 해법은 이름 그대로 quality-gated conversion입니다. 모든 어텐션 층을 미리 정해둔 새 구조로 바꾸는 대신, 층마다 후보 대체를 끼워보고 정해진 기준을 통과한 층만 남기는 방식입니다. 통과하지 못한 층은 미련 없이 원래 어텐션으로 되돌리는데, 이런 accept-or-rollback 태도가 전체 설계의 뼈대입니다.
이 발상은 욕심을 줄이는 대신 신뢰를 얻습니다. 열 개의 층을 다 바꾸면 논문 제목은 화려해지겠지만, 배포할 수 있는 모델은 오히려 줄어들 수 있습니다. 반면 세 개 층만 바꿔도 품질이 그대로라면 그 이익은 바로 쓸 수 있는데, 캐시가 줄고 연산 경로가 단순해진 층이 생기기 때문입니다. 저희가 새로운 AI 아키텍처를 볼 때도 benchmark 숫자만 보지는 않습니다. 실제로 무엇이 바뀌었고, 그 변화가 시스템에서 어떤 비용 구조를 만드는지를 함께 봅니다. 이런 기준으로 보면 게이트 방식은 점수 경쟁보다 운영에 가깝습니다.
여기서 또 하나 짚을 점은 게이트를 사후 필터로 이해하면 어긋난다는 사실입니다. 변환 후에 운 좋게 걸러내는 장치라기보다, 처음부터 통과를 전제로 층을 설계하고 학습시키는 흐름에 가깝습니다. 후보 구조가 게이트를 염두에 두고 만들어졌기에, 어떤 층은 잘 맞고 어떤 층은 맞지 않는다는 결과가 의미를 갖습니다. 그렇다면 다음 질문은 자연스럽습니다. 후보 구조는 어떻게 생겼기에 어떤 층과는 잘 맞을까요.
이 연구를 속도 경쟁으로 읽으면 놓치는 것
요즘 효율 연구를 보면 초당 토큰이나 학습 시간 단축이 먼저 나오곤 합니다. 그런데 이 논문은 그런 이야기를 앞세우지 않습니다. 증거로 제시된 숫자를 봐도 캐시 감소는 최대 6.01% 수준이고, 퍼플렉서티 변화는 마이너스 0.07%에서 플러스 0.93% 사이에 머뭅니다. downstream sanity check로 뽑은 200개 항목의 정확도도 28.5%에서 32.0% 사이로 보고되는데, 압도적인 점프는 없습니다.
이 대목에서 조심해서 읽을 필요가 있습니다. 숫자가 작다고 성과가 작다고 말하면 글은 편해지지만 사실과 멀어집니다. 논문은 전부 바꾸고 무조건 빠르게 만드는 법을 제안하지 않습니다. 품질을 깨지 않고 구조를 바꾸는 절차를 제안합니다. 속도 그래프를 기대하고 펼치면 심심한 논문이지만, 마이그레이션 절차로 읽으면 꽤 단단한 논문입니다.
저는 이 태도가 마음에 들었습니다. 연구가 할 수 있다고 말하는 범위와 할 수 없다고 말하는 범위가 비교적 분명했기 때문입니다. universal replacement나 speedup을 주장하지 않고, 보수적인 게이트 변환을 지지한다고 선을 긋는데, 이런 자기 제한은 나중에 뒤집을 부담을 줄여줍니다. 운영자 입장에서는 과장된 약속보다 이런 제한이 더 반갑습니다. 무엇을 안 하겠다고 말해주는 문서가 실제로는 더 쓰기 편하기 때문입니다.

이웃 셀과 작은 메모리가 만나면 무슨 일이 생길까요
후보 구조는 CeNN에서 영감을 받은 cellular-recurrent 층입니다. 이름이 길지만 그림으로 보면 감이 옵니다. 넓게 흩어진 어텐션처럼 모든 토큰을 한 번에 바라보는 대신, 가까운 이웃과의 계산을 반복하면서 작은 recurrent memory에 필요한 맥락을 차곡차곡 쌓는 방식입니다. 여기에 routing이 붙어 어떤 정보를 메모리에 남기고 어떤 정보를 바로 흘려보낼지를 고르고, fusion이 이웃 계산과 메모리 내용을 합쳐 다음 층으로 넘깁니다.
일상적인 비유를 들면 일종의 오답 노트처럼요, 라고 말할 수 있을 것 같습니다. 교과서 전체를 매번 다시 읽는 대신, 옆 페이지와 앞 장의 요점만 반복해서 보고 작은 수첩에 요점을 적어두는 공부법과 비슷합니다. 수첩이 작으니 다 적을 수는 없고, 그래서 무엇을 적을지 고르는 규칙이 성적을 가릅니다. 모델에서도 메모리가 작으니 라우팅 규칙이 좋아야 하고, 이웃 계산이 탄탄해야 메모리의 빈틈을 메울 수 있습니다.
그런데 이 구조가 모든 층에 잘 맞을까요. 저는 그렇지 않을 것이라고 봅니다. 초기 층처럼 지역적인 패턴을 다듬는 곳에서는 이웃 계산이 어텐션의 역할을 상당 부분 대신할 수 있겠지만, 먼 거리를 한 번에 엮어야 하는 층에서는 작은 메모리가 금방 벅찰 수 있기 때문입니다. 이 예상은 뒤에 나오는 층별 승인 결과와 잘 맞물리는데, 그래서 구조 설명을 길게 한 것입니다. 숫자를 보기 전에 이런 예상을 세워두면 결과 목록이 검증 과정으로 읽힙니다.
두 개의 시험을 모두 통과해야 하는 이유
게이트의 규칙은 단순합니다. 후보 층은 표현 유사도와 NLL 증가라는 두 시험을 함께 통과해야 합니다. 표현 유사도는 층 출력이 원래 층 출력과 얼마나 닮았는지를 재고, NLL 증가는 최종 언어 모델링 손실이 얼마나 더해졌는지를 봅니다. 두 값 모두 정해진 threshold를 넘어야 승인되는데, 하나라도 어기면 탈락입니다. 이런 strictness가 논문의 성격을 규정합니다.
왜 두 개가 필요할까요. NLL만 보면 최종 점수는 유지되는데 내부가 크게 달라진 층을 놓칠 수 있습니다. 그런 층은 이번 평가에서는 운 좋게 통과했더라도, 프롬프트 분포나 도메인이 바뀌면 뒷층과의 약속이 깨질 수 있습니다. 반대로 표현 유사도만 보면 출력이 거의 같은데도 최종 손실에 악영향을 주는 미묘한 왜곡을 놓칠 수 있습니다. 두 잣대를 함께 쓰면 운에 기대는 승인을 줄일 수 있는데, 저는 이 대목에서 예전 코드 리뷰가 떠올랐습니다. 테스트 통과와 코드 diff의 작음을 함께 보는 리뷰가 결국 사고가 적었거든요.
여기서 재미있는 지점은 threshold가 고정됐다는 사실입니다. 층마다 기준을 바꾸면서 억지로 통과시키는 대신, 같은 잣대를 모든 층에 적용합니다. 덕분에 승인된 층과 탈락한 층의 대비가 의미를 갖는데, 다음에 볼 SmolLM2-135M의 3번 층 이야기가 바로 그 예입니다. NLL만 봤다면 살릴 수도 있던 층을 표현 기준이 탈락시킨 장면이라서, 이중 게이트가 장식인지 아닌지가 여기서 갈립니다.

세 가지 구현은 같은 자리에 앉을까요
논문은 구현을 세 가지로 나눠서 다룹니다. Integrated Memory와 MemoryFusion, 그리고 PDelta3-GDN2-CLVR+Local32라는 이름의 엄격한 변환 구성이 그것입니다. 이름만 보면 복잡해 보이지만, 앉는 자리는 같습니다. 원래 어텐션이 있던 층의 자리를 대체 후보가 차지하고, 게이트가 승인한 경우에만 그 자리를 유지합니다.
이 가운데 Integrated Memory는 효율 쪽 이야기가 붙습니다. 퍼플렉서티를 마이너스 0.07%에서 플러스 0.93% 사이로 묶으면서 전체 캐시를 최대 6.01%까지 줄였다는 결과가 그것인데, 숫자를 뜯어보면 방향이 분명합니다. 캐시를 줄였는데도 언어 모델링 품질이 크게 흔들리지 않았다는 점이 성과이고, 캐시를 절반으로 접었다는 식의 주장과 거리가 있다는 점도 분명합니다. 작은 절감이므로 해석도 작게 해야 합니다. 다만 작은 절감이 여러 층에 쌓이고 긴 문맥에서 반복되면 체감이 달라질 수 있어서, 뒤에서 시스템 관점으로 다시 보겠습니다.
PDelta3 쪽은 절차의 엄격함을 보여주는 구성이었습니다. 표현과 NLL이라는 두 기준을 고정된 threshold로 적용하고, 통과한 층만 남기는 흐름이 여기에서 가장 또렷합니다. 세 가지 구현을 나란히 둔意図는 하나로 읽힙니다. 어떤 변형이든 자리와 절차는 같고, 게이트를 통과했는지만이 남는지를 보여주는 것이죠. 그렇다면 이제 결과를 볼 차례인데, 어디가 통과했고 어디가 떨어졌을까요.
3번 층의 탈락이 더 많은 것을 말해주는 이유
SmolLM2-135M에서의 결과는 논문의 태도를 가장 잘 보여줍니다. 0번부터 2번 층까지는 승인됐고, 누적 NLL 증가는 플러스 0.01209로 보고됩니다. 작은 증가라서 최종 품질에는 거의 영향이 없다고 읽히는데, 다음 장면이 더 중요합니다. 3번 층은 NLL만 보면 살릴 여지가 있었는데도 표현 유사도 기준을 넘지 못해 탈락했습니다.
저는 이 탈락을 성과처럼 읽었습니다. 게이트가 실제로 작동했다는 증거이기 때문입니다. 통과만 나열하는 논문은 의심이 들지만, 탈락을 보여주는 논문은 절차를 믿게 됩니다. 특히 NLL이 괜찮아 보여도 내부 표현이 어긋나면 되돌린다는 선택은 앞부분의 문제의식과 정확히 맞물립니다. 뒷층과의 약속을 어기면서까지 층 하나를 더 바꾸지 않겠다는 뜻이니까요.
Qwen3.5-0.8B에서는 양상이 조금 다릅니다. 전체 어텐션 층 가운데 3번과 7번, 11번 층이 승인됐고, 최종 NLL 증가는 플러스 0.02073으로 보고됩니다. 초기 층에서만 통과하고 끝난 것이 아닙니다. 중간중간에 통과하는 층이 있다는 점이 눈에 띄는데, 이는 모든 층이 같은 일을 하지 않는다는 점을 다시 보여줍니다. 어떤 층은 지역 계산과 작은 메모리로 대신할 수 있고, 어떤 층은 그렇지 않다는 것이죠. (참고로 층 번호는 모델 정의에 따라 달라질 수 있어서, 숫자 자체보다 듬성듬성 통과했다는 패턴으로 읽는 편이 안전합니다.)

숫자를 그대로 믿기 전에 조건을 봐야 하지 않을까요
이제 숫자를 정리할 차례입니다. Integrated Memory의 퍼플렉서티 변화는 마이너스 0.07%에서 플러스 0.93% 사이였고, 전체 캐시 감소는 최대 6.01%였습니다. 마이너스 쪽이 있다는 것은 어떤 구성에서는 원래보다 아주 약간 나아진 경우도 있었다는 뜻인데, 저는 이 값을 개선 주장으로 읽지 않았습니다. 오차 범위 안에서 왔다 갔다 하는 수준으로 보는 편이 더 정직하기 때문입니다. 중요한 것은 나빠진 쪽의 폭이 1% 안에 묶였다는 점이고, 그 안에서 캐시를 조금 덜 쓰게 됐다는 점입니다.
downstream 쪽은 200개 항목을 뽑은 sanity check에서 변환된 Qwen 계열이 전체 정확도 28.5%에서 32.0% 사이를 보였다고 보고됩니다. 범위가 넓어 보이지만, 해석은 좁혀야 합니다. 200개는 전체 능력을 재는 규모라고 말하기 어렵습니다. sanity check라는 이름 그대로 큰 파손이 없는지를 보는 용도에 가깝습니다. 논문도 이를 보편적 대체의 근거로 쓰지 않고 보수적 게이트 변환의 근거로 씁니다. 저는 이 선 긋기가 고맙게 느껴졌습니다. 작은 표본으로 큰 주장을 하지 않았기 때문입니다.
다만 여기서 한 가지 질문이 남습니다. 캐시 6% 감소는 배포에서 의미가 있을까요. 단일 요청으로 보면 작아 보이지만, 긴 문맥을 여러 요청이 동시에 물고 있는 서버에서는 메모리가 곧 동시 처리량이 되곤 합니다. 6%가 상한이라면 평균은 그보다 작을 텐데, 그래도 품질 하락 없이 매번 조금씩 아낄 수 있다면 배치 크기나 대기열에서 이득이 생길 수 있습니다. 물론 이 대목은 측정된 결과라기보다 제가 붙인 해석이라서, 선을 넘어 일반화하지 않겠습니다. 다음 절에서 하드웨어 조건을 달아 다시 보겠습니다.

캐시 6%는 운영에서 어떤 값으로 돌아올까요
실제 시스템 관점에서 보면 다음 질문이 바로 생깁니다. 줄어든 캐시는 어디에서 돈이 될까요. 어텐션 캐시는 문맥이 길어질수록 커지고, 배치와 빔 같은 동시성이 붙으면 곱절로 불어납니다. 그래서 토큰당 연산보다 메모리 대역폭과 용량이 병목이 되는 구간이 자주 생기는데, 이런 구간에서는 6%라는 숫자가 다르게 보입니다. 대기 중인 요청을 하나 더 올리거나, 문맥 상한을 조금 더 미는 선택으로 바꿀 수 있기 때문입니다.
하지만 조건을 붙여야 합니다. 이 절감은 전체 캐시 기준의 최대값이라서, 모델과 문맥 길이, 배치 구성에 따라 체감은 달라집니다. 짧은 문맥에서는 캐시 자체가 작으니 6%가 커 보이지 않고, 연산 비중이 큰 구간에서는 메모리 절감이 지연 개선으로 곧장 이어지지 않습니다. throughput과 latency도 같은 방향으로만 움직이지 않는데, 처리량은 늘어도 첫 토큰 지연이 그대로일 수 있고, 반대의 경우도 생깁니다. 좋은데, 이걸 어디에 올릴까요, 라는 질문에 답하려면 이런 분리가 필요합니다. 엣지처럼 메모리가 빡빡한 곳에서는 용량 자체가 기능이 되고, 클라우드처럼 대역폭이 병목인 곳에서는 이동량이 관건이 됩니다.
제가 앞으로 보고 싶은 것은 바로 이 지점의 측정입니다. 특정 하드웨어에서 문맥 길이별로 지연과 처리량, 메모리 사용을 함께 보여주면 6%라는 숫자의 자리가 정해집니다. 지금 논문은 그런 serving 측정을 앞세우지 않았고, 그 선택은 정직합니다. 없는 측정을 있는 것처럼 말하지 않았으니까요. 다만 기술을 고르는 입장에서는 다음 자료가 필요합니다. 어떤 워크로드에서 이득이 생기고, 어디에서는 거의 차이가 없는지를 가르는 표가 그것입니다.
제가 다음 논문에서 확인하고 싶은 것들
마지막으로 남은 질문을 모으면 이렇게 됩니다. 게이트 threshold는 어떻게 정해야 할까요. 지금은 고정된 값을 썼는데, 모델 크기가 커지면 같은 값이 여전히 맞을까요. 층마다 역할이 다르다면 층 위치에 따라 잣대를 달리 해야 할까요. 아니면 지금처럼 같은 잣대를 고수하는 편이 오히려 안전할까요. 저는 이 물음에 답이 없다고 봅니다. 다만 답이 없다는 말이 손을 놓자는 말은 아닙니다. 다음 연구에서는 threshold를 조금씩 움직였을 때 승인 층과 품질 곡선이 어떻게 바뀌는지를 보여주면, 운영자가 자기 환경에 맞는 값을 고를 수 있기 때문입니다.
또 하나 보고 싶은 것은 스케일 방향입니다. 작은 모델에서 초기 층 위주로 통과하던 패턴이 큰 모델에서도 이어질까요. Qwen에서 중간 층이 듬성듬성 통과한 패턴은 우연일까요, 아니면 층 역할의 일반적 분포를 보여주는 것일까요. 표현 유사도를 재는 방식에 따라서도 결과가 달라질 수 있어서, 측정 방식이 바뀌면 승인 집합이 얼마나 흔들리는지도 궁금합니다. 이런 질문은 결함을 지적하기보다 절차가 쓸 만해 보여서 드는 다음 물음입니다. 쓸 만하지 않았다면 이런 궁금증도 생기지 않았을 겁니다.
그렇다면 사람의 역할은 무엇일까요, 라는 큰 질문으로 끝내기보다 이번에는 작은 장면으로 끝내고 싶습니다. 밤늦게 배포 버튼을 앞에 둔 엔지니어가 있다고 해보죠. 전부 바꾼 모델과 세 층만 바꾼 모델이 있다면, 저는 후자를 먼저 올리겠습니다. 설명할 수 있고, 되돌릴 수 있고, 숫자의 조건을 말할 수 있기 때문입니다. 논문이 남긴 것은 새로운 층의 모양을 넘어, 이런 선택을 가능하게 하는 절차입니다. 통과한 층만 남기고 나머지는 돌려보내는 일, 그 단순한 규칙이 저는 오래 기억에 남을 것 같습니다.
