HOW AI WORKS

Universal Transformer는 어떻게 동작하는가
— 층을 쌓지 말고, 같은 층을 T번

Transformer는 서로 다른 층 6개를 쌓습니다. Universal Transformer(UT)는 층 하나를 만들어 6번 돌립니다. 바뀐 것은 이 한 줄뿐인데, 그 결과로 모델의 성격이 달라집니다. 층마다 가중치가 같으니 UT는 "깊이 방향으로 도는 RNN"이 되고, 몇 번 돌릴지를 학습이 끝난 뒤에도, 위치마다 따로 정할 수 있게 됩니다. 그리고 가장 실용적인 결과는 이것입니다 — 파라미터 수와 연산량이 서로 떨어집니다. 층을 공유하면 파라미터는 1/6로 줄지만 연산은 그대로이고, 거꾸로 층을 넓혀 파라미터를 base 수준으로 되돌리면 연산은 Transformer big과 똑같아집니다. 이 자료는 논문을 앞에서부터 따라가며 이 분리가 무엇을 사고 무엇을 내주는지를 브라우저에서 직접 계산해 봅니다.

how-ai-works 시리즈 · 원전: Dehghani, Gouws, Vinyals, Uszkoreit & Kaiser, Universal Transformers (ICLR 2019, arXiv:1807.03819)

앞서 읽으면 좋은 자료 · How Transformer Works (블록 하나의 구조, Post-LN, 파라미터 63.08M — 이 글은 거기서 출발합니다) · How Attention Works (Q·K·V와 멀티헤드) · How RNN Works (가중치를 공유하며 반복한다는 것)
차례
  1. 무엇이 바뀌었나 — 쌓기 대신 돌리기
  2. 수식 두 줄 — 깊이 방향으로 도는 RNN
  3. 파라미터와 연산이 떨어진다 — "같은 파라미터"의 진짜 의미
  4. 좌표 임베딩 — 공유된 층에게 "지금 몇 번째인가" 알려 주기
  5. 고정 깊이의 한계 — 길이가 늘면 단계도 늘어야 한다
  6. 동적 정지(ACT) — 위치마다 다른 깊이
  7. ACT는 무엇을 배웠나 — bAbI와 LAMBADA
  8. 실험 결과 — 알고리즘, 언어, 번역
  9. 그 뒤의 이야기 — 공유의 계보
  10. 정리 — 한 장 요약
  11. 이해도 퀴즈

§1 무엇이 바뀌었나 — 쌓기 대신 돌리기

2017년의 Transformer는 번역에서 순환 신경망을 이겼습니다. 그런데 이 논문은 첫 문단에서 불편한 사실을 지적합니다 — Transformer는 문자열 복사처럼 RNN이 쉽게 하는 일을, 학습 때보다 긴 입력에서 해내지 못한다는 것입니다(논문 초록). 저자들이 지목한 원인은 "서로 다른 층을 고정된 개수만큼 쌓는 구조"가 RNN이 가진 반복적(iterative)·재귀적 변환에 대한 귀납 편향을 버렸다는 점입니다(1절).

해법은 단순합니다. 층 N개를 쌓는 대신, 같은 가중치의 층 하나를 T번 적용합니다. 각 단계에서 모든 위치가 동시에(병렬로) 셀프 어텐션으로 서로의 정보를 주고받고, 이어서 위치별 전이 함수(transition function)를 통과합니다. 논문 그림 1의 캡션이 강조하는 한 줄은 이것입니다 — "Parameters are tied across positions and time steps."

데모 1 · 쌓기 vs 돌리기 — 같은 색 = 같은 가중치
가로는 문장의 위치, 세로는 처리 깊이입니다. 재생을 누르면 한 틱에 계산되는 칸이 채워집니다. 칸 색은 그 칸이 쓰는 가중치 묶음입니다.

네 모델을 번갈아 눌러 보면 차이가 선명해집니다.

논문 4절의 표현을 빌리면: "고정된 단계 수로 돌릴 때 UT는 모든 층의 파라미터를 묶은(tied) 다층 Transformer와 같다." 하지만 저자들은 더 유익한 관점으로 "위치마다 하나씩, 파라미터를 공유하는 RNN들의 묶음이 동시에 진화하며, 매 단계 이전 단계의 모든 상태를 어텐션으로 읽는 것"을 제안합니다. 보통의 RNN은 순환 단계에서 고정 크기 상태 벡터 하나만 기억으로 쓰지만, UT는 이전 층 전체를 어텐션으로 읽을 수 있다는 것 — 이 차이가 뒤의 튜링 완전성 논증의 출발점입니다.

