[논문 리뷰] Google Titans

마계닭·2026년 1월 14일

논문 리뷰

목록 보기
1/18

원제: Titans: Learning to Memorize at Test Time

Wu, Y., Hao, S., Mou, C., Song, J., Yoon, J., Xie, S., & Gao, J. (2025). Titans: Learning to memorize at test time. arXiv preprint arXiv:2501.00663.

잡소리:
몸살로 며칠 뻗어서 좀 늦었다.
원래라면 Generative agents부터 최신 RAG쪽 논문을 쭉 읽을 생각이었으나, 우연히 Titans이란 모델을 듣게 되어서 해당 모델이 재밌어보여서 먼저 읽게 되었다.

Background(Abstract + Introduction)

기존 모델

  1. Recurrent model
    이전의 상태(state)를 활용하여 다음 상태를 예측하는 구조이다. 가장 고전적인 Vanila RNN부터 LSTM, GRU, 그리고 이런 RNN을 두번 활용하는 Seq2Seq까지 여러가지 모델이 존재한다. 해당 모델의 특징으로는 정보를 고정된 크기의 하나의 상태(hidden state)로 압축한다.

  2. Attention
    Recurrent model처럼 하나의 상태로 압축하는 것은 정보의 손실로 이어진다. 이에 Decoder가 매 시점마다 Encoder의 특정 파트의 hidden state를 직접 볼 수 있도록 만든 구조이다. 이를 문장 내부의 단어들을 바탕으로 만든 것(Query, Key, Value가 같은 집합에 존재하는 것)이 Self-attention이다.

  3. Transformer
    Transformer는 이런 Self-attention구조를 바탕으로 Key-Value간 연관성을 저장하고 Query-Key간 유사도를 계산하여 검색한다. 즉, 연상 기억(associative memory)처럼 작동한다.
    Transformer은 in-context learning에서 강점을 보이지만, context의 길이에 대해 quadratic하게 증가하는, 즉 O(n^2)으로 시간 및 메모리복잡도가 증가한다는 단점이 존재한다. 이로 인해 비디오나 장기 시계열 예측에서 적용이 어렵다.

  4. Linear transformer 변형(Softmax -> Kernel Function)
    Kernel-trick를 활용해서 계산량을 줄이고 다시 정보를 행렬 형태의 state로 압축한다.
    이를 통해 매우 긴 context에서도 효율성과 확장성을 제공하지만, 긴 context를 작은 벡터나 행렬로 압축하기 어렵다는 한계가 존재한다.

  5. 기존 아키텍처의 한계
    a. Generalization: 통계적인 패턴에는 강하지만 구조적인 규칙이나 추상적 관계에는 약한 모습을 보임
    b. Length Extrapolation: context가 길어질수록 오래된 토큰의 영향력이 사라지고 단기적인 패턴에만 집중하게 된다.
    c. Reasoning: Attention은 상태를 갱신하면서 유지하기가 어렵고, RNN은 상태는 유지하지만 표현력이 제한된다.
    즉, context는 길어도 유효 기억(effective memory)가 짧다.

    또한 단기, 장기기억과 같은 학습 과정에 필수적인 요소가 없거나, 해당 요소들이 독립적이면서 상호 연결된 시스템이 아니거나, 데이터로부터 능동적으로 학습하고 과거 경험의 추상화를 기억하는 능력이 부족하다.

