Lumen 사이드 7편 – Transformer 한 동(洞) 안에서 일어나는 일 8단계

Night view of illuminated skyscrapers with artisti

1편에서 LLM 모델을 “24개 동(洞)이 직선으로 연결된 도시”로 풀었어요. 각 동이 하나의 transformer layer고, 한 동 안에 시설 5개가 있어서 거기를 통과시키면 다음 동으로 전달된다는 그림. 이번 편은 그 한 동의 안에서 정확히 무슨 일이 일어나는지가 주제예요.

한 동 통과 = 8단계 시공. attention, RMSNorm, RoPE, FFN 같은 transformer 책에 자주 나오는 단어들이 등장하는데, 그게 정확히 어떤 시공 단계인지 풀어볼게요. 1편의 도시 비유를 그대로 이어 받아서.

다만 attention 부분은 건축 비유로 풀기 약간 추상적이라 인지심리학의 칵테일 파티 효과를 한 단락만 보조로 빌려와요. 이 시리즈 전체에서 두 번째이자 마지막으로 두뇌 비유가 등장하는 곳이에요. 그 단락 끝나면 다시 건축으로 돌아옵니다.

현대 마천루의 로우앵글 뷰

Transformer가 뭐였더라 – 큰 그림 다시 잡기

먼저 큰 그림 잡기. Transformer는 2017년 구글 논문(Attention Is All You Need)에서 처음 소개된 신경망 구조인데, ChatGPT, GPT-4, Claude, Llama, Qwen, 거의 모든 현대 LLM이 이 구조를 씁니다. 그 논문이 나온 게 약 8년 전인데, 그 후로 이 구조가 거의 모든 LLM의 표준이 됐어요.

한 글에서 Transformer 전체를 다 풀기는 어려운 큰 주제라 이 편에서는 추론 시점의 한 layer 동작에만 집중해요. 학습 과정의 backward pass 같은 건 다루지 않아요.

Transformer 모델 전체는 layer가 여러 개 쌓인 구조예요. 1편의 도시 비유로는 동(洞)이 24개. Qwen2.5-0.5B는 24개, GPT-4는 약 120개로 추정됩니다. 모든 동(layer)이 거의 같은 시공 단계를 거쳐요. 한 동을 이해하면 전체를 이해한 셈이에요. 24번 반복되는 거니까.

한 동을 한 줄로 풀면 이렇습니다.

입력 자재를 받아서, “주변 자재와 관계 보기”(attention)와 “비선형 변환”(FFN)을 차례로 적용해서 출력 자재를 만든다.

이걸 더 풀어서 8단계로 쪼개 봅니다.

한 동(layer) 통과의 8단계

각 단계가 무엇이고 왜 필요한지 순서대로 봅니다. 입력은 1편에서 본 그 896개 실수 벡터예요. 도시 한 동의 입구로 들어와요.

1. 자재 규격 통일 (attention RMSNorm)
2. Q/K/V 매트멀 — 입력 자재를 세 가지 다른 용도로 가공
3. 위치 표시판 부착 (RoPE)
4. Attention — 주변 자재와 관계 계산
5. 출력 매트멀 (wo)
6. 골격 합치기 (residual + FFN RMSNorm)
7. Gate/Up 매트멀 + SiLU 활성화
8. Down 매트멀 + 골격 합치기

8단계지만 진짜 무거운 건 매트멀이 들어 있는 2, 5, 7, 8 단계예요. 나머지(1, 3, 4, 6)는 시간 비중 작아요. 1편에서 매트멀 95% 차지한다는 게 여기서 다시 확인돼요.

이번 편이 시리즈에서 가장 추상적인 영역이에요. attention, RoPE 같은 단어들이 다 처음 보면 막연하거든요. 다행히 8단계 그림 하나만 잡으면 그 뒤로는 디테일 채우기. 단계별로 풀어볼게요.

1단계 RMSNorm – 자재 규격 통일

첫 단계는 RMSNorm입니다. 이름이 어려워 보이지만 한 줄로 풀면 “벡터의 크기를 일정하게 맞추는 것”이에요.

왜 필요할까요? LLM 모델에서 입력 벡터의 값들이 layer를 통과할수록 점점 커지거나 점점 작아지는 경향이 있어요. 이걸 그대로 두면 값들이 무한대로 커지거나 0으로 수렴해서 계산이 불안정해집니다. 그래서 매 layer 시작에 “벡터 크기를 일정 범위로 다시 맞춰주는” 단계가 필요해요.