§2 수식 두 줄 — 깊이 방향으로 도는 RNN

인코더는 입력 m개 기호의 임베딩으로 만든 행렬 H0 ∈ ℝm×d에서 시작해, 단계 t = 1, …, T마다 다음 두 줄을 적용합니다(논문 식 4·5).

At = LayerNorm( (Ht−1 + Pt) + MultiHeadSelfAttention(Ht−1 + Pt) )
Ht = LayerNorm( At + Transition(At) ) 두 줄 모두 t에 따라 가중치가 바뀌지 않는다 — 바뀌는 것은 입력 Ht−1과 좌표 임베딩 Pt뿐

Transformer 블록과 나란히 놓으면 차이는 세 군데입니다.

Transformer (Vaswani 2017)Universal Transformer
블록 가중치층마다 따로 (N벌)한 벌을 T번 재사용
위치 정보입력에 한 번 더함(위치, 단계) 좌표 임베딩 Pt를 매 단계 더함
위치별 변환ReLU FFNReLU FFN 또는 depthwise separable 합성곱 (과제별 선택)
정규화 위치Post-LNPost-LN (그대로)
깊이N 고정T 고정 또는 위치별 동적(ACT)

디코더도 같은 구조를 반복합니다. 셀프 어텐션 뒤에 인코더의 최종 표현 HT를 읽는 교차 어텐션이 붙고, 셀프 어텐션에는 인과 마스크가 걸립니다. 학습은 teacher forcing, 생성은 한 기호씩 자기회귀로 — 여기까지는 Transformer와 같습니다(2.1절). 즉 UT의 "순환"은 생성 방식과는 관계가 없습니다. 토큰 방향으로는 여전히 병렬이고, 순환은 오직 깊이 방향에만 있습니다.

헷갈리기 쉬운 점 · UT의 "time step t"는 문장 속 위치가 아니라 몇 번째 반복인가입니다. 논문은 각주 1에서 HT의 T가 전치(transpose)가 아니라 마지막 단계 번호라고 굳이 밝혀 둡니다. 이 자료에서는 헷갈리지 않도록 i를 위치, t를 단계로 씁니다.

§3 파라미터와 연산이 떨어진다 — "같은 파라미터"의 진짜 의미

층을 공유하면 무엇이 줄어들까요? 파라미터는 줄지만 연산은 줄지 않습니다. 한 번 계산한 층을 재사용하는 것이 아니라, 같은 가중치로 다른 입력을 T번 다시 계산하기 때문입니다. Transformer에서 "층 수"는 파라미터와 연산을 함께 정했는데, UT에서는 두 손잡이가 분리됩니다 — 파라미터는 d와 dff가, 연산은 d·dff와 T가 정합니다.

논문 표 7에는 이런 각주가 붙어 있습니다 — "All base results have the same number of parameters." 층 하나로 6층짜리와 파라미터를 맞추려면 층을 넓혀야 합니다. 공개된 구현(tensor2tensor)의 universal_transformer_base는 실제로 hidden_size = 1024, filter_size = 4096, num_heads = 16으로 설정되어 있고, 주석에 이유가 적혀 있습니다 — "To have a similar capacity to the transformer_base with 6 layers, we need to increase the size of the UT's layer." 그 결과가 무엇인지 계산해 봅시다.

데모 2 · 파라미터 vs 연산 계산기
어휘 37,000(공유 BPE)·인코더–디코더 기준. 파라미터는 임베딩(공유 1벌)과 블록 전체, 연산은 토큰 하나가 인코더·디코더 블록을 한 번씩 지날 때의 행렬 곱 FLOPs(= 2 × 곱해지는 가중치 수 × 깊이)입니다. 어텐션의 n² 항과 출력 소프트맥스는 뺐습니다.

네 개의 프리셋을 차례로 눌러 보면 이런 표가 나옵니다.

d / dff깊이파라미터토큰당 연산WMT14 En–De BLEU
Transformer base512 / 20486층63.08M88.3 MFLOP28.0
UT small512 / 20481층 × 626.30M88.3 MFLOP26.8
UT base1024 / 40961층 × 667.28M352.7 MFLOP28.9
Transformer big1024 / 40966층214.25M352.7 MFLOP28.4 (Vaswani 표 2)

