이미지 생성 모델들의 counting 관련해서 논문 찾다가 찾은 논문!
딱 내가 궁금해했던 정보들을 담고 있어서 꼼꼼히 읽어보려고 한다.
따끈따끈한 CVPR 2026 이다.
https://arxiv.org/pdf/2511.17699
Abstract
Counting은 LLM하고 LVLM의 기본적인 능력 중 하나이다. 이 LLM / LVLM이 어떻게 숫자를 세는지 조사했다. (두근)
모델 안에서 숫자가 어떻게 저장되고 어떻게 이동하는지 추정하는 CountScope라는 도구도 직접 만들었다!
(아니 이렇게 멋진 걸 만들었다고?)
실험 결과, 개별 토큰이나 시각적 특징들은 latent positional count information을 담고 있다! 이게 문맥 간에 전달되고, 추출하려면 추출할 수도 있다!
층별로 분석한 결과 숫자 표현은 점진적으로 형성됨을 알 수 있었다. 낮은 층에서는 작은 개수를, 높은 층에서는 더 큰 개수를 담고 있다. (우와 대박 신기하다)
그리고 항목이 추가될 때마다 내부의 counter mechanism이 업데이트 된다. 주로 마지막 영역쪽에 저장된다.
추가로, LVLM에서는 숫자와 관련된 정보가 visual embedding에도 들어있다.
공간의 특성(e.g. 물체가 중앙에 몰려있느냐, 넓게 퍼져있느냐)에 따라서 background나 foreground 영역에 분포한다.
(Background에도 숫자 관련된 정보가 저장된다는 것이 너무 신기하다! 도대체 왜 저장되는거지)
그리고 모델이 텍스트의 구분자 같은 structual cue에도 의존한다는 것을 발견했다.
약간 shortcut 느낌으로 작용해서 정확도에 영향을 크게 준다.
종합적으로 말하자면, counting은 LLM / LVLM에서 layer를 따라서 점진적으로 나타난다.
이 층을 분석하면 counting이 어떻게 이루어지는지 알 수 있다는 것! (좀 설렌다)
3. Representational Emergence of Counting
프롬프트 내부의 토큰들하고 생성된 답변 토큰들을 분석해서 numerical representation들이 어떻게 여러 layer를 거치면서 형성되는지 분석한다.
이를 위해서 1~9개 단어를 counting하라는 task(텍스트는 과일, 비전은 모양 만들기)에서 생성된 counting 토큰의 hidden embedding을 기록했다. 이 hidden embedding들의 평균으로 PCA를 했더니 일관된 결과가 나타났다.
작은 숫자들은 초기 layer들에서 구별되지만, 큰 숫자들은 더 깊은 layer에 들어가서야 구별이 된다!
이는 숫자 정보가 모델의 layer에 따라서 gradual하게 인코딩된다는 것을 의미한다.
아래 그림은 layer 22의 상황이다. PCA에서 서로 다른 count가 명확하게 분리되어 나타난다.
그리고 서로 다른 항목들 각각의 평균으로 코사인 유사도를 계산했을 때, (e.g. apple apple apple apple, pear pear pear pear에서 같은 위치끼리 비교) 작은 숫자는 초기에 나타나고 더 큰 숫자로 갈수록 깊은 층으로 점점 확장된다.
하나 더 흥미로운 것은 로그함수 같은 패턴이다! PCA 안에서 큰 숫자들끼리 더 가깝고, 코사인 유사도도 더 높다 (미쳤다 와)

