kimyongtae.com
홈 / 강의 / AI 이미지·애니메이션 생성, 원리부터 / 0단계. 최소 기초

0-5. 어텐션과 트랜스포머

어텐션은 "각 조각이 다른 모든 조각을 둘러보고, 필요한 것에서 정보를 가져오는" 계산이다. 이 계산을 쌓은 것이 트랜스포머다. 텍스트를 이해하는 부분도, 최신 이미지·영상 모델의 몸통도 전부 트랜스포머다.

합성곱이 못 하는 일

합성곱은 바로 옆만 본다. 멀리 보려면 여러 번 줄여야 한다. 그런데 그림에는 멀리 떨어진 것끼리 맞아야 하는 것이 많다.

멀리 있는 것끼리 직접 이야기할 방법이 필요하다. 그것이 어텐션이다.

토큰: 조각으로 나눈다

어텐션은 토큰이라는 조각 단위로 일한다. 토큰 하나는 숫자 묶음(벡터) 하나다.

문장은 토큰의 줄이고, 그림도 토큰의 줄이다. 이렇게 맞춰 놓으면 텍스트와 그림을 같은 계산에 넣을 수 있다.

어텐션 계산

토큰 하나가 하는 일을 따라가 보자.

  1. 질문을 만든다. "나는 이런 정보가 필요하다."
  2. 모든 토큰이 이름표를 내놓는다. "나는 이런 정보를 갖고 있다."
  3. 질문과 이름표를 비교한다. 잘 맞을수록 점수가 높다.
  4. 점수를 비율로 바꾼다. 전부 더하면 1이 되게.
  5. 비율대로 내용을 섞어 가져온다.

용어로는 질문이 쿼리(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.01.00.1
비율0.660.240.10

A의 내용을 66%, B를 24%, C를 10% 섞어서 가져온다. 점수가 높은 쪽을 많이 본다. 그래서 이름이 어텐션(주의)이다.

Q, K, V를 만드는 방법은 사람이 정하지 않는다. 각각 가중치를 곱해 만들고, 그 가중치를 학습한다. 무엇을 묻고 무엇에 주목할지를 모델이 스스로 배운다.

셀프 어텐션과 크로스 어텐션

누가 누구를 보느냐에 따라 두 가지로 나뉜다.

셀프 어텐션: 같은 줄 안에서 서로를 본다.

크로스 어텐션: 다른 줄을 본다.

크로스 어텐션이 프롬프트가 그림에 들어가는 통로다. 프롬프트의 단어 하나가 그림의 어느 위치에 영향을 주는지는 이 어텐션 비율로 정해진다.

위치 정보

어텐션은 토큰의 순서를 모른다. 줄을 뒤섞어도 계산 결과가 같다. 그림에서 위치를 모르면 곤란하다.

그래서 각 토큰에 "나는 몇 번째 줄 몇 번째 칸"이라는 정보를 더해 준다. 이것을 위치 인코딩이라고 한다.

트랜스포머 블록

어텐션 하나에 몇 가지를 붙여 블록을 만든다.

입력 → [어텐션] → [작은 신경망] → 출력

이 블록을 수십 개 쌓은 것이 트랜스포머다. 멀티헤드라는 말도 자주 나온다. 어텐션을 여러 벌 동시에 돌린다는 뜻이다. 한 벌은 색을 맞추고, 다른 벌은 형태를 맞추는 식으로 역할을 나눈다.

대가: 계산량

모든 토큰이 모든 토큰을 본다. 토큰이 n개면 비교가 n × n번이다. 토큰이 두 배면 계산은 네 배다.

1024×1024 그림의 픽셀을 그대로 토큰으로 쓰면 어떻게 될까.

방식토큰 수비교 횟수
픽셀 하나가 토큰약 105만약 1조 1천억
8배 압축 후 2×2 조각이 토큰4,096약 1,700만

위쪽은 불가능하다. 그래서 그림을 먼저 작게 압축한 다음 그 위에서 계산한다. 이 압축을 하는 것이 1단계 첫 수업의 VAE다. "잠재 공간에서 생성한다"는 말이 여기서 나온다.

어디에 쓰이나

확인 문제

  1. 어텐션에서 점수를 비율로 바꾼 뒤, 그 비율을 전부 더하면 얼마인가?
  2. 토큰 수가 3배가 되면 어텐션 계산량은 몇 배가 되나?
  3. 프롬프트의 내용이 그림에 반영되는 통로는 셀프 어텐션인가, 크로스 어텐션인가?

풀이

  1. 1이다. softmax가 그렇게 만든다.
  2. 9배다. 비교 횟수가 토큰 수의 제곱이다.
  3. 크로스 어텐션이다. 그림 토큰이 텍스트 토큰을 보고 정보를 가져온다.
← 0-4 CNN과 U-Net 0-6 실습: 작은 디노이저 학습 →