도시 비유로 풀면 — 24개 동을 거치면서 자재 크기가 동마다 조금씩 달라지는데, 각 동 입구에서 “이 동의 표준 자재 규격으로 다시 통일”하는 단계예요. 어느 동에서도 같은 표준으로 시공할 수 있게.

RMS는 Root Mean Square의 약자. 벡터의 평균 제곱근이에요.

입력 벡터: [a1, a2, ..., a896]
rms = sqrt((a1^2 + a2^2 + ... + a896^2) / 896)
출력 벡터: [a1/rms * w1, a2/rms * w2, ..., a896/rms * w896]

각 원소를 RMS로 나누고, 학습된 weight를 곱해요. 이 과정으로 출력 벡터의 RMS는 대략 1 수준이 됩니다. 정확히 1은 아니고 weight에 따라 조절돼요.

왜 LayerNorm이 아닌 RMSNorm인가

이전 세대 LLM(GPT-2 등)은 LayerNorm을 썼어요. RMSNorm과 비슷한데 평균도 빼주는 단계가 있어요. 더 복잡한 만큼 살짝 더 좋은 정규화 효과가 있긴 한데, 추가 계산 비용이 들어요.

RMSNorm은 LayerNorm에서 평균 빼는 단계를 제거한 단순 버전이에요. 실험적으로 답 품질은 거의 동일한데 계산이 약 20% 빠르고요. Llama 이후로 거의 모든 현대 LLM이 RMSNorm으로 갔어요.

이 단계는 시간 비중이 작습니다. 매트멀의 1% 정도. 직접 짤 때는 한 줄짜리 loop으로 충분히 빨라요. SIMD 굳이 안 써도 됩니다. Lumen에서도 RMSNorm은 단순 scalar 코드로 짰어요.

2단계 Q/K/V 매트멀 – 세 가지 용도로 가공

이제 본격 매트멀이 시작됩니다. 입력 벡터(896개 실수)를 세 개의 다른 벡터로 변환해요. Q, K, V라고 부릅니다.

  • Q (Query): “내가 무엇을 찾고 싶은가” 표현
  • K (Key): “내가 어떤 정보를 가지고 있는가” 표현
  • V (Value): “내가 제공할 수 있는 실제 정보” 표현

이 셋은 같은 입력에서 변환되지만 각각 다른 weight 행렬을 곱해서 만들어요. 그래서 같은 데이터를 세 가지 “관점”으로 보는 셈이에요.

Q = input × W_q       (W_q: 896 × 896)
K = input × W_k       (W_k: 896 × 128)
V = input × W_v       (W_v: 896 × 128)

각 매트멀은 1편에서 본 그 매트멀이에요. 합쳐서 매트멀 3번이 일어납니다. 실제로는 세 weight를 합쳐 한 매트멀(896 × 1152)로 처리하는 게 더 효율적이에요. Lumen도 이렇게 합쳐서 한 번에 처리해요. 이걸 “QKV matmul”이라고 부릅니다.

도시 비유로 풀면 — 입력 자재 한 묶음을 세 가지 다른 가공 시설로 보내요. 한 시설은 “찾고 싶은 정보 형태”(Q)로 가공, 다른 시설은 “검색 키 형태”(K)로 가공, 세 번째는 “실제 콘텐츠 형태”(V)로 가공. 같은 원자재가 세 가지 다른 형태로 분기.

Q와 KV의 크기가 다른 이유 – GQA

Qwen2.5-0.5B는 Q가 896 차원인데 K, V는 128 차원이에요. 왜 다를까요? 이건 GQA (Grouped Query Attention)라는 변형이에요.

원래 transformer는 Q, K, V가 다 같은 크기였어요(MHA: Multi-Head Attention). 그런데 KV가 메모리를 많이 차지해서, KV 크기를 줄이고 Q만 크게 유지하는 변형이 나왔습니다(GQA). 답 품질 거의 같은데 메모리 절약 큼.

Qwen2.5의 경우 Q는 14개 head(각 64 차원, 합 896), K/V는 2개 head(각 64 차원, 합 128). Q 14개가 K/V 2개를 공유하는 형태. 7개 Q head가 같은 K/V를 보는 거예요.

