강좌 강좌
트랜스포머 입문: AI가 문장 속 단어 관계를 파악하는 방법
문장 속 '그것'이 무엇을 가리키는지 AI는 어떻게 판단할까. 이 강좌에서는 트랜스포머가 입력 안 단어들의 관계를 평가하는 원리를 하나의 가상 예시로 처음부터 끝까지 따라간다.
한 문장으로 이해하기
트랜스포머(Transformer)는 입력된 텍스트 안에서 각 토큰이 다른 토큰들과 얼마나 관련 있는지를 평가해 문맥을 파악하는 신경망 구조다. 토큰이란 모델이 텍스트를 처리하는 기본 단위로, 단어 하나라고 생각하면 이해하기 쉽다.
이 강좌를 마치면 세 가지를 할 수 있다. 첫째, 인코더와 디코더의 역할 차이를 구분할 수 있다. 둘째, 자기-어텐션(self-attention)이 토큰 사이의 관련성을 평가하는 과정을 단계별로 설명할 수 있다. 셋째, 트랜스포머의 계산 부담과 대형 언어 모델의 문제를 구분해 말할 수 있다.
사전 지식은 ‘신경망이 입력을 받아 출력을 낸다’는 개념 정도면 충분하다.
왜 필요한가
언어를 다루는 AI는 단어 하나만 보고는 의미를 정하기 어렵다. 예를 들어 ‘그것’ 같은 대명사는 앞에 나온 무언가를 가리키므로, 그 뜻을 정하려면 같은 입력 안의 다른 토큰들을 함께 살펴야 한다.
트랜스포머는 이 문제를 자기-어텐션이라는 방식으로 다룬다. 어떤 토큰을 해석할 때 같은 입력 안에 있는 다른 토큰들이 그 해석에 얼마나 관련 있는지를 평가하는 것이다. ‘자기(self)‘라는 이름이 붙은 이유는 외부 자료가 아니라 같은 입력 내부의 토큰들끼리 관련성을 따지기 때문이다.
어떻게 이루어지는가
완전한 트랜스포머는 두 부분으로 구성된다. 인코더(encoder)는 입력 텍스트를 중간 표현으로 바꾸는 부분이고, 디코더(decoder)는 그 중간 표현을 받아 출력 텍스트를 만드는 부분이다. 중간 표현이란 사람이 읽는 글이 아니라 모델 내부에서 문맥 정보를 담아 두는 형태를 말한다. 인코더만 쓰는 구조나 디코더만 쓰는 구조도 존재한다.
자기-어텐션이 작동하는 과정은 다음 단계로 정리할 수 있다.
- 입력 안의 토큰 하나를 기준으로 선택한다.
- 같은 입력에 있는 다른 토큰들이 이 기준 토큰을 해석하는 데 얼마나 관련 있는지를 평가한다.
- 관련성 평가 결과를 반영해 기준 토큰의 문맥 정보를 만든다.
- 이 과정을 입력 안의 다른 토큰들에 대해서도 반복한다.
인코더는 양방향 자기-어텐션을 사용한다. 즉 기준 토큰의 앞과 뒤에 있는 토큰을 모두 참고한다. 디코더는 단방향 자기-어텐션을 사용해, 이미 나온 토큰만 참고하며 출력을 만든다.
하나의 자기-어텐션 층 안에는 헤드(head)라는 계산 단위가 여러 개 있을 수 있다. 각 헤드는 서로 다른 종류의 관계를 학습할 수 있다. 또한 자기-어텐션 층을 여러 개 쌓으면 앞 층의 출력이 다음 층의 입력이 된다. 출처의 설명에 따르면 앞쪽 층은 단어들이 문장 안에서 서로 어떻게 연결되는지 같은 기본적인 구문 관계를 다루고, 더 깊은 층은 감정·문맥·주제 관계처럼 더 추상적인 정보를 통합할 수 있다.
하나의 예시로 따라가기
다음은 이해를 돕기 위해 만든 가상 예시다.
지수는 상자에서 책을 꺼내 그것을 책상 위에 올려놓았다.
이 문장에서 ‘그것’이 ‘책’을 가리키는지 ‘상자’를 가리키는지가 핵심 문제다.
- 인코더가 문장 전체를 입력으로 받는다.
- ‘그것’을 기준 토큰으로 삼아 자기-어텐션이 작동한다. ‘책’, ‘상자’, ‘꺼내’ 같은 문장 안의 토큰들이 ‘그것’을 해석하는 데 얼마나 관련 있는지를 평가한다. 이때 인코더는 양방향이므로 ‘그것’ 앞뒤의 토큰을 모두 참고한다.
- 첫 번째 층의 출력이 다음 층의 입력이 되고, 층을 거치면서 토큰 사이의 관계 정보가 쌓인다.
- 인코더가 문맥 정보를 담은 중간 표현을 완성한다.
- 번역 같은 작업이라면 디코더가 이 중간 표현을 받아, 이미 만든 토큰만 참고하는 단방향 자기-어텐션으로 출력 토큰을 하나씩 만든다.
이렇게 하나의 문장이 인코더에서 문맥이 담긴 표현으로 바뀌고, 디코더가 그것을 바탕으로 출력을 만들어 낸다.
언제 쓰고 언제 쓰지 않는가
트랜스포머는 번역이나 텍스트 생성처럼 입력 안 토큰들의 관계를 반영해야 하는 작업에 쓰인다. 인코더만 쓰는 구조와 디코더만 쓰는 구조도 있으므로, 작업에 따라 필요한 부분만 사용하는 경우도 있다. 다만 트랜스포머를 쓰지 말아야 할 작업이 무엇인지는 이 강좌의 입력 출처에 제시되어 있지 않으므로, 여기서 확인되지 않은 사용 금지 기준을 단정하지 않는다.
대신 다음과 같은 한계와 조건을 함께 알아야 한다.
- 계산 부담: 출처에 따르면 자기-어텐션의 계산량은 문맥의 토큰 수, 자기-어텐션 층 수, 헤드 수에 따라 정해진다. 문맥이 길어질수록 계산 부담이 커진다.
- 잘못된 내용 생성: 출처는 트랜스포머를 기반으로 한 대형 언어 모델의 문제로, 그럴듯하지만 잘못된 내용을 만들어 내는 현상을 제시한다.
- 편향: 편향이란 모델의 출력이 한쪽으로 치우치는 것을 말한다. 출처는 대형 언어 모델이 편향을 보일 수 있다고 설명한다.
- 학습 자원: 대형 언어 모델을 처음부터 학습하려면 많은 데이터와 전문성, 계산 자원과 시간이 필요하다.
트랜스포머라는 구조 자체의 계산 특성과, 그 구조로 만든 대형 언어 모델의 문제는 구분해서 이해하는 것이 좋다.
핵심 정리와 확인문제
트랜스포머는 자기-어텐션으로 같은 입력 안 토큰들 사이의 관련성을 평가해 문맥이 반영된 표현을 만든다. 인코더가 입력을 중간 표현으로 바꾸고, 디코더가 그것을 받아 출력을 생성한다. 층을 쌓으면 더 추상적인 관계까지 다룰 수 있지만, 문맥이 길어질수록 계산 부담이 커지고 대형 언어 모델에는 잘못된 내용 생성과 편향 같은 문제가 있다.
확인문제 1. 자기-어텐션에서 ‘자기(self)‘가 의미하는 것은 무엇인가?
정답·해설: 같은 입력 안에 있는 토큰들끼리 관련성을 평가한다는 뜻이다. 외부의 다른 텍스트가 아니라 입력 내부에서 각 토큰이 다른 토큰의 해석에 얼마나 관련 있는지를 따진다.
확인문제 2. 인코더와 디코더의 자기-어텐션 방향은 어떻게 다른가?
정답·해설: 인코더는 양방향 자기-어텐션을 사용해 기준 토큰의 앞뒤 토큰을 모두 참고하고, 디코더는 단방향 자기-어텐션을 사용해 이미 만들어진 토큰만 참고하며 출력을 생성한다.
확인문제 3. 다음 세 가지 중 트랜스포머 구조 자체의 계산 특성에 해당하는 것은 무엇이고, 대형 언어 모델의 문제로 제시된 것은 무엇인가? (가) 문맥의 토큰 수가 늘어나면 커지는 계산 부담 (나) 그럴듯하지만 잘못된 내용의 생성 (다) 모델이 보일 수 있는 편향
정답·해설: (가)는 트랜스포머 구조 자체의 계산 특성이다. 자기-어텐션의 계산량은 문맥의 토큰 수, 층 수, 헤드 수에 따라 정해지므로 토큰 수가 늘어나면 계산 부담이 커진다. 반면 (나)와 (다)는 출처가 트랜스포머로 만든 대형 언어 모델의 문제로 제시한 것이다. 구조의 계산 특성과 그 구조로 만든 모델의 문제를 구분해서 이해해야 한다.