이는 LLM, LVLM이 token과 layer에 count information에 대한 structured internal encoding을 만드는 것을 알 수 있다!
4. Casual Evidence of Counting Mechanism
이번 파트에서는 counting information이 모델 activation 내부의 어디에 저장되는지, 그리고 어떻게 표현되는지 분석했다.
*Activation patching하고 **mediation기반 방법들을 사용해서 어떤 token, layer, modality가 최종 숫자 출력에 영향을 주는 정보를 담고있는지 분석한다.
이 절에서는 ***CI score, probability와 같은 집계된 지표만 보고한다. 구체적인 거는 Appendix D에 있다.
*Activation patching: activation을 다른거로 바꿔서 해당 activation이 얼마나 기여하는지 측정
**meditation기반 방법들: 어떤 activation이 최종 답에 얼마나 기여했는지 측정
***CI score: 특정 activation이 최종 숫자 예측에 얼마나 중요한지 나타내는 score (정확한 정의는 뒤에서 나옴)
4.1 The CountScope Framework
처음에는 count 관련된 정보를 찾기 위해서 *Logit Lens를 사용했다.
근데 이게 구체적인 개념을 이해하는데는 효과적이지만 숫자를 분석할 때는 별로였다.
**Tuned Lens와 같은 발전된 방법도 써봤는데 별로였다.
LVLM에서 특히 별로였다. 이미지-텍스트 사이에서 modality 차이가 나서 더 복잡하기 때문이다.
이러한 한계를 극복하기 위해서 직접 정밀하게 숫자 정보를 분석하는 도구인 CountScope를 만들었다.
*Logit Lens: 특정 층의 activation을 꺼내서 바로 출력층에 넣어보는 방법
**Tuned Lens: 특정 층의 activation을 꺼내서 보정 모듈로 최종 출력 공간에 맞게 변환해서 출력층에 넣어보는 방법
CountScope는 다양한 상황에서 숫자와 관련된 정보를 보기 위해서 *통제된 단순한 질의 환경을 만든다.
*통제된 단순한 질의 환경: 여기서는 1개 이상의 placeholder를 포함해서 문맥을 만들고 placeholder의 개수를 묻는 질문을 붙임
PatchScope라는 방식하고 비슷한 방식으로 최소한의 activation patching을 사용해서 내부의 token activation을 target context의 placeholder token으로 옮긴다.
이렇게 해서 나온 출력하고 softmax 확률을 보면 어떤 token, layer, modality가 counting 정보를 담고 있는지 명확하게 확인할 수 있다.
4.2 Input-Level Localization of Counting
어떻게 모델들이 counting을 수행하는지 알기 위해서는 input의 어디에 count와 관련된 정보가 있는지 아는 것이 중요하다.
대략 입력을 두 부분(context, question)으로 나눈다.
LVLM에서 question이 항상 context 뒤에 나오기 때문에 공정한 평가를 위해서 VLM에서도 question을 context 뒤에 위치시켰다.
예를 들어서, 먼저 apple apple apple apple을 보여주고 이후에 How many apples? 라고 묻는 것이다.
이렇게 하니 decoder-only 모델들은 apple apple apple apple 만 주어졌을 때 이게 count task인지 모르는 상태이다.
최종 숫자를 결정하는 부분이 context나 question 중 한 곳에 들어있을 것이라는 가정을 세웠다.
모든 patching 실험에서 count 정보가 context에 저장되어 있음이 확인되었다. (와 question 없이도 그냥 저장이 되어있다니)
[실험1] activation을 0으로 만들기
context 토큰의 activation을 0으로 만들었더니 정답일 확률이 크게 감소했다. (LLM 0.73±0.02, LVLM 0.65±0.31)
question 토큰의 activation을 0으로 만들었더니 거의 영향이 없었다. (LLM 0.03±0.02, LVLM 0.05±0.03)
[실험2]
두 context의 activation을 교환했더니 교환된 activation의 숫자를 따라갔다. (LLM 0.61±0.02, LVLM 0.57±0.12)
두 question의 activation을 교환했더니 거의 영향이 없었다. (LLM 0.02±0.01, LVLM 0.03±0.04)
그 다음에는 구체적으로 어느 context 부분에 정보가 저장되는지 확인했다.
Text에서는 마지막 item에 최종 숫자를 결정하는 부분이 들어있다! (무려 0.95 ± 0.04)
Vision의 background랑 foreground patch를 CountScope로 옮겨서 실험했더니 꽤 많은 정보가 background에도 들어있었다!
심지어 대체로 background가 더 강한 count 정보를 담고 있다. 빈 공간이 적어질 경우에는 foreground patch들이 더 중요해지긴 한다.

위치를 더 세밀하게 분석하기 위해서 object 토큰 + 주변 패딩으로 구성되는 3x3 patch를 사용했다.
그러고 CountScope를 사용해서 groundtruth probaility를 측정했다. 아래 그래프는 이에 대한 결과이다.

