챗GPT 같은 자연스러운 대화가 가능한 채팅 AI 기반이 되는 대규모 언어 모델은 구글이 개발한 기계학습 아키텍처인 트랜스포머(Transformer)를 채용하고 있다. 이런 트랜스포머가 문맥에 따른 자연스러운 문장을 출력하는 구조는 어떤 것일까.
문장을 생성하는 기술은 예전부터 연구되어 왔지만 스마트폰 등에도 예측 입력 기능이 탑재되어 있지만 이런 예측 기능은 입력 이력으로부터 빈출 어구를 선택하는 것만으로 문맥을 무시한 후보가 선출되는 경우도 있다. 예를 들어 스마트폰 예측 입력 성능을 확인하려면 수동으로 첫 자를 입력한 다음 예측 입력 후보 시작 부분을 계속 탭한다. 물론 이렇게 그냥 하면 의미 불명 문장이 될 수 있다.
한편 트랜스포머는 문맥을 유지하면서 연속 문장을 생성할 수 있다. 예를 들어 “Write a story.”라는 문장을 입력하면 ‘Once’가 이어질 걸 예상하고 이를 입력하면 ‘upon’이 계속될 것으로 예상한다.
트랜스포머는 크게 나눠 토큰화(Tokenization), 임베딩(Embedding), 위치 인코딩(Positional encoding), 블록(Transformer block), 소프트맥스(Softmax)라는 5단계 조작을 거쳐 문장을 인식, 생성한다.
먼저 트랜스포머에선 문장을 토큰이라고 불리는 단위로 세분화하고 나서 처리를 실시한다. 앞선 예처럼 “Write a story.”라는 문장은 “Write” “a” “story” 등으로 세분화된다. 영문의 경우 1개 단어가 1토큰이 되는 경우가 많지만 단어 종류나 언어에 의해 토큰을 나누는 방법은 다르다.
토큰화가 완료되면 각 토큰을 수치로 변환하는 내장이 수행된다. 임베딩은 토큰을 토큰과 숫자 대응 목록과 비교해 수행된다. 벡터는 원래는 여러 종류가 존재하지만 벡터가 2종류라고 가정하면 토큰 매입 후 상태는 이렇다. 토큰별 좌표를 확인하면 사과(5.5), 바나나(6.5), 딸기(5.4) 등 의미가 가까운 토큰이 가까운 좌표에 위치한다. 이렇게 매입에 의해 토큰을 수치화하는 것으로 각 토큰이 비슷한지 어떤지를 알 수 있게 된다.
각 토큰을 수치화하면 다음에 문장 전체를 1개 벡터로 변환할 필요가 있다. 문장 전체를 벡터 하나로 하려면 토큰별 좌표 합계를 도출하면 된다. 예를 들어 문장에 포함되는 토큰 좌표가 2,3, 2,4, 1,5인 경우 문장 전체 좌표는 2+2+1,3+4+5=5,12가 된다. 다만 단순히 좌표를 합치는 방법은 ‘I’m not sad, I’m happy, I’m not happy, I’m sad’라는 같은 단어가 다른 순서로 늘어선 문장이 동일 좌표에 존재하게 되어 버린다. 이 동일 좌표 문제를 해결하기 위해 트랜스포머는 각 토큰에 정렬 순서를 나타내는 위치 토큰을 추가한다. 예를 들어 “Write a story.”라는 문장은 “Write” “a” “story” “.”로 나뉘어져 위치 벡터가 추가되어 Write(1)” “a(2)” “story(3) .(4)가 된다.
토큰 매입과 위치 인코딩이 끝나면 컨텍스트에 맞춰 계속 생성하는 처리가 실행된다. 이 처리는 트랜스포머 블록이라고 불리는 처리 계통을 몇 개나 통과하는 것으로 실행된다.
트랜스포머 블록 중에서도 중요한 건 문맥을 고려할 수 있도록 토큰에 가중치를 주는 공정(Attention)이다. 예를 들어 ‘bank’라는 단어네는 토수와 은행이라는 2가지 의미가 있으며 이 단어만 표시된다면 어떤 의미인지 판단하기는 어렵다. 하지만 ‘The bank of the river‘, ‘Money in the bank’처럼 세트가 되는 단어에 의해 ‘bank’ 의미를 파악할 수 있다. 따라서 트랜스포머에선 토수를 의미하는 ‘bank’를 ‘river’ 근처 좌표에, 은행을 의미하는 ‘bank’를 ‘Money’ 근처 좌표에 배치해 문장을 파탄내지 않고 단어를 연결할 수 있다.
이런 문맥에 따른 가중치 처리를 실시한 뒤 트랜스포머 블록에선 연속 문장에서 적절한 단어를 복수 도출해 단어마다 점수를 부여한다.
트랜스포머 블록에서 문장 연속으로 적절한 단어 후보를 도출하면 각 후보 점수를 확률로 변환하는 소프트맥스 처리를 실행한다. 그리고 가장 확률이 높은 단어가 문장 연속으로 출력된다. “Write a story.”라는 문장을 입력한 결과 “Once” “Somewhere” “There”라는 단어가 후보로 도출되고 후보 중 가장 확률이 높은 “Once”가 문장에 이어져 출력된다. “Once”를 출력하면 “Write a story. Once”가 새로 입력되어 차례로 문장 연속이 생성되는 것이다. 관련 내용은 이곳에서 확인할 수 있다.