어떻게 가능할까?

어떻게 가능할까?

트랜스포머의 탄생

ChatGPT의 똑똑한 대화가 가능한 이유를 한마디로 설명한다면 트랜스포머(transformer)라는 구조로 대량의 데이터를 학습해 문맥에 맞는 텍스트를 생성하기 때문입니다. 원래의 트랜스포머는 기계 번역을 위해 고안된 인코더–디코더 구조입니다. GPT 계열은 이 중 디코더를 기반으로 하는 자기회귀 언어 모델입니다.

기존의 순환 신경망(Recurrent Neural Network, RNN)은 토큰을 순서대로 처리합니다. 그래서 병렬화가 어렵고 멀리 떨어진 토큰 사이의 관계를 학습하기도 어려웠습니다.

트랜스포머는 어텐션(attention)을 사용해 각 토큰이 다른 토큰과 얼마나 관련되는지 계산합니다. 학습할 때는 여러 토큰 위치의 연산을 병렬로 처리할 수 있지만 GPT가 글을 생성할 때는 토큰을 하나씩 순차적으로 만듭니다. 또한 어텐션은 입력이 길어질수록 계산량과 메모리 사용량이 커지는 한계가 있습니다. 트랜스포머는 어텐션 외에도 피드포워드 신경망, 잔차 연결, 층 정규화 등을 함께 사용합니다.

간단하게 살펴볼까요?

어텐션을 이해하면 트랜스포머도 이해할 수 있지만 먼저 원래의 인코더–디코더 트랜스포머가 어떤 구조인지 살펴보겠습니다.

트랜스포머 기본 구조 다이어그램 인코더–디코더 트랜스포머의 기본 구조

먼저 토크나이저가 문장을 토큰으로 나누고 각 토큰을 ID로 변환합니다. 인코더(encoder)는 이 토큰 표현을 임베딩(embedding)을 통해 벡터(vector)로 바꾼 뒤 셀프 어텐션과 피드포워드 신경망을 적용해 문맥을 반영한 표현을 만듭니다. 이 처리는 여러 층(layer)을 통과하면서 반복됩니다.

이어서 인코더의 출력을 디코더(decoder)의 입력으로 사용합니다.

디코더는 인코더의 출력과 지금까지 생성한 토큰을 바탕으로 다음 토큰의 확률 분포를 계산합니다. 그 분포에서 다음 토큰을 선택하는 과정을 종료 토큰이 나올 때까지 반복합니다. 이 과정은 학습 데이터에서 문장을 그대로 찾는 검색과는 다릅니다.

빨리 ChatGPT를 활용하고 싶다면 여기까지 이해하신 것만으로도 문제없을 테니 2장으로 건너뛰기 바랍니다. 어텐션과 그 밖의 구성 요소가 하는 일이 궁금하다면 다음 설명을 계속 읽으면 됩니다.

토큰의 분해와 순서 부여

말을 컴퓨터가 처리하려면 먼저 수치로 변환해야 합니다. 토크나이저는 ‘저는 고양이입니다.’라는 문장을 토큰(token)이라는 단위로 나눕니다. 예를 들면 ‘저’, ‘는’, ‘고양이’, ‘입니다’처럼 나눌 수 있지만 실제 결과는 사용하는 토크나이저에 따라 달라집니다. 토큰으로 나누는 것만으로는 토큰 사이의 관계나 문장의 의미를 표현할 수 없습니다.

각 토큰은 임베딩(embedding)을 거쳐 여러 수치로 이루어진 벡터로 바뀌니다. 이렇게 표현하면 토큰을 어텐션과 같은 수학적 연산으로 처리할 수 있습니다.

하지만 어텐션 연산만으로는 문장 안에서 각 토큰의 순서를 알 수 없습니다. 원래의 트랜스포머는 각 토큰 벡터에 위치 부호화(positional encoding)를 더해 순서 정보를 제공합니다. 이때 $\sin$과 $\cos$ 함수로 각 위치를 다른 패턴으로 표현합니다. 다만 모든 트랜스포머가 이 방식을 쓰는 것은 아니며 학습 가능한 위치 임베딩이나 다른 위치 표현을 사용하기도 합니다.