---
title: "RNN의 기억을 작은 모델로 바꾼다면: Test-Time Training 읽기"
author: "Dne Cna"
published_at: "2026-10-10T10:00:00.748Z"
updated_at: "2026-09-30T08:23:14.599Z"
tags: ["ai","머신러닝","논문리딩","ttt"]
canonical_url: "https://ariser.io/@writer_8706b598dfee/rnn%EC%9D%98-%EA%B8%B0%EC%96%B5%EC%9D%84-%EC%9E%91%EC%9D%80-%EB%AA%A8%EB%8D%B8%EB%A1%9C-%EB%B0%94%EA%BE%BC%EB%8B%A4%EB%A9%B4-test-time-training-%EC%9D%BD%EA%B8%B0"
ai_assisted: false
---

# RNN의 기억을 작은 모델로 바꾼다면: Test-Time Training 읽기

[원문](https://ariser.io/@writer_8706b598dfee/rnn%EC%9D%98-%EA%B8%B0%EC%96%B5%EC%9D%84-%EC%9E%91%EC%9D%80-%EB%AA%A8%EB%8D%B8%EB%A1%9C-%EB%B0%94%EA%BE%BC%EB%8B%A4%EB%A9%B4-test-time-training-%EC%9D%BD%EA%B8%B0)

RNN의 hidden state를 생각하면 벡터부터 떠오른다. 새 토큰이 들어올 때마다 그 벡터를 갱신하고, 다음 출력을 만든다. 그런데 상태가 벡터 대신 작은 학습 모델이라면 어떨까. 토큰을 읽는 일은 그 모델을 조금 학습시키는 일이 되고, 기억을 사용하는 일은 그 모델에 query를 넣는 일이 된다.

*Learning to (Learn at Test Time)*은 이 생각을 sequence layer로 만든 논문이다. Test-Time Training, TTT layer의 상태는 작은 모델의 가중치이며, 상태 갱신 규칙은 self-supervised loss에 대한 gradient step이다. “추론 중 학습한다”는 표현이 은유가 아니라 실제 계산 규칙으로 들어간다. [TTT 원문](https://arxiv.org/abs/2407.04620)

## 읽는 동안 문제를 하나 더 푼다

TTT layer에는 두 가지 일이 있다. 바깥의 언어 모델은 다음 토큰을 예측한다. 안쪽의 작은 모델은 지금까지 들어온 표현의 관계를 self-supervised task로 학습한다. 안쪽 모델의 가중치가 지금까지 읽은 문맥을 압축한 상태가 된다.

가장 단순한 업데이트는 W_t = W_(t-1) - η ∇_W ℓ(W_(t-1); x_t)로 쓸 수 있다. 평범한 RNN이 고정된 함수로 상태를 바꾸는 자리에서 gradient를 계산해 작은 모델을 고친다. 출력은 갱신된 모델을 사용해 얻는다. 논문은 linear model을 쓰는 TTT-Linear와 두 층 MLP를 쓰는 TTT-MLP를 평가한다. [hidden state와 update rule](https://arxiv.org/pdf/2407.04620)

여기서 작은 모델의 학습 목표는 새로운 토큰의 정답 라벨을 외부에서 받는 방식이 아니다. 입력 표현의 한 view에서 다른 view를 복원하는 식의 self-supervised 관계를 쓴다. projection들이 어떤 정보를 보여 주고 어떤 정보를 맞혀야 할지 정하도록 학습된다. 단순한 설명에서는 손상된 입력을 복원하는 autoencoder를 떠올릴 수 있지만, 실제 방법에는 학습된 view가 들어간다.

문맥에 “NX-17은 냉각 장치의 식별자” 같은 표현이 반복된다고 생각해 보자. 안쪽 모델은 입력 표현 사이의 재사용 가능한 관계를 담도록 조정될 수 있다. 이후 비슷한 query가 들어오면 그 관계를 활용한다. 이것은 역할을 이해하기 위한 가상 예시이며, 문자열 하나를 고정된 사전처럼 정확히 저장한다는 보장은 아니다.

## 가중치가 두 종류라는 점

추론 중 W가 바뀐다고 해서 기반 언어 모델의 모든 가중치가 사용자 문장을 읽을 때마다 바뀌는 것은 아니다. TTT layer 안의 요청별 상태 W와, 전체 모델을 학습하며 얻은 바깥 파라미터를 구분해야 한다. 같은 논문 안에서 “가중치”라는 단어가 기억 상태와 학습된 규칙의 두 역할을 맡는 셈이다.

바깥 학습에서는 다음 토큰 예측에 도움이 되도록 projection, 초기 상태, 다른 layer의 파라미터 등을 최적화한다. 안쪽 갱신의 결과가 바깥 손실에 영향을 주므로, 모델은 어떤 self-supervised task와 갱신이 문맥 활용에 유리한지도 학습할 수 있다. 이 과정에는 gradient를 거친 계산에 대한 역전파가 포함된다. [inner loop와 outer loop](https://arxiv.org/pdf/2407.04620)

나는 여기서 “좋은 기억 규칙을 사람이 끝까지 설계하지 않아도 된다”는 방향을 읽는다. gradient descent라는 기본 틀은 정하지만, 무엇을 입력하고 무엇을 복원하게 할지는 바깥 학습이 조정한다. 새로운 문서를 읽으면서 학습하는 작은 모델이 유용한 상태가 되도록, 더 큰 모델이 그 학습 환경을 만들어 준다.

물론 모든 것을 자유롭게 학습하는 것은 아니다. 작은 모델의 구조, loss의 형태, 갱신 스케줄은 설계자가 정한다. 표현력이 커졌다는 말은 용량이 무한하다는 뜻도 아니다. 고정된 상태 안에 문맥을 압축한다는 제약은 여전히 남는다.

## 문맥을 함수로 압축하면 무엇이 달라질까

attention은 과거 토큰의 key와 value를 저장하고 새 query가 그 기록을 읽는다. TTT는 문맥에서 학습한 함수의 파라미터를 저장한다. 긴 기록을 그대로 들고 있는 방식과 관계를 압축한 함수를 들고 있는 방식의 차이다.

내가 생각하는 장점은 반복되는 구조를 하나의 함수로 표현할 가능성이다. 문서에서 비슷한 관계가 계속 나타나면, 모든 등장 사례를 따로 저장하는 대신 작은 모델의 행동을 바꿔 그 관계를 반영할 수 있다. 반면 서로 무관한 세부 사항이 많이 등장하면 압축 과정에서 간섭이 생길 수 있다. 둘은 같은 입력 길이를 가져도 필요한 기억의 성격이 다르다.

그래서 긴 문맥 평가에서는 “문맥이 길수록 perplexity가 낮아지는가”와 “개별 사실을 얼마나 정확히 회수하는가”를 나눠 볼 만하다. 앞의 문맥이 다음 토큰 예측에 도움이 된다는 결과는 중요한 증거지만, 수천 개 임의의 번호를 완벽하게 보존한다는 증거와 같지는 않다. 이 구분은 TTT의 설계에서 얻은 내 평가 관점이다.

state의 크기가 입력 길이와 함께 계속 늘지 않는다는 특성도 의미가 있다. 이론적인 토큰당 비용을 문맥 길이와 독립적으로 만들 수 있기 때문이다. 다만 작은 모델의 forward와 gradient를 계산하는 상수 비용은 여전히 발생한다. O(1) per token이라는 표기는 실제 빠르다는 결론의 시작이지 끝이 아니다.

## gradient를 효율적인 layer로 만드는 작업

토큰마다 일반 optimizer를 호출하는 구현은 자연스럽지만, GPU에서는 작은 연산과 메모리 이동이 반복되어 느릴 수 있다. 논문은 token들을 mini-batch로 묶어 안쪽 학습을 수행하고, 해당 mini-batch 갱신을 효율적인 행렬 연산으로 쓰는 dual form을 제안한다. [mini-batch TTT와 dual form](https://arxiv.org/pdf/2407.04620)

여기서 dual form이 동등하다는 말은 정해진 mini-batch 갱신의 출력을 다른 계산 경로로 얻는다는 의미다. 모든 토큰에서 즉시 가중치를 바꾸는 순차 SGD와, 여러 token의 gradient를 묶는 방식이 아무 조건 없이 같다는 뜻은 아니다. 갱신 단위의 선택과 그 갱신을 빠르게 계산하는 방법을 구분해야 한다.

이 부분은 이론에서 코드로 넘어가는 연구의 좋은 사례다. hidden state를 더 표현력 있는 모델로 만들었다면, 그 상태를 갱신하고 읽는 연산이 하드웨어에서 잘 돌아가야 한다. 연산 수뿐 아니라 가중치와 activation이 메모리 사이를 오가는 방식이 시간을 결정한다.

TTT-Linear와 TTT-MLP의 차이도 이 관점에서 읽힌다. MLP는 비선형 관계를 표현할 수 있지만 더 많은 계산과 메모리 I/O를 요구할 수 있다. 표현력이 커진다는 이익을 실제 실행 비용과 함께 확인해야 한다. 복잡한 상태가 단순한 상태보다 항상 유리하다는 결론은 원문에서도 남겨진 질문이다.

## 원문의 긴 문맥 결과를 읽는 범위

저자들은 125M부터 1.3B 규모의 모델을 평가하고 Transformer, Mamba와 비교한다. 연구한 언어 모델링 설정에서 TTT는 더 많은 문맥을 조건으로 사용할 때 perplexity를 계속 낮추는 모습을 보고한다. 원문의 Mamba 곡선이 특정 길이 이후 개선이 둔화되는 비교도 이 맥락에 들어 있다. 이는 해당 구조, 데이터와 학습 조건에서의 결과이지 모든 Mamba 계열 모델의 보편적 한계를 정한 숫자는 아니다. [실험 결과와 한계](https://arxiv.org/abs/2407.04620)

현재 원문은 TTT-MLP의 실행 시간과 메모리 I/O 문제를 명시적으로 다룬다. 작은 실험에서 좋은 scaling 추세를 보였다고 더 큰 production model의 품질과 처리량까지 확인된 것은 아니다. 새로운 상태 표현의 가능성을 보인 연구와, 대규모 운영에서 충분히 검증된 선택지는 구분할 필요가 있다.

직접 실험한다면 문맥 길이별 손실과 실제 generation time을 함께 기록할 것이다. sequence가 바뀔 때 상태가 올바르게 초기화되는지, 배치 안에서 서로 다른 입력의 상태가 구분되는지도 구현의 기본 조건이다. 테스트 중 바뀌는 값이 무엇인지 명시하면 결과를 재현하고 오류를 찾기가 쉬워진다.

TTT가 남기는 인상은 학습과 추론의 경계가 한 가지로 고정되어 있지 않다는 것이다. 전체 모델은 미리 학습되어 있어도, 그 안의 작은 모델은 입력을 읽으며 문맥에 맞게 바뀔 수 있다. RNN의 상태를 정보가 담긴 벡터에서 정보를 배우는 함수로 바꿔 본 순간, 기억 갱신에 사용할 수 있는 도구도 함께 넓어진다.

논문: Yu Sun 외, *Learning to (Learn at Test Time): RNNs with Expressive Hidden States*, 2024. [원문](https://arxiv.org/abs/2407.04620) · [공식 프로젝트](https://test-time-training.github.io/)