보통 마지막 물체 영역(주로 오른쪽 아래)에 많은 count 정보가 들어있지만, 항상 그런 것도 아니었다.
이거는 vision 인코더가 전체 공간에 대해서 spatial attention을 수행해서 decoding 이전에 전체적으로 합쳐지기 때문으로 보인다.
아 그리고 흥미롭게도 LVLM은 물체 개수가 5개를 넘어가면 민감도가 감소하는 반변, LLM은 10개까지도 성능을 유지했다.
4.3 Emergence of Internal Counters
모델이 숫자를 세는 방법에 대한 2가지 가정을 했다.
1. 모든 물체의 개수를 합산해서 동시에 세는 것이다.
2. 아니면 특정 context에 들어있는 count 정보를 읽는 것이다. 내부에 latent counter가 있다는 것이다!
이전 장에서 2번 가정이 맞음을 보여줬다. 즉, count정보가 마지막 context안에 저장되어있다는 것이다.
이러한 증거를 바탕으로 구체적으로 어떤 메커니즘을 통해서 이렇게 되는건지 분석하고자 한다.
4.3.1 Per-Item Latent Count Encoding
3장에서 연속되는 item들의 임베딩이 점점 더 큰 numeric값을 인코딩하고 있고, 이게 하나의 latent counting trajectory를 형성하고 있음을 봤다.
아래 사진은 monotypic(물체 1개), polytypic(물체 2개 이상), visual에서 복원된 확률을 보여준다.

각 item은 순서에 대한 정보를 가지고 있고, embedding이 각각 numerical 순서에 대한 latent representation을 인코딩하고 있음을 보여준다.
Monotypic에서 대각선이 가장 선명했고 큰 숫자까지 이어졌다.
근데 polytypic에서는 대각선이 살짝 흐려졌다. 아무래도 물체가 무엇인지도 처리해야하기 때문인 것으로 보인다.
Visual에서도 비슷한 패턴을 보였지만 설정(e.g. 물체 개수, 물체 정렬, 구별 정도)에 따라서 일관성은 떨어졌다.
(+ Appendix E에서 자연스러운 text랑 image에 적용한 결과도 보여준다.)
4.3.2 Continued Counting
내부의 counting 메커니즘을 더 조사하기 위해서 흥미로운 patching 실험을 했다.
Source context의 마지막 k개 아이템을 target context의 처음 k개 위치에 patching 하는 것이다.
예를 들어서, apple apple apple apple apple이라는 source context하고 pear pear pear pear라는 target context가 있고, k=2라고 하자.
그러면 source의 마지막 2개 activation을 target의 처음 2개 activation에 patching 하면 apple apple pear pear가 된다.
그러면 pear의 latent 숫자가 3이 아니라 Nsource+1, 즉 5가 된다! 가장 최근의 latent count만 기억해서 세진다는 것이다!! wow
4.3.3 Type-Specific Resetting Counters
Polytypic 환경에서 실험을 해봤다.
apple apple orange orange orange peach peach peach peach 처럼 같은 단어끼리 뭉쳐있는 조건에서는 각각의 object마다 counter가 생김을 알 수 있었다. Latent count는 각각 apple 2, orange 3, peach 4였다.
근데 apple apple orange orange orange apple apple apple apple처럼 같은 단어가 뒤에 다시 나올 때는 counter가 리셋되었다. Latent count가 apple 4, orange 3였다.
근데 또 중간에 낀 애가 조금밖에 없으면 counter가 리셋되지 않았다.
아래 표는 모델이 전체 개수를 세는지, 아니면 종류별로 따로 세는지 실험한 결과이다.

