0-5. 어텐션과 트랜스포머
어텐션은 "각 조각이 다른 모든 조각을 둘러보고, 필요한 것에서 정보를 가져오는" 계산이다. 이 계산을 쌓은 것이 트랜스포머다. 텍스트를 이해하는 부분도, 최신 이미지·영상 모델의 몸통도 전부 트랜스포머다.
합성곱이 못 하는 일
합성곱은 바로 옆만 본다. 멀리 보려면 여러 번 줄여야 한다. 그런데 그림에는 멀리 떨어진 것끼리 맞아야 하는 것이 많다.
- 왼쪽 눈과 오른쪽 눈의 색이 같아야 한다.
- 거울 속 모습이 거울 밖과 맞아야 한다.
- "빨간 모자를 쓴 소녀"에서 빨강은 모자에 가야 한다.
멀리 있는 것끼리 직접 이야기할 방법이 필요하다. 그것이 어텐션이다.
토큰: 조각으로 나눈다
어텐션은 토큰이라는 조각 단위로 일한다. 토큰 하나는 숫자 묶음(벡터) 하나다.
- 텍스트: 단어나 단어 조각 하나가 토큰이다.
- 이미지: 그림을 바둑판처럼 나눈 작은 조각(패치) 하나가 토큰이다.
문장은 토큰의 줄이고, 그림도 토큰의 줄이다. 이렇게 맞춰 놓으면 텍스트와 그림을 같은 계산에 넣을 수 있다.
어텐션 계산
토큰 하나가 하는 일을 따라가 보자.
- 질문을 만든다. "나는 이런 정보가 필요하다."
- 모든 토큰이 이름표를 내놓는다. "나는 이런 정보를 갖고 있다."
- 질문과 이름표를 비교한다. 잘 맞을수록 점수가 높다.
- 점수를 비율로 바꾼다. 전부 더하면 1이 되게.
- 비율대로 내용을 섞어 가져온다.
용어로는 질문이 쿼리(Q), 이름표가 키(K), 내용이 밸류(V)다. 식으로 쓰면 이렇다.
출력 = softmax( Q·Kᵀ / √d ) · V
Q·Kᵀ가 3번의 비교(점수), softmax가 4번, · V가 5번이다. √d는 점수가 너무 커지지 않게 나눠 주는 숫자다.
4번을 숫자로 보자. 어떤 토큰이 세 토큰에 매긴 점수가 2.0, 1.0, 0.1이다.
| 토큰 A | 토큰 B | 토큰 C | |
|---|---|---|---|
| 점수 | 2.0 | 1.0 | 0.1 |
| 비율 | 0.66 | 0.24 | 0.10 |
A의 내용을 66%, B를 24%, C를 10% 섞어서 가져온다. 점수가 높은 쪽을 많이 본다. 그래서 이름이 어텐션(주의)이다.
Q, K, V를 만드는 방법은 사람이 정하지 않는다. 각각 가중치를 곱해 만들고, 그 가중치를 학습한다. 무엇을 묻고 무엇에 주목할지를 모델이 스스로 배운다.
셀프 어텐션과 크로스 어텐션
누가 누구를 보느냐에 따라 두 가지로 나뉜다.
셀프 어텐션: 같은 줄 안에서 서로를 본다.
- 그림 토큰이 다른 그림 토큰을 본다. 왼쪽 눈이 오른쪽 눈을 보고 색을 맞춘다.
- 텍스트 토큰이 다른 텍스트 토큰을 본다. "빨간"이 "모자"를 보고 자기가 모자를 꾸민다는 것을 안다.
크로스 어텐션: 다른 줄을 본다.
- 그림 토큰이 텍스트 토큰을 본다. 그림의 각 위치가 프롬프트에서 자기와 관련된 단어를 찾아 정보를 가져온다.
크로스 어텐션이 프롬프트가 그림에 들어가는 통로다. 프롬프트의 단어 하나가 그림의 어느 위치에 영향을 주는지는 이 어텐션 비율로 정해진다.
위치 정보
어텐션은 토큰의 순서를 모른다. 줄을 뒤섞어도 계산 결과가 같다. 그림에서 위치를 모르면 곤란하다.
그래서 각 토큰에 "나는 몇 번째 줄 몇 번째 칸"이라는 정보를 더해 준다. 이것을 위치 인코딩이라고 한다.
트랜스포머 블록
어텐션 하나에 몇 가지를 붙여 블록을 만든다.
입력 → [어텐션] → [작은 신경망] → 출력
- 어텐션: 다른 토큰에서 정보를 모은다.
- 작은 신경망: 모은 정보를 토큰마다 따로 가공한다. 0-3의 층 두 개다.
- 각 단계에는 "입력을 그대로 더해 주는 길"이 있다. 깊게 쌓아도 학습이 잘 되게 하는 장치다.
이 블록을 수십 개 쌓은 것이 트랜스포머다. 멀티헤드라는 말도 자주 나온다. 어텐션을 여러 벌 동시에 돌린다는 뜻이다. 한 벌은 색을 맞추고, 다른 벌은 형태를 맞추는 식으로 역할을 나눈다.
대가: 계산량
모든 토큰이 모든 토큰을 본다. 토큰이 n개면 비교가 n × n번이다. 토큰이 두 배면 계산은 네 배다.
1024×1024 그림의 픽셀을 그대로 토큰으로 쓰면 어떻게 될까.
| 방식 | 토큰 수 | 비교 횟수 |
|---|---|---|
| 픽셀 하나가 토큰 | 약 105만 | 약 1조 1천억 |
| 8배 압축 후 2×2 조각이 토큰 | 4,096 | 약 1,700만 |
위쪽은 불가능하다. 그래서 그림을 먼저 작게 압축한 다음 그 위에서 계산한다. 이 압축을 하는 것이 1단계 첫 수업의 VAE다. "잠재 공간에서 생성한다"는 말이 여기서 나온다.
어디에 쓰이나
- 텍스트 인코더(CLIP, T5 등): 프롬프트를 토큰 벡터로 바꾸는 트랜스포머
- U-Net 안의 어텐션(SD 1.5, SDXL): 합성곱 블록 사이에 셀프 어텐션과 크로스 어텐션이 끼어 있다
- DiT(Flux, Wan 등): U-Net을 버리고 트랜스포머만으로 만든 디노이저
확인 문제
- 어텐션에서 점수를 비율로 바꾼 뒤, 그 비율을 전부 더하면 얼마인가?
- 토큰 수가 3배가 되면 어텐션 계산량은 몇 배가 되나?
- 프롬프트의 내용이 그림에 반영되는 통로는 셀프 어텐션인가, 크로스 어텐션인가?
풀이
- 1이다. softmax가 그렇게 만든다.
- 9배다. 비교 횟수가 토큰 수의 제곱이다.
- 크로스 어텐션이다. 그림 토큰이 텍스트 토큰을 보고 정보를 가져온다.