이 디테일은 attention 동작 이해할 때 다시 나옵니다. 일단 “Q가 큰 게 정상, KV가 작은 게 GQA 변형”만 기억해 두세요.

3단계 RoPE – 자재에 위치 표시판 부착

다음 단계는 RoPE (Rotary Position Embedding). 한 줄로 풀면 “벡터에 위치 정보를 넣는 것”이에요.

문제: Q와 K 벡터는 매트멀로 만들어졌는데, 매트멀은 입력 단어의 순서를 모릅니다. “나는 학교에 갔다”와 “학교에 갔다 나는”이 같은 단어인데 순서만 다른 문장은, 같은 입력 벡터들을 받으면 같은 결과를 만들어요. 그런데 두 문장은 의미가 다르잖아요. 위치를 모델에 알려줘야 합니다.

도시 비유로 풀면 — 같은 종류의 자재 여러 개가 시설로 들어올 때, 각 자재가 몇 번째 라인에서 온 자재인지 표시가 없으면 시설에서 처리할 때 순서를 구분 못 해요. 그래서 자재 표면에 “1번 라인”, “2번 라인” 같은 표시판을 부착합니다. RoPE가 정확히 이 일이에요.

RoPE는 이 위치를 벡터를 회전시키는 방식으로 인코딩해요. 벡터를 2차원씩 묶어서 position에 따라 다른 각도로 회전시킵니다.

position 0인 벡터: 회전 0도
position 1인 벡터: 회전 1도 (또는 다른 작은 각도)
position 2인 벡터: 회전 2도
...
position N인 벡터: 회전 N도

같은 단어 “학교”여도 0번째 자리에 있는지 5번째 자리에 있는지에 따라 벡터가 다르게 회전돼요. 그러면 attention 단계에서 두 단어를 비교할 때 위치 정보까지 함께 비교됩니다.

이 단계는 시간 비중 매우 작아요(1% 미만). 단순한 sin/cos 계산이라 SIMD로 쉽게 처리 가능. Lumen에서는 위치별 회전값을 미리 계산해 두고 통과 시점에 그대로 적용합니다(precompute optimization).

RoPE는 2021년 정도에 처음 나온 비교적 최신 기법이에요. 이전엔 absolute position embedding(위치를 별도 벡터로 더하는 방식)이나 sinusoidal(논문 원본의 방식)을 썼는데, RoPE가 답 품질도 좋고 긴 문장에도 잘 작동해서 표준이 됐어요. Llama, Qwen, Mistral 등 거의 모든 현대 LLM이 RoPE.

4단계 Attention – 칵테일 파티에서 한 사람 말 듣기

이제 핵심 단계 Attention입니다. 한 문장의 모든 단어가 서로 “관계”를 보는 단계예요.

여기는 건축 비유로 풀기 약간 추상적이라 두뇌 비유를 보조로 빌려와요. 한 단락 이후 다시 건축으로 돌아옵니다.

칵테일 파티 비유 (인지심리학 보조)

시끄러운 칵테일 파티에 있다고 합시다. 주위에서 수십 명이 동시에 말을 해요. 그 중에 한 사람의 말만 골라 듣기 — 이게 두뇌의 attention 메커니즘이에요. 본인이 듣고 싶은 정보(Query)가 있고, 각 사람이 자기가 가진 정보(Key)가 있어요. 두뇌는 자동으로 본인의 Query와 가장 일치하는 Key를 가진 사람을 찾아 그 사람의 발언 내용(Value)에 비중 두고 듣습니다.

LLM의 attention이 정확히 이거예요. 한 단어가 자신의 Q를 가지고, 다른 모든 단어들의 K와 비교해서 “관련도 점수”를 매김. 점수가 높은 단어의 V를 더 많이 가져와서 자신의 새 표현을 만듭니다.

이 한 단락이 두뇌 비유의 마지막이에요. 이제 다시 건축으로 돌아옵니다.

다시 건축 비유로

도시 비유로 풀면 — 한 자재(token)가 다른 모든 자재들 사이에서 “내가 시공에 참고할 자재”를 골라야 해요. 본인의 Q 형태(찾고 싶은 형태)와 다른 자재들의 K 형태(검색 키)를 비교해서 가장 비슷한 자재의 V(실제 내용)를 많이 가져옵니다. 점수 비례로.

