트랜스포머 정리해보기

트랜스포머

지난번 1장에서, 트랜스포머는 문장 속 각 토큰이 다른 토큰과 어떤 관계가 있는지 계산해서, 문맥에 맞는 표현을 만드는 신경망 구조라고 했다.

(이 안에서 어텐션 기법이라는 용어가 등장했고, 이는 토큰을 처리하는 과정에서 관련성이 더 높은 단어에 더 많은 '주의'를 기울이는 방법임)

가령 프롬프팅을

대한민국의 수도는

이라고 했다면, 모델은 다음 토큰별로 점수를 만들고,

서울  85%
부산   5%
한국   3%
기타   7%

이런식으로 가장 확률이 높은 토큰을 더하면서 문장을 만들어나간다. 각 토큰 생성 과정은 정방향 계산에 해당한다.

예를 들어

입력: 서울은 한국의
1회 정방향 계산 → “수도”의 확률 분포 → 수도 선택

입력: 서울은 한국의 수도
2회 정방향 계산 → “입니다”의 확률 분포 → 입니다 선택

입력: 서울은 한국의 수도입니다
3회 정방향 계산 → 종료 토큰 선택

위와 같이 토큰 하나하나마다 모델 전체를 다시 거친다는 뜻이다.

이전의 예측을 사용해 다음 예측을 만드는 자기회귀 모델이라고 한다.

이런 계산 방식 외에 핵심 구성 요소는 토크나이저와 언어 모델링 헤드(LM헤드) 이다.

토크나이저 : 텍스트를 토큰으로 나누고, 각 토큰을 토큰 ID로 변환하는 도구 LM헤드 : 트랜스포머가 만든 벡터를 각 토큰의 점수로 변환하는 마지막 출력층

정리해보면

  1. 입력값을 받음
  2. 토크나이저가 텍스트를 토큰으로 분할하고, 각 토큰을 ID로 변환
  3. 임베딩 층에서 토큰 ID들을 초기 벡터로 변환
  4. 트랜스포머의 블록 스택에서, 각 토큰 사이의 관계들을 계산해 문맥 벡터로 계속 가공
  5. LM헤드에서 다음 토큰 후보들의 로짓 (토큰 후보들의 점수를 원시점수화 한것) 출력
  6. Softmax (로짓을 확률 분포로 변환) 단계
  7. 디코딩 전략 => Softmax의 결과 값을 기반으로 실제 토큰 하나를 선택.
  8. 탐욕적 디코딩 (Greedy decoding)을 사용하는 경우, 가장 높은 확률의 토큰을 선택.

위와 같다.

트랜스포머 블록 내부에서도 어텐션층과, 피드포워드 층이 나누어진다.

피드포워드

피드포워드 신경망은 각 토큰의 정보들을 개별적으로 가공하는 층이다. 어텐션층은 토큰끼리 정보를 주고 받으면서 어떤 토큰을 참고하지?의 단계를 거친다면, 피드포워드층은 참고해서 얻은 정보를 토큰별로 가공하고, 가져온 정보를 어떻게 표현하지? 에 대해서 다룬다.

어텐션

어텐션층은 각 토큰이 앞에 나온 토큰 중 무엇을 얼마나 참고할지 계산하는 층이다.

어텐션 계산을 위해 각 토큰의 벡터에서 Query, Key, Value라는 세 종류의 벡터를 만든다.

  • Query: 현재 토큰이 찾으려는 정보
  • Key: 각 토큰이 어떤 정보를 가졌는지 비교하기 위한 값
  • Value: 해당 토큰에서 실제로 가져올 정보

가령 다음과 같은 문장이 있다고 해보자.

철수는 영희에게 사과했다. 그녀는 웃었다.

그녀를 처리할 때는 그녀의 Query와 앞에 나온 토큰들의 Key를 비교한다. 이 과정에서 영희와의 관련도가 높게 계산되면, 영희의 Value에 담긴 정보를 더 많이 가져와 그녀의 벡터에 반영한다.

흐름을 간단히 나타내면 다음과 같다.

현재 토큰의 Query
이전 토큰들의 Key와 비교
토큰별 관련도 점수 계산
Softmax로 참고 비중 변환
비중에 따라 각 토큰의 Value를 가져옴
현재 토큰의 문맥 벡터 생성

트랜스포머 내부에서는 어텐션 계산을 여러 헤드에서 병렬로 수행한다.

이를 멀티헤드 어텐션이라고 한다.

각 헤드는 서로 다른 방식으로 토큰 사이의 관계를 학습하고, 마지막에는 각 헤드의 결과를 하나로 합친다.

정리하면 어텐션층은 Query와 Key를 비교해 어떤 토큰을 얼마나 참고할지 정하고, 그 비중에 따라 Value의 정보를 가져오는 층이다.