메모리

  1. 기존의 모델들
    RNN의 경우 새로운 입력 xt에 대해 f(Mt-1, xt)로 메모리를 업데이트 하고 g(Mt, xt)로 해당 입력에 대응하는 메모리를 검색해서 가져온다.
    Trasnformer의 경우에도 Key-Value 값을 메모리에 추가함으로써 메모리를 업데이트 하고(단, 압축은 하지 않는다), Query-Key간 유사도를 활용하여 메모리를 검색한다.

  2. 사람의 기억
    사람의 기억 구조같은 경우 단기 기억, 작업 기억, 장기 기억 등 여러 시스템의 연합체로 서로 다른 기능을 수행하고, 서로 다른 신경구조를 가지지만(독립적) 동시에 서로 상호작용한다.
    또한 기억이란 과거의 추상화(abstraction)을 부호화(encode)하고 저장해야 한다. 즉, 전체가 아닌 의미적으로 중요한 변수들만 압축해서 추상화하여 남기고 이를 임시가 아닌 모델의 내부를 바꾸어 저장시켜야 한다.(기억이 이후의 행동, 판단에 영향을 주어야 한다.)
    하지만 현재의 모델들은 선형적인 방식으로만 데이터를 부호화하고, 기억-추론 구조가 한개의 모델에서만 처리된다.

Preliminaries(생략)

Attention, Efficient Attention등은 따로 찾아보는게 더 나을 것 같다.

Titans

1. Long-term Memory

Neural long-term memory를 위해선 앞서 언급된 과거의 추상화를 파라미터에 부호화할 수 있어야 한다. 그런데 기존 LLM에서도 통제는 불가능하지만, 학습 데이터를 기억하고 있음이 나타난다. 즉, 신경망을 학습시키면서 학습 데이터를 기억하도록 기대하는 것이 가장 단순한 아이디어다.
단, 이때 '기억'은 generalization에 오히려 방해를 주고, 프라이버시 등 윤리적인 문제도 엮여있다. 동시에 out-of-distribution인 데이터를 기억할 수도 있기에 테스트 시점에도 도움이 되지 않을 수 있다. 그렇기에 데이터를 어떻게 기억하고 잊을지를 학습하는 meta-model이 필수적이다.

Surprise

목표: 과거 정보 x1,...,xt-1를 Long-term memory module Mt의 파라미터로 압축
이때 앞서 언급된 내용처럼 'surprise'을 이용한다. 그래서 가장 기본적인 메모리 업데이트 식은 다음과 같다.

Mt=Mt1θt(Mt1;xt)\Mu_{t} = \Mu_{t-1} - \theta_{t}\nabla\ell(\Mu_{t-1};x_{t})

이때 순간적인 강한 놀라움으로 인해 Gradient가 매우 작아질 수 있고, flat area에 머물면서 이후의 중요한 정보들을 놓칠 수 있다.
사람의 기억을 보았을 때, 놀라움이 장기간 유지되는 것은 아니지만, 강하게 놀랐던 사건들은 이후의 시간 구간 전체를 기억하게 한다. 이를 구현하기 위해
a. past surprise(St1S_{t-1}): 매우 최근 과거의 놀라움 정도
b. momentary surprise((Mt1;xt)\nabla\ell(\Mu_{t-1};x_{t})): 현재 입력에 대한 놀라움 정도
로 구분하고, 이를 수식적으로 정리하면,

Mt=Mt1+StSt=ηtSt1θt(Mt1;xt)\Mu_{t} = \Mu_{t-1} + S_{t}\\ S_{t}=\eta_{t}S_{t-1} - \theta_{t}\nabla\ell(\Mu_{t-1};x_{t})

ηt\eta_{t}: data-dependent surprise decay. past surprise가 얼마나 오랜시간 유지될지를 제어(맥락이 바뀌면 0, 최근 토큰과 유사하면 1에 가깝게)
θt\theta_t: momentary surprise가 최종 surprise에 얼마나 반영될지를 조절

Objective function

과거 데이터를 key-value의 쌍으로 저장하는 것이 목표이다. 이를 위해 연관 기억(associative memory) 우선 입력xtx_{t}에 대해 key와 value를 구한 후 module로 연관성을 학습시키는 방식으로 손실을 정의한다. 즉,

kt=xtWk,vt=xtWV(Mt1;xt)=Mt1(kt)vt22k_{t} = x_{t}W_{k},\quad v_{t}=x_{t}W_{V}\\ \ell(\Mu_{t-1};x_{t}) = ||\Mu_{t-1}(k_{t})-v_{t}||^{2}_{2}

Forgetting Mechanism