수학적 표현

attention(Q, K, V) = softmax(Q × K^T / sqrt(d)) × V
  • Q × K^T: 각 Q와 각 K의 dot product (관련도 점수)
  • / sqrt(d): 정규화 (점수가 너무 커지지 않게)
  • softmax(...): 점수를 확률 분포로 변환 (합이 1)
  • × V: 점수 가중 평균으로 V 합산

수학 표기가 복잡해 보이지만 칵테일 파티 비유의 정확한 표현이에요. Q와 K로 점수 만들고, 점수 비례로 V 합산.

이 attention 메커니즘이 transformer의 핵심이에요. 이름이 “Attention Is All You Need”였던 이유. RNN/LSTM 같은 이전 구조에서는 단어 순서대로 정보를 차례로 누적했는데, attention은 한 번에 모든 단어가 서로 관계를 봐요. 병렬 처리 가능해서 학습이 빨라지고, 긴 문맥도 잘 잡아요.

현대 곡선형 마천루 위로 본 뷰

Causal mask와 KV cache

Causal mask – 미래 단어는 안 봄

LLM은 답을 한 단어씩 만들 때 아직 만들지 않은 미래 단어를 보면 안 됩니다. 그래서 한 단어가 attention할 때 자기보다 뒤에 있는 단어는 점수를 0으로 강제해요. 이걸 causal mask라고 부릅니다.

"나는 학교에 갔다"의 attention 매트릭스:

       나는  학교에  갔다
나는    1    -∞     -∞     ← "나는"은 자기만 봄
학교에  1     1     -∞     ← "학교에"는 자기와 이전 단어만
갔다    1     1      1     ← "갔다"는 모든 단어

-∞ 자리는 softmax 통과 후 0이 돼요. 이게 LLM이 답을 “왼쪽에서 오른쪽으로” 하나씩 만들 수 있는 이유예요.

도시 비유로 풀면 — 시공 순서가 정해져 있어요. 1층 짓고 그 다음 2층. 2층 시공할 때는 이미 지은 1층만 참고 가능, 아직 안 지은 3층은 참고 못 함.

KV cache – 이미 지은 건물 그대로 활용

답을 한 단어씩 만들 때마다 매 단어의 K, V를 다시 계산하면 낭비예요. 이미 만든 단어들의 K, V는 한 번만 계산하고 메모리에 저장해 두면 됩니다.

이걸 KV cache라고 부릅니다.

1번째 단어 만들 때: K1, V1 계산하고 캐시 저장
2번째 단어 만들 때: K2, V2 계산. 1번째의 K1, V1은 캐시에서 가져옴
3번째 단어 만들 때: K3, V3 계산. K1~K2, V1~V2는 캐시에서
...

이 덕분에 답 만들 때마다 새로 계산하는 건 마지막 한 단어 분량만이에요. 그래서 decode가 가능한 속도로 동작합니다(1편의 그 매트멀 3840번). KV cache가 없으면 decode는 불가능에 가까운 속도가 돼요. ChatGPT가 답할 때 단어가 흐르듯 나오는 게 KV cache 덕분.

도시 비유로 풀면 — 이미 시공한 건물(token의 K, V)은 다시 짓지 않고 그대로 활용해요. 새로 시공할 건물의 자재만 새로 만들고, 이전 건물들은 그대로. prefill에서는 입력 단어 전체의 K, V를 한 번에 계산해서 캐시에 저장합니다.

Attention의 시간 비중

attention은 매트멀 5개에 비하면 작아요. Lumen 측정 기준 한 layer의 attention은 약 3%, 매트멀 5개 합계 91%, 나머지 6%. 그래서 attention 자체보다 매트멀 최적화가 더 큰 효과예요.

다만 attention은 시퀀스 길이의 제곱으로 비용이 늘어납니다. 단어 32개 처리면 32² = 1024번 점수 계산, 단어 256개면 65536번. 긴 컨텍스트(예: 32K 단어)에서는 attention이 매트멀보다 훨씬 큰 비중이 됩니다. 그래서 flash attention 같은 가속 기법이 발달했어요. 이 시리즈에서는 다루지 않지만 “긴 컨텍스트면 attention이 병목”이라는 사실만 기억해 두세요.

5단계 wo 매트멀 – 출력 정리