세 가지를 읽을 수 있습니다.

  1. UT small은 base와 연산이 같고 파라미터는 42%입니다. 결과는 1.2 BLEU 낮습니다 — 공유는 공짜가 아닙니다. 같은 연산이라면 층마다 다른 가중치를 쓰는 편이 표현력이 큽니다.
  2. UT base는 파라미터가 base와 거의 같지만(67.28M, +6.7%) 연산은 정확히 4배입니다. d를 2배로 늘리면 행렬 하나의 크기가 4배가 되는데, 층 수가 6에서 1로 줄어 파라미터는 4/6배, 연산은 6단계를 그대로 도니 4배입니다. 참고로 dff = 4d를 유지하며 파라미터를 base(63.08M)에 정확히 맞추는 d를 풀면 979가 나옵니다 — 1024는 그 근처의 2의 거듭제곱입니다.
  3. UT base와 Transformer big은 토큰당 연산이 한 자리까지 같습니다. 블록 모양(1024 / 4096)과 깊이(6)가 같으니 당연합니다. 차이는 파라미터가 1/3.2라는 것뿐이고, BLEU는 UT base가 0.5 높습니다.
"같은 파라미터에서 +0.9 BLEU"를 읽는 법 · 논문 초록의 "Transformer 대비 0.9 BLEU 향상"은 사실이지만, 비교 대상인 base는 UT base 연산의 1/4만 씁니다. 파라미터를 맞추면 연산이 달라지고, 연산을 맞추면(UT small) 파라미터가 달라집니다 — 두 손잡이가 분리되었기 때문에 "공정한 비교"가 한 가지로 정해지지 않습니다. 표 7의 기준은 파라미터였고, 연산 기준 짝은 Transformer big(28.4)입니다. 그래도 UT base가 big보다 파라미터 1/3로 0.5 높다는 것은 여전히 의미 있는 결과입니다. (표의 UT small 설정은 논문 본문에 없어서 tensor2tensor의 universal_transformer_small — base 크기에 6단계 — 로 계산했습니다.)

§4 좌표 임베딩 — 공유된 층에게 "지금 몇 번째인가" 알려 주기

가중치를 공유하면 새로운 문제가 생깁니다. 층 하나가 1단계에서도 6단계에서도 같은 함수이므로, 입력만 보고는 지금이 몇 번째 반복인지 알 방법이 없습니다. Transformer의 층들은 각자 다른 가중치로 "나는 아래쪽 층이니 국소적인 것을 본다" 같은 역할 분담을 할 수 있었지만, UT의 층은 그럴 수 없습니다.

논문의 해법은 위치 인코딩과 똑같은 사인파를 단계 번호 t에도 한 번 더 계산해 위치 쪽에 더하는 것입니다(식 6·7).

Pti, 2j = sin(i / 100002j/d) + sin(t / 100002j/d)
Pti, 2j+1 = cos(i / 100002j/d) + cos(t / 100002j/d) 위치 부분은 행마다 다르고, 단계 부분은 모든 행에 똑같이 더해진다 — 단계 t 전체에 걸리는 하나의 편향 벡터

그리고 이 Pt를 입력에 한 번이 아니라 매 단계 Ht−1에 다시 더합니다(식 5). 공유된 층이 받는 입력이 단계마다 조금씩 달라지는 것이 곧 "지금 몇 번째인가"라는 신호입니다.

데모 3 · 좌표 임베딩 Pt 뷰어
왼쪽은 Pt 행렬(행 = 위치 i, 열 = 차원 앞쪽 64개), 오른쪽은 d = 512일 때 벡터 길이 ‖Pti‖를 i에 대해 그린 곡선입니다. t를 움직여 보세요.

히트맵에서 단계 부분만을 누르면 모든 행이 같은 줄무늬입니다 — 단계 신호는 위치와 무관한 하나의 벡터라는 뜻입니다. 오른쪽 곡선은 조금 더 흥미롭습니다. sin·cos 짝마다 전개하면

‖Pti‖² = Σj [ (sin a + sin b)² + (cos a + cos b)² ] = Σj [ 2 + 2 cos((i − t)·ωj) ] = d + 2 Σj cos((i − t)·ωj) a = i·ωj, b = t·ωj. 길이는 i와 t 각각이 아니라 차이 i − t에만 의존한다