Gen: 전체 item의 개수
Sp: 특정 종류에 대한 counter
Sp-A: 떨어져 있는 동일 종류 item의 전체 개수
Sp-L: 마지막 그룹의 개수
→ LLM / LVLM 모두에서 type-specific count의 확률이 전체 count보다 훨씬 높음을 알 수 있다.
4.4 Influence of Maximum Latent Count
물론 마지막 token이 count 정보를 가지고 있는 것은 맞는데, 그렇다고 마지막 token만 복사한다고 해서 무조건 그 count가 나오지는 않는다.
내부에 존재하는 여러 latent count 중 최대값을 선택하는 것 같다! (이 부분 진짜 골 때리고 소름 돋는다)
서로 다른 개수를 가진 두 입력의 마지막 item을 서로 바꾸는 실험을 했다. 결론은 아래와 같다.
(i) N_source > N_target: N_source를 출력함
(ii) N_source < N_target: (N_target - 1)을 출력함 !
=> 즉, max(N_target - k, N_source) 이다 !!!
마지막 item 두 개를 patch해도 결과는 똑같았다.
모델이 전체 context를 판단하고 그 안에 있는 최대의 latent count를 선택하는 것으로 보인다!!!!
아 바보같아서 골때리는데 어떻게 보면 너무 똑똑해서 무섭다..

4.5 Layerwise Emergence of Counting
Latent count 정보가 임베딩의 몇 번째 레이어에 저장되어있는지 조사했다.
이를 위해서 2종류의 patching 실험을 했다.
Source item의 모든 layer를 가져오지 않고 layer L까지만 가져와서 나머지 임베딩은 forward pass를 통해서 직접 생성하도록 했다.
오른쪽 표는 count 1~9가 어떻게 layer L≈5에서 L≈16까지 점진적으로 복원되는지 보여준다.
모델이 깊어질수록 count 정보가 점진적으로 형성됨을 알 수 있다.
이 결과는 transformer 구조의 중요한 한계도 보여준다.
큰 숫자를 count하려면 많은 layer가 필요하다. 즉, 모델의 counting 능력은 layer의 깊이에 반비례한다.
Layer 수가 부족하 큰 숫자를 count하기 어렵다!
Transformer가 큰 숫자를 못 세는 이유는 학습 데이터 문제가 아니라
layer 깊이의 한계일 수 있다!!!!! (대박)
4.6 Linear Additivity
Latent 숫자 표현이 임베딩 공간 안에서 additively하게 작동하는지 조사했다.
예를 들어서, word 임베딩에서 king - man + woman = queen인 것 처럼 (count 3) + (vector 3) = count 6 일까? 같은 것이다.
그래서 각각의 위치의 여러 item 종류에 대해서 평균 임베딩을 계산한 다음 position-difference 벡터를 만들었다.
이 기법을 검증하기 위해서 target item의 임베딩에 해당 position-difference 벡터를 더했다.
예를 들어서, 3번째 위치의 apple을 6번째 위치처럼 작동하도록 만들기 위해서 3->6 position-difference 벡터를 더하는 것이다.
이게 forward pass의 중간에 적용된다. 적용된 임베딩이 나머지 layer에 전파되도록 하기 위해서이다.
아래 표는 모델의 예측 숫자가 의도한 값으로 shift됨을 알 수 있다. (e.g. k=2: position-difference가 2라는 뜻)
CI score가 확 오른다. LVLM은 좀 덜하긴 하다.

심지어 다른 counting task에서 나온 벡터를 넣어도 같은 현상이 나타났다!
이는 latent 숫자 정보가 다른 정보랑 분리되어 있음을 보여준다.

4.7 Shortcut Behavior on Separators
분석 결과, element하고 seperator 토큰이 모두 숫자정보를 포함하고 있음이 나타났다.
이를 더 보기 위해서 CountScope를 이용해서 seperator의 임베딩을 분석했다.
오른쪽 표는 seperator만으로도 충분히 position 가지고 있음을 알 수 있다.
위의 4.5에서 나온 표와 비교해서 보면 seperator가 element보다 정보를 더 담고 있다!
특히 monotypic의 큰 숫자를 세는 경우나 polytypic에서 이러한 현상이 더 강하게 나타났다.
그리고 오른쪽 표를 보면 첫 seperator는 첫 position의 정보를 담고 있지만,
이후의 seperator는 (해당번째 seperator + 1) position의 정보를 담고 있었다.
진짜로 seperator가 큰 영향을 주는지 실험하기 위해서 모든 seperator의 activation을 첫 번째 seperator의 activation으로 patch했다.
그랬더니 성능이 크게 감소했다. (monotypic 0.75±0.39, polytypic 0.97±0.05)
이는 모델의 출력이 실제 item 정보보다 patched separation을 따라감을 알 수 있다.
5. Practical Implication
이 연구의 주요 목적은 counting 태스크의 mechanistic interpretability를 분석하는 것이다.
4.5를 바탕으로 보자면, counting은 근본적으로 transformer의 깊이에 따라 제한된다.
유망한 방향은 CoT 전략을 사용하는 것이다. 모델의 깊이에만 의존하지 않고 token을 이용해서 계산을 확장하는 방법이다.
여기서는 *System-2랑 비슷한 관점을 제안한다. 숫자 계산을 위한 추가 계산 공간으로 visual token을 사용하는 방법이다.
(기존 CoT는 추가 계산 공간으로 텍스트 token을 사용한다.)