시퀀스가 길어질수록 어떤 과거 정보를 잊어야 할 지 관리해야 한다. 이를 위해 더 이상 필요 없는 정보를 잊을 수 있도록 적응적 망각 매커니즘(Adaptive forgetting mechanism)을 사용한다. 토큰 xtx_{t}에 대해

Mt=(1αt)Mt1+StSt=ηtSt1θt(Mt1;xt)\Mu_{t} = (1-\alpha_{t})\Mu_{t-1}+S_{t}\\ S_{t}=\eta_{t}S_{t-1} - \theta_{t}\nabla\ell(\Mu_{t-1};x_{t})

αt\alpha_{t}: 메모리를 얼마나 지울지 결정하는 게이트(0일경우 메모리 유지, 1일경우 메모리 초기화)

Memory Architecture

해당 논문에서는 LM >= 1인 단순 MLP를 사용했다고 한다. 하지만 해당 MLP는 결국 선형모델과 동일해지므로, LM >= 2인 깊은 MLP가 더 표현력이 높다.

Retrieving a Memory

메모리에서 정보를 검색하는 방법이다. 이때 weight의 변화가 없는 forward pass를 사용한다고 한다.
입력에 대해 Linear Layer로 projection하여 Query를 만들고, 위의 M\Mu를 활용해 정보를 검색한다. 즉,

qt=xtWQyt=M(qt)q_{t} = x_{t}W_{Q}\\ y_{t} = \Mu^{*}(q_{t})

정리

간단하게 두 가지 과정으로 분리해보자.
Outer learning(Pre-training + Meta-learning)

  • 목적: 모델이 어떻게 기억할 것인가를 학습
  • 학습 파라미터: Projection & Retrieval Weights(WK,  WV,  WQW_{K},\;W_{V},\;W_{Q}), Surprise(θt,  ηt,  αt\theta_{t},\;\eta_{t},\;\alpha_{t})

Inner learning(test time)

  • 목적: 실제 데이터를 기억하고 추론하는 과정
  • 학습 파라미터: M\Mu의 가중치. 이때 위에서 구한 surprise기반 함수를 활용.

2. 병렬화

병렬화는 토큰단위로 묶은 후 GPU/TPU를 통해 연산속도를 더 높이기 위함이다. 또한 Titans에선 토큰을 볼때마다 M\Mu의 파라미터가 바뀌기에 병렬화를 하지 않을 경우 시퀀스 길이만큼 시간복잡도가 발생한다.

청크화

식을 먼저 보고 시작하자.