그래서 곡선은 t를 옮기면 모양 그대로 평행이동하고, 봉우리는 언제나 i = t에서 √(2d) = 32(d = 512)입니다. 위치 인코딩 하나의 길이가 항상 √(d/2) = 16이었던 것(How Transformer Works §3)과 비교하면, 두 사인파를 더하면서 길이가 16과 32 사이에서 흔들리게 된 것입니다. i − t가 커져도 저주파 차원들은 cos ≈ 1로 남아 있어서 √d ≈ 22.6까지 금방 내려가지는 않습니다(i − t = 997에서도 24.7). 이것이 학습에 문제가 되지는 않습니다 — 임베딩 쪽 크기와 LayerNorm이 흡수하기 때문입니다. 다만 "위치와 단계를 그냥 더했다"는 선택이 벡터 공간에서 어떤 모양이 되는지는 이 식이 보여 줍니다.

코드와 논문이 다른 곳 · 논문 식 6·7은 단계 신호를 고정 사인파로 적었지만, tensor2tensor의 기본 설정은 step_timing_signal_type = "learned", 즉 단계마다 학습되는 벡터입니다. 어느 쪽이든 핵심은 같습니다 — 공유된 층에게 단계를 구별할 단서를 준다. 다만 학습되는 쪽은 학습 때 본 최대 단계를 넘어서 돌릴 수 없고, 사인파 쪽은 원리상 더 돌릴 수 있습니다.

§5 고정 깊이의 한계 — 길이가 늘면 단계도 늘어야 한다

논문 부록 B의 논증은 짧습니다. Transformer의 전체 연산량은 입력 길이에 따라 늘지만, 순차적인 연산 단계 수는 층 수 N으로 고정되어 입력 길이와 무관합니다. 유한 정밀도를 가정하면 이것만으로 Transformer는 계산 보편적(computationally universal)일 수 없습니다. 반면 UT는 단계 수를 입력 길이의 함수로 정할 수 있고, 이는 가중치를 단계 간에 공유하기 때문에 학습이 끝난 뒤에도 가능합니다.

"for any given choice of depth T, one can construct an input sequence of length N > T that cannot be processed correctly by a standard Transformer." — 부록 B

이것을 눈으로 보기 위해 누적 패리티(prefix parity) 문제를 골랐습니다 — 비트열 x1…xn이 주어지면 각 위치 i에 x1 ⊕ … ⊕ xi를 출력합니다. 아래 데모의 "층"은 학습된 것이 아니라 손으로 정한 규칙입니다 — 단계 t에서 위치 i는 어텐션으로 정확히 한 위치 i − 2t−1을 읽고 자기 값에 XOR합니다(Hillis–Steele 누적 스캔). 읽을 거리 2t−1이 단계마다 다르다는 점에 주목하세요 — 가중치가 같은 층이 단계마다 다른 일을 하려면 바로 §4의 단계 신호가 필요합니다.

데모 4 · 누적 패리티 — 몇 단계면 충분한가
맨 위 줄은 입력 비트, 아래로 한 줄이 한 단계입니다. 초록 = 그 위치가 x1부터 자기까지 전부 본 칸(정답 확정), 보라 = 아직 일부만 본 칸. 칸을 누르면 그 칸이 읽은 위치가 주황으로 표시됩니다.

단계 t가 끝나면 위치 i는 [i − 2t + 1, i] 구간을 본 상태가 되므로, i ≤ 2t인 위치만 정답이 확정됩니다. 층 수를 N으로 고정하면 2N보다 긴 입력의 뒷부분은 절대 맞힐 수 없습니다 — N = 6이면 64까지. 논문의 알고리즘 과제가 정확히 이 상황입니다. 길이 40으로 학습하고 길이 400으로 평가합니다(3.4절). 이 규칙으로는 40에 ⌈log₂ 40⌉ = 6단계, 400에 9단계가 필요합니다. Transformer는 층 수를 바꾸면 새 층을 학습해야 하지만, UT는 같은 층을 세 번 더 돌리면 됩니다.

또 하나 볼 것이 있습니다. UT 모드에서 앞쪽 위치일수록 일찍 초록이 됩니다 — 위치 i에 필요한 단계는 ⌈log₂ i⌉로, 위치마다 다릅니다. 이미 답이 확정된 위치를 계속 계산하는 것은 낭비입니다. 위치마다 멈출 때를 스스로 정하게 하자 — 이것이 다음 절의 동적 정지입니다.