*System-2: 중간 계산과정을 만들어서 푸는 방식
그래서 이미지를 선을 이용해서 4개로 분할해서 이러한 공간 구조가 추가 계산 공간 및 저장 능력을 제공하는지 테스트했다.
CoT 사용하지 않게 하기 위해 중간설명 못하게 했고, counting 태스크라는 것을 프롬프트에 명시했다.
10~20개 물체에 대한 counting 정확도(표(a))는 baseline 10.0%에서 partition 후 50.4%로 오른다.
반면 partition 없이 CoT만 했을 때느 정확도 15.3%이다.
이는 CoT보다 이미지 partition이 효과적임을 알 수 있다.
각 partition에 CountScope를 적용한 결과, 이러한 구조가 모델이 counting을 작은 하위 문제로 분해하도록 만든다! (미쳤다 작은 개수를 잘 셀 수 있으니 이를 이용해서 partition을 사용하는구나!)
Transformer의 layer수를 늘리는 대신 문제를 여러 개의 작은 counting task로 분해하면 성능을 크게 향상시킬 수 있다 !!!!
6. Findings and Discussion
(주로 지금까지 내용의 요약임)
counting은 한번에 진행되는 단일 작업이 아니라 layer를 따라서 진행되는 작업이다.
모든 작업이 이렇지 않나? 맞다. 모든 작업이 layer를 따라서 점진적으로 학습을 한다.
근데 여기서 중요한 것은 낮은 layer는 작은 숫자를, 높은 layer는 큰 숫자를 센다는 것이다.
예를 들어서 어려운 단어라고 더 깊은 layer가 필요한 것은 아니다. 근데 큰 숫자를 세려면 layer가 깊이 들어가야 한다.
이거 때문에 모델이 긴 시퀀스 counting을 어려워하는 것이락고 설명할 수 있다.
그리고 전이 가능한 내부의 counter를 발견했다.
이거는 Markov하게 작동한다. 즉, 현재 상태만 보고 다음 상태를 결정한다.
LVLM의 mechanistic interpretability에 대한 연구가 아직 매우 적다.
구조의 한계로 depth에 다른 한계랑 ','와 같은 shortcut 의존성이 있다.
이런 것들을 개선하면 좋을 것이다.
---
와 너무 흥미롭다. 진짜 명논문이다.
읽으면서 우와... 미친.. 대박... 이라는 소리가 절로 나오는 논문이었다.
이거 가지고 이리저리 생각해봐야겠다.
사람이 이미지에서 숫자를 셀 때를 생각해봤을 때, 한번에 똭 보고 대충 감으로 때려맞추면 디테일한 숫자는 틀리기도 하고 한 지점부터 차례대로 하나, 둘, 셋, 넷, ... 식으로 세면 거의 대부분 맞는다. 그래서 사람이 숫자를 셀 때는 한 지점부터 하나, 둘, 셋, 넷, .. 또는 둘, 넷, 여섯, 여덟, ... 으로 세는 것 같다.
아 헐 미쳤다. 모델이 보인 직관과 일치한다. 한 4개까지는 묶어셀만도 한데, 5개부터는 솔직히 어렵다.
여기에서 아이디어를 착안해서 발전시켜나가야겠다.
我很兴奋!!!