Mt=(1αt)Mt1θt(Mt1;xt)=βtM0i=1tθtβtβi(Mt;xi),  t=tmod(t,b),βi=Πj=1i(1αj)\Mu_{t} = (1-\alpha_{t})\Mu_{t-1}-\theta_{t}\nabla\ell(\Mu_{t-1};x_{t}) = \beta_{t}\Mu_{0}-\displaystyle\sum_{i=1}^{t}{\theta_{t}{{\beta_{t}}\over{\beta_{i}}}\nabla\ell(\Mu_{t'};x_{i})} \\ 단,\;t'=t-mod(t,b),\quad\beta_{i}=\Pi_{j=1}^{i}(1-\alpha_{j})

앞쪽 식은 앞에서 증명한 식이다.
βt\beta_{t}의 경우 지금까지의 누적 감쇠 계수로, 오래된 정보일수록 이 값이 더 크기에 더 많이 감쇠된다. 즉, βtM0\beta_{t}M_{0}의 경우 초기의 메모리가 얼마나 남아있느냐고, 이후의 θtβtβi\theta_{t}{{\beta_{t}}\over{\beta_{i}}}는 i번째 gradient가 얼마나 남아있느냐를 나타낸다.
b'의 경우 기존 토큰 단위에서 청크단위로 분리시켜준다.
즉, 해당 식은 기존의 메모리 업데이트 식을 크기 b의 chunk로 나누어 한번에 연산할 수 있게 했다는 의미이다.

계산 단순화

우선 Yu Sun et al. (2024)의 연구에서

상수 학습률을 사용하는 mini-batch gradient descent에서 파라미터 업데이트 결과는 순차 업데이트를 하지 않고도 행렬곱으로 계산될 수 있다.

고 증명했다.
원래 Titans라면 test-time동안 메모리 파라미터가 순차적으로 계속 업데이트 되어야 한다. 하지만 위의 연구 결과를 바탕으로 순차적인 업데이트 없이, 행렬곱 한 번만으로 동일한 결과를 만들어낼 수 있게 되었다.
Titans에서 사용한 식을 한 번 보자.

(W0;xt)=(W0xtxt)xtTi=1bθiβbβi(W0;xi)=ΘbBb(W0XX)XTΘb=diag([θ1,θ2,...,θb])Bb=βbβi\nabla\ell(W_{0};x_{t})=(W_{0}x_{t}-x_{t})x_{t}^{\mathsf{T}}\\ \displaystyle\sum_{i=1}^{b}{\theta_{i}{{\beta_{b}\over{\beta_{i}}}\nabla\ell(W_{0};x_{i}) = \Theta_{b}B_{b}(W_{0}X - X)X^{\mathsf{T}}}} \\ \Theta_{b}=diag([\theta_{1}, \theta_{2},...,\theta_{b}]) \\ B_{b} = {{\beta_b}\over{\beta_i}}

식이 복잡하다.
우선 Θb\Theta_{b}의 diag는 해당 값들을 대각 성분으로 갖는 대각 행렬이다.
즉, 토큰 i에만 θi\theta_i가 곱해질 수 있도록 하는 것이다.
BbB_{b}의 경우 간단하게 Bb=diag(βbβ1,βbβ2,...,βbβb)B_{b} = diag({{\beta_b}\over{\beta_1}}, {{\beta_b}\over{\beta_2}}, ..., {{\beta_b}\over{\beta_b}}) 이다. 즉, 청크의 끝 시점 b를 기준으로 i번째 토큰의 기억이 얼마나 살아남았느냐를 행렬형태로 저장해둔 것이다.
추가적으로 Θb\Theta_bBbB_b는 매 청크의 값을 저장해둘 필요 없이, 바로바로 덮어쓰면 된다고 한다.

이제 메인 식인 (W0XX)XT(W_{0}X - X)X^{\mathsf{T}}을 보자. 이는 앞서 언급된 Yu Sun의 논문 내용을 바탕으로 만들어진 식이다.
우선 X=[x1,x2,...,xb]X = [x_1, x_2, ..., x_b]으로 한 청크에 들어간 b개의 입력 토큰이다.
W0W_0는 청크의 시작 시점의 메모리 파라미터로 간단하게 W0=MtW_0 = M_{t'}라고 보면 된다.(선형 메모리 기준)
즉, W0X=[W0x1,W0x2,...,W0xb]W_0X = [W_0x_1, W_0x_2, ..., W_0x_b]로 한 청크의 토큰을 시작시점의 메모리를 통과시킨 결과이다.
따라서 W0XXW_0X-X는 각 토큰의 prediction error이고 마지막으로 shape를 기존의 W와 맞춰주기 위해서 X의 transpose를 곱해준다.

식은 이해를 했고, 이게 정확하게 무슨 의미냐고 했을 때 원래 기억구조라는건 앞의 기억에 의존적으로 계산이 된다. M1이 계산되어야 M2가 계산이 가능하고, M2가 있어야 M3가 계산이 가능하다는 의미이다. 이런 순차성을 청크 내의 토큰단위에서 무시하면서 정확성을 약간 포기하는 대신 GPU/TPU를 활용해서 연산속도를 더 높인다. 즉, b가 작아져서 1이된다면 기존처럼 M1->M2->...방식으로 정확도가 높지만 병렬계산이 불가능한 형태가 되고, b가 커진다면 병렬화를 더 많이하여 계산속도는 빠르지만 정확도가 계속 떨어지게 된다.

모멘텀 항

앞선 표현을 확장시켜서 모멘텀 항을 변화시킨다.
St=ηtSt1θtμtS_t = \eta_t S_{t-1} - \theta_t \mu_t
이때 μt=(Mt;xt)\mu_t = \nabla\ell(\Mu_{t'};x_t)이므로 현재 토큰이 만들어낸 gradient로 해석하면 된다.
즉, 위에서 구한 Mt\Mu_t를 바로 사용하면 매 토큰의 gradient가 독립적이고 업데이트에 민감해지기에 방향성을 가진 누적 신호로 사용하는 것이다.
자세한 내용은 optimization의 momentum을 찾아보자.
특징으로는 비선형 함수가 없는 완전한 linear recurrence이다. 또한 기존의 RNN과 달리 linear하고 결합 가능하기 때문에 parallel associative scan, 즉 병렬로 계산이 가능해진다.

파라미터

앞서 구한 αt,θt,ηt\alpha_t, \theta_t, \eta_t 모두 위의 방식대로 청크마다 동일하게 둘 수 있다. 이 경우 표현력을 일부 잃지만 학습 속도를 기존보다 더 높일 수 있다.
만약 청크단위로 하게 된다면 위 식의 Θ\Theta도 하나의 스칼라 값이 되면서 전역 합성곱(global convolution)으로 계산하여 속도가 더 빨라진다.
단, Titans에선 그냥 토큰단위로 사용했다고 한다.

3. Persistent Memory

현재 만들어진 long-term memory는 현재 입력 맥락에 의존한다. 하지만 해당 AI를 현실에서 사용하려면 특정 업무나 도덕적인 개념 등 변하지않고 유지되어야 하는 기억들이 존재한다. 약간 DeepseekMoE의 Shared Expert를 생각하면 편하다.
이런 유형의 메모리를 persistent memory, 또는 meta-memory라고 한다.
Np>=1N_p >= 1에 대해서 학습 가능한 persistent memory P=[p1,p2,...,pNp]P = [p_1, p_2,...,p_{N_p}]를 사용하고, 입력값 xnewx_{new}에 concat한다. 즉,
xnew=[p1,p2,...,pNp]xx_{new} = [p_1, p_2,...,p_{N_p}] || x로 입력을 변화시킨다.
그럼 이제 어떤 기억들을 persistent로 할지를 결정해야 한다.

메모리 관점: 특정 과업에 대해 과업을 수행하는 방법에 대한 지식을 암기하는 역할

FFN 관점: 기존 Transformer의 FFN의 역할을 대신하는 것

기술적 관점: Attention은 Casual mask를 사용하기에 암묵적으로 초기 토큰들에 대한 편향을 갖는다. 이에 초기 토큰에 대한 weight가 과도하게 활성화되는데, 이를 효과적으로 재분배하는 역할을 할 수 있다.

메모리 통합

열심히 고민한 위의 neural memory를 딥러닝 아키텍쳐에 통합할 수 있는 방법을 알아보자.
우선 기존 Transformer의 KV쌍이 associative memory block으로 해석될 수 있다. KV쌍은 의존성은 명확하게 모델링하지만, Context window가 제한되기에 short-term memory module로 해석한다.
Titans에서 제안한 neural memory는 데이터로부터 지속적으로 학습하고 정보를 가중치에 저장하기에 long-term memory의 역할을 수행할 수 있다.
이런 Titans을 3가지 변형으로 적용시킨다.

MAC(Memory as a Context)

메모리를 현재 정보에 대한 context로 취급하는 방법.
긴 시퀀스가 주어지면 해당 시퀀스를 고정된 크기의 Segment S(i)로 분할하고, 현재 도착하는 세그먼트를 현재 context로, 이전의 세그먼트들은 과거 정보로 간주하는 방법이다.
식을 먼저 알아보면

원리

현재 세그먼트 이전의 neural memory를 Mt1M_{t-1}이라고 한다면 입력 context를 query로 neural memory에서 대응되는 정보를 검색한다.(hth_t)
ht=Mt1(qt)(이때,  qt=S(t)WQ)h_t = M^{*}_{t-1}(q_t)\quad(이때,\;q_t = S(t)W_Q)

이렇게 구한 과거 정보(hth_t)와 persistent memory와 현재 세그먼트를 concat하여 입력 시퀀스를 구성한다.(S~(t)\tilde{S}(t))

S~(t)=[p1  p2...pNp]htS(t),yt=Attn(S~(t))\tilde{S}(t)=[p_1\;p_2...p_{N_p}]||h_t||S(t), \\ y_t=Attn(\tilde{S}(t))

이렇게 구한 Attention값을 바탕으로 neural memory를 업데이트하고 최종 출력을 생성한다. 이때 forward-pass만으로 Mt1M_{t-1}의 가중치를 업데이트 한다.

Mt=Mt1(yt)ot=ytMt(yt)M_t = M_{t-1}(y_t) \\ o_t=y_t\otimes M^{*}_{t}(y_t)

장점

  1. 과거 context와 현재 context를 모두 가지고 있기에 현재 데이터가 주어졌을 때 장기 메모리 정보가 필요한지를 스스로 결정한다.
  2. Attention 모듈이 현재 context에서 유용한 세그먼트만, 즉 유용한 정보만 저장하도록 돕는다.
  3. Test 시점에서
    a. persistent memory 파라미터는 과업에 대한 지식을 encoding하기에 고정
    b. Attention모듈의 가중치는 in-context 학습기로서 동작함
  • incontext learner: 모델의 파라미터를 업데이트 하지 않고 context만을 이용해서 행동이 바뀌는 학습. 즉, 가중치의 변화는 없이 컨텍스트 내부 계산만으로 조합함.
    c. neural memory가 테스트 시점에서도 지속적으로 학습을 수행함.

MAG(Memory as a Gate, Gated Memory)

한 branch에서는 입력 데이터를 직접 사용하여 neural memory를 업데이트하고, 다른 한 branch에선 SWA(Sliding window attention)을 사용한다.

SWA: 일반적은 Transformer의 Attention은 모든 과거의 토큰을 다 보지만(O(n2)O(n^2) SWA같은 경우에는 최근 W개의 토큰만 본다.
이때, SW-Attn*의 경우에는 prefix된, 즉 persistent memory는 window 제한 없이 볼 수 있다는 의미이다.

원리

x=[p1  p2  ...  pNp]x,y=SWAttn(x),o=yM(x)x = [p_1\;p_2\;...\;p_{N_p}]||x,\\ y=SW-Attn^*(x),\\ o=y\otimes M(x)

이전의 MAC와 가장 큰 차이점으론 세그먼트로 분할하지 않는다.
또한 이때의 M(x)는 1회용 함수가 아닌, 재귀적으로 작동하여 입력 시퀀스 x를 처음 토큰부터 끝 토큰까지 하나씩 처리하면서 메모리를 업데이트 한 뒤, 마지막에 남아 있는 메모리 상태를 의미한다.
\otimes는 일반적인 비선형함수 아무것이나 사용해도 상관없다.(Titans에선 정규화 후 σ()\sigma()를 사용했다.)
SW-Attn*은 정밀한 단기기억으로 동작하며 fading memory로 동작한다.

MAL(Memory as a Layer)

원리

Neural memory를 하나의 layer로 활용한다.

x=[p1p2...pNp]x,y=M(x),o=SWAttn(y)x = [p_1 p_2 ... p_{N_p}]||x,\\ y = M(x),\\ o = SW-Attn(y)

즉, persistent memory를 concat하고, Neural memory를 통과시키며 모델을 업데이트함과 동시에 출력을 생성한다. 이후 SWA를 통과시키면서 최종적인 출력을 생성한다.
표현력이 레이어에 의해 제한되기에 Attention과 neural memory간 상보적인 데이터 처리 능력을 충분히 활용할 수 없다.

Without Attention

Attention은 short-term memory이고, neural memory는 long-term memory이다. 그리고 앞서 언급하였듯 두 구성 요소는 독립적으로 동작해야 한다. 따라서 MAL에서 LMM(Long-term memory module)을 attention없이 sequence model로 사용할 수 있다. (이를 LMM 또는 Titans(LMM)이라고 한다)
즉, 입력 -> LMM -> 출력의 과정만을 거치는 모델을 말한다.

아키텍쳐 세부 사항

실제 구현시에 사용된 세부사항들이다.
1. 모든 블록에서 Residual connection
2. Non-linear activation function으로 SiLU를 사용
3. L2-Norm으로 정규화
4. Q, K, V projection이후 1차원의 depthwise-separable convolution layer을 추가
5. Gating: 최종 Projection 전에 정규화와 Linear-layer을 통한 gating

Depthwise-Separable Convolution layer
일반적은 1D Convoltuion의 경우에는 입력 채널 전체를 섞어서 local window에서 패턴을 추출한다.
이를 채널 별로 local token flow만 확인하는 Depthwise convolution과 채널을 섞은 pointwise convolution으로 분리해서 performance는 유지면서 연산량을 크게 줄여준다.

추가적으로 기존의 모델들(Transformer 등)은 TC0TC^0를 넘지 못하지만, Titans는 TC0TC^0를 넘긴다고 한다.

TC0TC^0(Threshold Circuit class, depth O(1))
constant depth를 가진, 다항 개수의 AND/OR/NOT/Threshold gate를 가진 회로
f(x1,...,xn)=1(iwixi>=θ)f(x_1, ..., x_n) = 1(\sum_{i}{w_ix_i} >= \theta)
입력을 한 번에 다 모아서 weighted sum으로 threshold를 비교(순차 처리 X, 누적 state X, 시간 X)
즉, 입력을 한 번에 전부 다 보고 얕은 게산만으로 결론을 내리는 모델
패턴 매칭이나 국소적 논리에는 유리하지만, 상태 누적이나 카운팅 등에는 불리

Experiment

실제 성능을 단순히 SOTA가 아닌 구조 비교를 중심으로 실험한다. 이 파트는 간단하게만 넘어간다.

setup

  1. Backbone: embedding dimension, hidden size, parameter count 통일
  2. 메모리 사용 방식의 차이
  • Transformer-attention
  • Linear Transformer-kernelized attetnion
  • RNN/DeltaNet - Linear state
  • Titans - MAC/MAG/MAL/LMM(attention 없이)
  1. Test-time learning
  2. 세부사항
    a) Sequence length를 길게
    b) SWA 병행
    c) Memory update frequency 제어: 매 토큰마다 업데이트 하지 않고 일정 step이나 세그먼트 단위로 업데이트

요약 정리

기존의 모델들보다 대부분의 상황, 특히 context가 길어질수록 더 일관되게 좋은 성능을 보였고, 데이터 내에서 더 긴 의존성을 다룰수록 MAC가 MAG보다 성능이 좋고, MAC와 MAG과 MAL의 변형보다 더 성능이 좋았다고 한다.
또한 메모리의 단순 용량보다는 비선형 레이어를 가진 층이 얼마나 깊은가가 성능에 영향을 줬다고 한다.
병렬화가 가능하기에 시퀀스가 길어져도 효율성이 유지되고, 추론 시에도 Transforemr의 self-attention은 O(n2n^2)의 계산 비용을 갖지만, Titans는 O(n)의 계산 비용만을 갖는다.

Conclusion

기존의 RAG처럼 외부의 데이터베이스를 이용하는 것이 아닌, 모델의 파라미터로 기억을 저장한다는 방식의 모델이었다. 처음 원리를 들었을 땐 거창하고 완전히 새로운 방법일 줄 알았으나, 생각보다 엄청난 변화는 아니었던 것 같다. 뭔가 기존에 생각하던 아이디어에 바로 사용이 가능할지는 조금 더 고민해봐야 할 것 같다. 최근에 다음 버전도 나왔다고 하니, 해당 모델도 살펴보려고 한다.

profile
뉴비

0개의 댓글