튜링 완전성 논증(4절) · 저자들은 Neural GPU를 UT로 환원합니다. 디코더를 무시하고, 셀프 어텐션(+잔차)을 항등 함수로 두고, 전이 함수를 합성곱으로 두고, 총 단계 수 T를 입력 길이와 같게 잡으면 정확히 Neural GPU가 됩니다. 마지막 조건 — 깊이가 입력 크기에 따라 늘 수 있다는 것 — 이 바로 고정 깊이 Transformer에는 없는 부분입니다. 논문 스스로 "충분한 메모리가 주어지면(given sufficient memory)"이라는 단서를 달았다는 점, 그리고 튜링 완전하다는 것이 학습으로 그 해를 찾을 수 있다는 뜻은 아니라는 점은 기억해 둘 만합니다 — 표 4에서 UT도 400자리 덧셈의 seq-acc는 0.02에 그칩니다.

§6 동적 정지(ACT) — 위치마다 다른 깊이

문장 속 기호는 모호함이 제각각입니다. 논문은 Graves(2016)의 ACT(Adaptive Computation Time)를 가져와 위치마다 붙입니다(2.2절). 각 단계에서 위치별로 정지 확률 p = σ(w·h + b)를 내고, 이를 누적해 임계값 1 − ε을 넘으면 그 위치는 멈춥니다. 멈춘 위치의 상태는 그대로 다음 단계로 복사되지만, 다른 위치의 어텐션 대상으로는 계속 남습니다.

논문 부록 C의 Listing 2가 한 단계의 계산을 그대로 보여 줍니다. 아래 실행기는 그 코드를 한 줄씩 옮긴 것입니다.

still_running = (halting_probability < 1.0)
new_halted    = (halting_probability + p*still_running > threshold) * still_running
still_running = (halting_probability + p*still_running <= threshold) * still_running
halting_probability += p * still_running
remainders          += new_halted * (1 - halting_probability)
halting_probability += new_halted * remainders
n_updates           += still_running + new_halted
update_weights = p*still_running + new_halted*remainders
new_state = transformed_state*update_weights + previous_state*(1 - update_weights)
데모 5 · Listing 2 실행기 — 정지 확률이 누적되는 과정
위치마다 매 단계 내는 정지 확률 p를 슬라이더로 정합니다(단순화를 위해 단계마다 같은 값). "한 단계"를 누르면 Listing 2가 한 번 실행됩니다.

각 단계 상태가 최종 출력에 섞이는 비율

Listing 2 그대로 (act_type = "basic")
Graves ACT의 가중 합 ("accumulated")

실행해 보면 확인할 수 있는 것들입니다.

마지막으로 비용입니다. 정지 유닛은 "오래 생각할수록 좋다"는 방향으로만 학습되면 늘 최대 단계까지 돌 것이므로, Graves는 위치별 숙고 비용(ponder cost) ρ = N + R을 손실에 더합니다. tensor2tensor는 이것을 act_loss_weight = 0.01 × 평균(N + R)으로 인코더와 디코더에 각각 더합니다. 위 실행기의 ρ 값이 그 항입니다.

§7 ACT는 무엇을 배웠나 — bAbI와 LAMBADA

ACT가 정말로 "어려운 곳에서 오래 생각하는지"는 두 실험에서 드러납니다.

bAbI — 근거 사실이 늘수록 더 오래 생각한다

bAbI는 짧은 이야기와 질문을 주고 답하게 하는 20개 합성 과제입니다. 답하는 데 필요한 근거 사실(supporting fact) 개수가 과제마다 1·2·3개로 다릅니다. 논문은 테스트 데이터의 모든 위치에서 평균 숙고 시간(ponder time)을 쟀습니다(3.1절).

데모 6 · 근거 사실 수와 평균 숙고 시간 (논문 3.1절)
막대 = 평균, 가는 선 = ±1 표준편차. 논문 본문의 수치를 그대로 그렸습니다.

평균만 늘어난 것이 아닙니다. 논문은 근거 사실이 3개인 과제에서 많은 위치가 1~2단계에서 이미 멈추고 몇몇 위치만 오래 변환된다고 보고합니다 — 표준편차가 0.8 → 2.2로 커진 것이 그 흔적입니다. 이 과제들은 이야기가 훨씬 길고 관련 없는 사실이 많은데, 모델이 그런 문장에 계산을 쓰지 않는 법을 배운 것으로 보입니다. 부록 F의 어텐션 시각화도 같은 이야기를 합니다 — 첫 단계의 어텐션은 거의 균일하다가 단계가 진행될수록 정답에 필요한 사실 쪽으로 날카로워집니다. 단계가 곧 다단계 추론의 "홉(hop)" 역할을 하는 셈입니다.