attention 결과는 다시 매트멀 한 번 더 통과해야 layer 출력이 됩니다. 이걸 output projection 또는 wo (W output)라고 불러요.

attention_out = wo_matmul(attention_result, W_o)
W_o: 896 × 896

attention의 결과를 다시 hidden 차원(896)으로 정리하는 단계. 매트멀 한 번이라 시간 비중 약 6%.

도시 비유로 풀면 — attention 시설에서 나온 가공된 자재를 다음 단계에서 쓸 수 있는 표준 형태로 다시 정리하는 출력 가공 시설이에요.

6단계 Residual + FFN RMSNorm

attention 단계 끝나면 결과를 입력에 더해요. 이걸 residual connection이라고 합니다.

intermediate = input + attention_out

왜 이렇게 하나요? 정보 손실 방지. 매 layer마다 input이 새 출력으로 완전히 대체되면 layer를 많이 쌓을수록 원래 정보가 사라집니다. residual로 원래 input을 다음 단계로 그대로 전달해서 깊은 모델도 학습 가능하게 해요.

도시 비유로 풀면 — 이전 동(洞)의 골격은 그대로 유지하고 그 위에 attention 결과를 덧붙이는 식이에요. 24개 동을 거쳐도 원래 정보가 골격으로 유지돼요. 매 동에서 완전히 새로 짓는 게 아니라 기존 위에 추가.

그 다음 또 한 번 정규화 단계가 있어요(FFN RMSNorm). 7.3절의 RMSNorm과 같은 동작. 한 layer에 RMSNorm이 두 번 들어가는 거예요. 한 번은 attention 시작 전, 한 번은 FFN 시작 전.

7~8단계 FFN – gate/up/down + SiLU

다음은 FFN (Feed-Forward Network). 비선형 변환 단계예요.

attention만으로는 단순한 가중 평균이라 모델이 표현할 수 있는 패턴이 제한적입니다. FFN이 비선형성을 추가해서 모델이 복잡한 패턴을 표현할 수 있게 해요.

도시 비유로 풀면 — attention은 자재들 사이의 관계만 계산해요. 그것만으로는 새 형태가 만들어지지 않아요. FFN은 자재를 비선형 가공해서 새 형태를 만드는 단계. 예를 들면 “이 자재는 강도가 임계값 이상일 때만 쓴다” 같은 비선형 규칙.

FFN 구조:

gate = ffn_in × W_gate      (896 → 4864)
up   = ffn_in × W_up        (896 → 4864)
mid  = silu(gate) * up      (element-wise)
out  = mid × W_down         (4864 → 896)

세 매트멀(gate, up, down)과 SiLU 활성화 함수.

SiLU 활성화 함수

SiLU(Sigmoid-weighted Linear Unit)는 비선형 함수예요. 수식:

silu(x) = x * sigmoid(x) = x / (1 + e^(-x))

복잡해 보이지만 효과는 단순해요. 양수는 거의 그대로 통과, 음수는 0에 가깝게 만들어버림. 이 비선형 처리가 모델의 표현력 핵심.

도시 비유로 풀면 — 자재 강도 검사예요. 어느 임계값 이상의 자재는 그대로 통과, 이하의 자재는 0으로 (안 쓰는 자재). 이런 비선형 필터가 모델의 표현력을 만들어요.

gate * up 곱셈

silu(gate) * up이 SwiGLU라는 변형. 단순 ReLU/SiLU만 쓰는 것보다 답 품질이 약간 좋다는 측정이 있어서 Llama 이후 거의 표준이 됐어요.

참고로 Qwen2.5-0.5B는 gate와 up을 합쳐 한 매트멀(896 × 9728)로 처리해요. QKV처럼 weight를 concatenation으로 합친 형태. 메모리 접근 패턴이 더 효율적이라 살짝 빨라요. 이런 작은 최적화가 누적되면 성능 차이가 생겨요.

한 동 통과 시간 분배 – FFN이 61%

여기까지 본 8단계를 다시 정리하면 이래요.

