지난번 1장에서, 트랜스포머는 문장 속 각 토큰이 다른 토큰과 어떤 관계가 있는지 계산해서, 문맥에 맞는 표현을 만드는 신경망 구조라고 했다.
(이 안에서 어텐션 기법이라는 용어가 등장했고, 이는 토큰을 처리하는 과정에서 관련성이 더 높은 단어에 더 많은 '주의'를 기울이는 방법임)
가령 프롬프팅을
대한민국의 수도는
이라고 했다면, 모델은 다음 토큰별로 점수를 만들고,
서울 85%
부산 5%
한국 3%
기타 7%
이런식으로 가장 확률이 높은 토큰을 더하면서 문장을 만들어나간다. 각 토큰 생성 과정은 정방향 계산에 해당한다.
예를 들어
입력: 서울은 한국의
1회 정방향 계산 → “수도”의 확률 분포 → 수도 선택
입력: 서울은 한국의 수도
2회 정방향 계산 → “입니다”의 확률 분포 → 입니다 선택
입력: 서울은 한국의 수도입니다
3회 정방향 계산 → 종료 토큰 선택
위와 같이 토큰 하나하나마다 모델 전체를 다시 거친다는 뜻이다.
이전의 예측을 사용해 다음 예측을 만드는 자기회귀 모델이라고 한다.
이런 계산 방식 외에 핵심 구성 요소는 토크나이저와 언어 모델링 헤드(LM헤드) 이다.
토크나이저 : 텍스트를 토큰으로 나누고, 각 토큰을 토큰 ID로 변환하는 도구 LM헤드 : 트랜스포머가 만든 벡터를 각 토큰의 점수로 변환하는 마지막 출력층
정리해보면
위와 같다.
트랜스포머 블록 내부에서도 어텐션층과, 피드포워드 층이 나누어진다.
피드포워드 신경망은 각 토큰의 정보들을 개별적으로 가공하는 층이다. 어텐션층은 토큰끼리 정보를 주고 받으면서 어떤 토큰을 참고하지?의 단계를 거친다면, 피드포워드층은 참고해서 얻은 정보를 토큰별로 가공하고, 가져온 정보를 어떻게 표현하지? 에 대해서 다룬다.
어텐션층은 각 토큰이 앞에 나온 토큰 중 무엇을 얼마나 참고할지 계산하는 층이다.
어텐션 계산을 위해 각 토큰의 벡터에서 Query, Key, Value라는 세 종류의 벡터를 만든다.
가령 다음과 같은 문장이 있다고 해보자.
철수는 영희에게 사과했다. 그녀는 웃었다.
그녀를 처리할 때는 그녀의 Query와 앞에 나온 토큰들의 Key를 비교한다. 이 과정에서 영희와의 관련도가 높게 계산되면, 영희의 Value에 담긴 정보를 더 많이 가져와 그녀의 벡터에 반영한다.
흐름을 간단히 나타내면 다음과 같다.
현재 토큰의 Query
↓
이전 토큰들의 Key와 비교
↓
토큰별 관련도 점수 계산
↓
Softmax로 참고 비중 변환
↓
비중에 따라 각 토큰의 Value를 가져옴
↓
현재 토큰의 문맥 벡터 생성
트랜스포머 내부에서는 어텐션 계산을 여러 헤드에서 병렬로 수행한다.
이를 멀티헤드 어텐션이라고 한다.
각 헤드는 서로 다른 방식으로 토큰 사이의 관계를 학습하고, 마지막에는 각 헤드의 결과를 하나로 합친다.
정리하면 어텐션층은 Query와 Key를 비교해 어떤 토큰을 얼마나 참고할지 정하고, 그 비중에 따라 Value의 정보를 가져오는 층이다.