LAMBADA — "그냥 더 많이 돌아서"가 아니다

LAMBADA는 앞의 4–5문장을 다 읽어야만 맞힐 수 있는 마지막 단어 예측 과제입니다. ACT를 붙인 UT는 테스트에서 평균 8.2 ± 2.1단계를 돌았는데, 고정 6단계 모델보다 좋았습니다. 그러면 자연스러운 의문 — 단지 단계를 더 써서 이긴 것 아닌가? 저자들은 고정 8단계·9단계 모델을 따로 학습해 확인했습니다(표 3).

모델언어 모델 퍼플렉시티 (정확도)독해(RC) 정확도
controldevtestcontroldevtest
LSTM138 (0.23)4966 (0.0)5174 (0.0)0.11030.23160.2007
Transformer142 (0.19)5122 (0.0)7321 (0.0)0.41020.44010.3988
UT, 6단계 고정131 (0.32)279 (0.18)319 (0.17)0.48010.54220.5216
UT, 8단계 고정129 (0.32)192 (0.21)202 (0.18)–––
UT, 9단계 고정129 (0.33)214 (0.21)239 (0.17)–––
UT + 동적 정지 (평균 8.2단계)130 (0.32)134 (0.22)142 (0.19)0.46030.58310.5625

세 가지가 눈에 띕니다.

그렇다고 ACT가 언제나 이득은 아닙니다. 논문 1절은 동적 정지가 작고 구조적인 과제에서는 정확도를 올렸지만 기계 번역에서는 결과를 약간 떨어뜨렸다고 적고 있고, 그래서 표 7의 UT base는 ACT 없이 고정 단계로 학습되었습니다.

§8 실험 결과 — 알고리즘, 언어, 번역

데모 7 · 결과 탐색기
과제를 고르면 논문의 표를 그립니다. 모든 수치는 논문 표 1·2·4·5·6·7에서 가져왔습니다.

과제별로 읽을 거리를 정리하면 이렇습니다.

§9 그 뒤의 이야기 — 공유의 계보

UT가 제기한 두 가지 아이디어 — 층 사이 가중치 공유와 입력마다 다른 깊이 — 는 이후 따로따로 이어졌습니다.

반면 대형 언어 모델의 주류는 여전히 층마다 다른 가중치를 쌓는 쪽입니다. §3의 표가 그 이유를 보여 줍니다 — 연산 예산이 제약일 때, 같은 연산으로 더 많은 파라미터를 쓰는 쪽이 유리한 경우가 많기 때문입니다. UT는 "파라미터가 제약이고 연산은 여유가 있을 때", 그리고 "입력마다 필요한 계산량이 크게 다를 때" 빛나는 설계입니다.

§10 정리 — 한 장 요약

질문답
UT는 Transformer와 무엇이 다른가?층 N개를 쌓는 대신 가중치 하나의 층을 T번 반복. 좌표 임베딩을 매 단계 더하고, 선택적으로 위치별 동적 정지를 붙인다
RNN인가?깊이 방향으로는 RNN. 위치 방향으로는 여전히 병렬이고, 생성은 Transformer처럼 자기회귀
공유하면 무엇이 줄어드나?파라미터만. 연산은 그대로(UT small: 26.30M, 88.3 MFLOP)
"같은 파라미터에서 +0.9 BLEU"의 대가는?층을 넓혀(d = 1024) 연산이 base의 4배 = big과 동일
왜 단계 임베딩이 필요한가?공유된 층은 스스로 몇 번째 반복인지 모른다. ‖Pti‖²은 d + 2Σcos((i − t)ω)로 i − t에만 의존
고정 깊이의 한계는?순차 단계 수가 입력 길이와 무관 → 유한 정밀도에서 계산 보편적일 수 없다(부록 B). UT는 T를 길이에 맞춰 늘릴 수 있다
ACT는 무엇을 하나?위치별 정지 확률을 누적해 1 − ε을 넘으면 멈춤. 마지막 단계는 나머지 R로 채우고, 숙고 비용 N + R을 손실에 더한다
ACT는 늘 이득인가?bAbI·LAMBADA에서는 이득(고정 8·9단계보다도 좋음), 번역에서는 약간 손해

§11 이해도 퀴즈