입력 벡터 (hidden=896 차원)
  │
  ├── 1. attention RMSNorm        ← 자재 규격 통일 (작음)
  ├── 2. QKV 매트멀                ← 큰 매트멀 1개 (세 용도 가공)
  ├── 3. RoPE                      ← 위치 표시판 부착 (작음)
  ├── 4. Attention                 ← 칵테일 파티 (Q-K 점수 + V 합산)
  ├── 5. wo 매트멀                  ← 큰 매트멀 1개 (출력 정리)
  ├── 6. Residual + FFN RMSNorm    ← 골격 유지 + 다음 정규화 (작음)
  ├── 7. Gate/Up + SiLU            ← 큰 매트멀 2개 + 강도 검사
  └── 8. Down + Residual           ← 큰 매트멀 1개 + 골격 합치기
  │
  ▼ 다음 동(layer)으로 전달

매트멀 5개(QKV, wo, gate, up, down)가 시간의 약 95%. 나머지(RMSNorm, RoPE, attention, residual, SiLU)가 약 5%.

Lumen 측정 시간 분배

Qwen2.5-0.5B에서 측정한 한 layer 시간 분배:

- gate + up (합쳐서 한 매트멀로 처리): 40%
- down:                                21%
- qkv:                                 8%
- wo:                                  6%
- attention + 작은 op들:                25% (이 중 매트멀 외는 6%)

FFN 매트멀 두 개(gate/up + down)가 한 layer 시간의 61%. 매트멀 최적화는 FFN 부분이 가장 큰 효과예요. attention 자체는 의외로 작은 비중(3%)이라 attention 최적화는 ROI가 낮아요. 다만 긴 컨텍스트에서는 다른 얘기.

이 패턴이 layer 24개(Qwen2.5-0.5B 기준)에 똑같이 적용돼요. 같은 시공 단계의 동이 24번 반복되는 거예요. 마지막 layer의 출력이 다시 한 번 RMSNorm 통과 후 lm_head 매트멀로 어휘 사전 크기(151936)로 확장됩니다. 그게 1편에서 본 “점수 배열”이고, 가장 높은 점수의 단어가 다음 단어예요.

7편 정리

  1. 한 동(layer) = 8단계 시공. 매트멀 5개(QKV, wo, gate, up, down)가 시간의 95%. 나머지는 정규화·위치·attention·residual로 합쳐서 5%.
  2. Q/K/V는 같은 입력 자재를 세 가지 용도로 가공. Q는 찾고 싶은 형태, K는 검색 키 형태, V는 실제 내용 형태. 매트멀 3개로 만들고 한 매트멀로 합칠 수도. GQA로 KV는 작게 유지.
  3. RoPE는 자재에 위치 표시판 부착. 같은 자재라도 위치에 따라 다르게 회전. 시간 비중 작음.
  4. Attention은 칵테일 파티에서 한 사람 말 듣기. Q와 K로 점수 만들고 점수 비례로 V 합산. causal mask로 미래 단어 차단(시공 순서). KV cache로 이미 지은 건물 재활용.
  5. FFN(gate/up/down + SiLU)이 매트멀 시간의 61%+. attention보다 훨씬 큰 비중. 매트멀 최적화는 FFN이 ROI 최대.

이번 편이 시리즈에서 가장 단어가 많은 영역이에요. RMSNorm, Q/K/V, RoPE, Attention, KV cache, FFN, SiLU, GQA, SwiGLU. 한 번에 다 외울 필요 없어요. 8단계 그림 하나만 머리에 두고, 각 단계가 도시 시공의 어떤 일에 해당하는지 매핑해 두면 충분해요.

다음 편 미리보기

8편은 멀티스레딩과 메모리 벽입니다. 8 코어 CPU에서 8 스레드 쓰면 매트멀이 8배 빨라야 하는데 실제로는 1.5~2배만 빨라지는 이유. 도시 비유로 풀면 “8명이 한 우물에서 물 긷기”의 명확한 그림. 자재 트럭과 도시 도로의 처리량 한계가 어떻게 작동하는지 풉니다.

ThreadPool이 어떻게 worker들에게 task를 분배하는지, atomic counter 패턴이 mutex 패턴보다 빠른 이유도 같이. 그리고 단일 스레드에서 Lumen이 ggml보다 +13% 빠른데 8 스레드에서는 1.30배 느린 그 격차의 정체도.

이 시리즈 본문 전체는 GitHub에도 정리해 뒀어요. github.com/redchupa/lumen/docs/tutorial에서 원문 격으로 보실 수 있어요.

그럼 다음 편에서 뵐게요. Transformer 또는 attention 관련 궁금한 거 있으시면 댓글 남겨주세요.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