cb
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 上 본문
본 게시물은 <Do It! BERT와 GPT로 배우는 자연어 처리>의 3장을 보고 정리한 글입니다. 실습에서 사용되는 오픈소스 패키지는 아래의 링크를 참고하시길 바랍니다.
GitHub - ratsgo/ratsnlp: tools for Natural Language Processing
tools for Natural Language Processing. Contribute to ratsgo/ratsnlp development by creating an account on GitHub.
github.com
언어 모델(language model)
언어 모델이란 단어 시퀀스를 입력받아 해당 시퀀스가 얼마나 그럴듯한지 확률을 출력하는 모델이다.
그렇기 때문에 한국어 말뭉치로 학습한 언어 모델은 한국어 문장이 자연스러울수록 높은 확률값을 부여한다.
문장에서 i번째로 등장하는 단어를 w_i로 표시한다면 n개 단어로 구성된 문장이 해당 언어에서 등장할 확률은 아래와 같이 쓸 수 있다.
$$ P(w_1, w_2, w_3,...,w_n) $$이 수식은 n개 단어가 동시에 나타날 결합 확률(joint probability)를 의미한다.
예를 들면, P(난폭, 운전)은 난폭이라는 단어와 운전이라는 단어가 동시에 나타날 결합확률을 의미한다. 그렇기 때문에 P(무모, 운전)이라는 확률보다는 P(난폭, 운전)이라는 값이 더 큰 확률값을 지닐 것이다.
여기서, 난폭이 나타난 다음에 운전이 나타날 확률은 아래와 같이 정의할 수 있다. 이를 조건부 확률(comditional probability)이라고 부른다. 이는 어떠한 사건이 일어났다는 조건 하에서 다른 사건이 일어날 확률을 의미한다.
$$ P(운전|난폭) = P(난폭, 운전)/P(난폭) $$이 확률은 난폭이라는 단어가 나타났다는 조건 하에 운전이라는 단어가 나타날 확률을 의미한다. 식을 살펴보면 조건이 되는 사건이 우변의 분자 일부, 분모를 구성하고 있음을 알 수 있다.
여기서, 조건부 확률의 정의에 따라 단어 3개가 동시에 등장할 결합 확률은 아래와 같은 수식으로 나타낼 수 있다.
$$ P(w_1, w_2, w_3) = P(w_1) * P(w_2|w1) * P(w_3|w1,w2) $$
이를 직관적으로 보면, 단어 3개로 구성된 문장이 나타나기 위해서는 아래의 세 가지 사건이 동시에 일어나야 한다는 의미로 해석할 수 있다.
- 첫 번째 단어(w1) 등장
- 첫 번째 단어(w1) 등장 후 두 번째 단어(w2) 등장
- 첫 번째 단어(w1)와 두 번째 단어(w2) 등장 후 세 번쨰 단어(w3) 등장
전체 단어 시퀀스가 나타날 확률은 이전 단어들이 주어졌을 떄 다음 단어가 등장할 확률의 연쇄와 같다고도 이해할 수 있다.
그렇기 때문에 언어 모델을 이전 단어들이 주어졌을 때 다음 단어가 나타날 확률을 부여하는 모델이라고 하는 것이다.
최근에는 언어 모델을 P(w|context)라고 정의하기도 한다. 이는 컨텍스트, 맥락이 전제된 상태에서 특정 단어(w)가 나타날 조건부 확률을 의미한다. 이때 컨텍스트와 맞힐 단어를 어떻게 설정하느냐에 따라 수식을 다양하게 변형할 수 있다.
순방향 언어 모델(forward language model)
순방향 언어 모델은 문장의 앞에서부터 뒤로, 즉 사람이 이해하는 순서대로 단어 시퀀스를 계산하는 모델이다. 이전 단어들(context)이 주어졌을 때 다음 단어를 맞히는 과제를 생각해 보면 쉽게 이해할 수 있다.

위의 그림은 학습 말뭉치가 어제 카페 갔었어 거기 사람 많더라라는 한 문장일 때 언어 모델이 계산하는 대상을 나타낸 것이다.
역방향 언어 모델(backward language model)
역방향 언어 모델은 문장을 뒤부터 앞으로 계산하는 언어 모델이다. 순방향 언어 모델에서 방향만 바뀌었다고 생각하면 된다.

마스크 언어 모델(masked language model)
마스크 언어 모델은 학습 대상 문장에 빈칸을 만들어 놓고 해당 빈칸에 올 단어로 적절한 단어가 무엇일지 분류하는 과정으로 학습한다.

첫 줄에서 컨텍스트는 [MASK] 카페 갔었어 거기 사람 많더라가 되고, 맞힐 단어는 어제가 된다.
같은 방식으로 두 번째 줄의 컨텍스트는 어제 [MASK] 갔었어 거기 사람 많더라가 된다. 맞힐 단어는 카페가 되므로, 위 사진의 검은색 단어는 주어진 맥락, 즉 컨텍스트를 가리키고 주황색 단어는 맞혀야 할 타깃 단어를 가리킨다.
마스크 언어 모델은 타깃 단어 이전 단어들만 참고할 수 있는 순방향, 역방향 언어 모델과 달리 문장 전체의 맥락을 참고할 수 있다는 장점이 있다. 이를 양방향(bidirectional) 성질을 가진다고 한다.
스킵-그램 모델(skip-gram model)
스킵 그램 모델은 어떤 단어 앞뒤에 특정 범위를 정해 두고 이 범위 내에 어떤 단어들이 올지 분류하는 과정으로 학습한다.

위 그림은 컨텍스트로 설정한 주황색 단어 앞뒤로 두 개씩 보는 상황을 나타낸 예시이다. 첫 번째 그림에서 스킵-그램 모델은 갔었어 주변 단어들인 어제, 카페, 거기, 사람이 나타날 확률을 각각 높이는 방식으로 학습한다. 이후 거기가 타겟이 되면, 카페, 갔었어, 사람, 많더라가 나타날 확률을 각각 높인다.
즉, 스킵-그램 모델은 컨텍스트로 설정한 단어 주변에 어떤 단어들이 분포해 있는지를 학습하는 모델이라고도 이해할 수 있다.
언어 모델의 유용성
잘 학습된 언어 모델은 어떤 문장이 자연스렁누지 가려낼 수 있고, 언어의 풍부한 맥락을 포함하고 있기 때문에 다양한 태스크를 수행할 수 있다.
기계 번역, 문법 교정, 문장 생성 등의 태스크에서 사용되는 조건부확률은 아래와 같이 나타낼 수 있다.
- 기계 번역: P(? | You can't be free from death)
- 문법 교정: P(두시 삼십 이분) > P(이시 서른 두 분)
- 문장 생성: P(? | 발 없는 말이)
시퀀스 투 시퀀스(sequence to sequence)
시퀀스 투 시퀀스는 특정 속성을 지닌 시퀀스를 다른 속성의 시퀀스로 변환하는 작업을 의미한다. 여기서 시퀀스란 단어 같은 무언가의 나열을 의미한다. 우리가 잘 알고 있는 BERT나 GPT 같은 트랜스포머 기반 언어 모델이 시퀀스 투 시퀀스 과제를 수행한다.
기계 번역은 어떤 언어의 토큰 시퀀스를 다른 언어의 토큰 시퀀스로 변환하는 과제이다.

번역을 수행하고 싶은 언어를 소스 언어(source language), 번역된 언어를 타깃 언어(target language)라고 한다.
위의 예시를 잘 살펴 보면 소스 언어의 입력 시퀀스는 어제, 카페, 갔었어, 거기, 사람, 많더라의 토큰 6개가 된다. 똑같이 타깃 언어는 I, went, to, the, cafe, there, were, many, people, there로 총 10개의 토큰 시퀀스를 가진다. 이처럼 시퀀스 투 시퀀스 태스크는 소스와 타깃의 길이가 달라도 해당 과제를 수행하는 데에 문제가 없어야 한다는 사실을 알 수 있다.
인코더와 디코더(Encoder & Decoder)
시퀀스 투 시퀀스 과제를 수행하는 모델은 대개 인코더와 디코더로 분류된다.
인코더는 소스 시퀀스의 정보를 압축해 디코더로 보내는 역할을 담당하고, 디코더는 인코더가 보낸 시퀀스 정보를 받아 타깃 시퀀스를 생성한다.
인코더가 소스 시퀀스의 정보를 압축하는 과정을 인코딩, 디코더가 타깃 시퀀스를 생성하는 과정을 디코딩이라고 한다.
기계 번역에서는 인코더가 한국어 문장을 압축해 디코더에 보내고, 디코더는 이를 받아 영어로 번역한다.
모델 학습과 인퍼런스
위 사진을 토대로 트랜스포머의 학습 과정을 살펴 보자. 여기서는 어제 카페 갔었어 거기 사람 많더라라는 입력 시퀀스를 받아 I를 출력해내는 차례라고 가정해 보자.

여기서 인코더 입력은 소스 시퀀스 전체이고, 디코더 입력은 <s>가 된다. <s>는 타깃 시퀀스의 시작을 뜻하는 스페셜 토큰이다. 디코더는 인코더에서 보내온 정보와 현재 디코더 입력을 모두 고려해 다음 토큰(I)를 맞힌다.
트랜스포머의 최종 출력(디코더 출력)은 타깃 언어의 어휘 수만큼의 차원으로 구성된 벡터(vector)이다. 이 벡터의 특징은 요솟값(element값)이 모두 확률이라는 것이다. 만약 타깃 언어의 어휘가 총 3만 개라고 가정해 보면 디코더 출력은 3만 차원의 벡터이고, 이 벡터의 요솟값 3만개 각각은 0 이상 1 이하의 값으로, 다 더하면 1의 값을 가진다.

위의 사진을 보면, 지금은 I라는 단어를 맞히는 차례이기 때문에, I에 해당하는 확률값이 높아지고 다른 단어의 확률값을 낮추는 방향으로 학습하고 있는 것을 확인할 수 있다.
다음으로 타깃 시퀀스 가운데 went를 맞히는 차례라고 가정해 보자. 그렇다면 인코더 입력은 소스 시퀀스 전체, 디코더 입력은 <s>, I 가 된다.

여기 학습 과정에서는 디코더의 입력으로 맞혀야 할 단어인 went 이전의 정답 타깃 시퀀스 <s>, I를 넣어 준다. 하지만 학습이 종료된 후 인퍼런스를 진행할 때에는 현재 디코더 입력에 직전 디코딩 결과를 사용하여 디코더가 출력한 예측값을 토대로 인퍼런스를 진행한다.
만약 인퍼런스에서 직전 디코더 출력이 i 대신 you라는 단어라고 치면, 디코더 입력은 <s> you가 된다.
다음으로 타깃 시퀀스 가운데 to를 맞힐 차례라고 해 보자.

그렇다면 이는 앞서 과정처럼 소스 시퀀스 전체를 인코더 입력으로 받고, 직전 디코딩 결과를 인퍼런스에서의 디코더 입력으로 받는다.
마찬가지로 학습 과정에서는 이번 시점의 정답인 to에 해당하는 확률을 높이고 나머지 단어의 확률을 낮추도록 모델 전체를 갱신한다.

이러한 방식으로 말뭉치 전체를 반복 학습하여 한국어-영어 기계 번역 모델을 성공적으로 학습시킬 수 있다.
트랜스포머 블록(transformer block)

위는 트랜스포머의 인코더 가운데 반복되는 요소를 떼어내 나타낸 것이다. 트랜스포머의 인코더는 블록 수십 개를 쌓아서 구성한다.
인코더 블록은 멀티 헤드 어텐션(multi-head attention), 피드포워드 뉴럴네트워크(feed forward neural network), 잔차 연결(residual connxtion) 및 레이어 정규화(layer normalization)등의 요소로 구성되어 있다.
디코더는 멀티 헤드 어텐션이 인코더와 조금 다르다. 마스크를 적용한 멀티 헤드 어텐션 부분과, 인코더가 보내 온 정보와 디코더 입력을 함께 받아 멀티 헤드 어텐션을 수행하는 모듈이 추가됐다는 차이가 있다.

셀프 어텐션(self attention)
우선 어텐션은 시퀀스 요소 중 중요한 요소에는 집중하고, 그렇지 않은 요소는 무시하여 태스크 수행 성능을 끌어올리는 기법이다. 이를 기계 번역에 도입한다면 소스 언어의 단어 시퀀스 가운데 가장 디코딩에 도움이 되는 단어를 위주로 취사선택하는 과정을 생각할 수 있다.
셀프 어텐션은 말 그대로 자기 자신에게 수행하는 어텐션 기법이다.

위의 예시는 '거기'를 셀프어텐션하는 과정이다. 잘 학습된 셀프 어텐션 모델이라면 거기에 대응하는 장소를 카페라고 계산할 수 있을 것이다. 그뿐만 아니라, 갔었어라는 단어와도 연관이 있기 때문에 트랜스포머 인코더 블록 내부에서는 관련 있는 단어의 의미를 강조해서 반영한다.

이 예시는 카페라는 단어가 해당 입력 시퀀스에서 어떤 의미를 가지는지 계산하는 상황이다. 트랜스포머 인코더 블록은 카페라는 단어를 인코딩할 때 거기, 갔었어라는 단어의 의미를 다른 단어들보다 더 강하게 반영한다.
셀프어텐션은 개별 단어와 전체 입력 시퀀스를 대상으로 어텐션 계산을 수행해 문맥 전체를 고려한다. 또, 모든 경우의 수를 고려하기 때문에 시퀀스의 길이가 길어지더라도 정보를 잊거나 왜곡할 염려가 없다.
셀프 어텐션은 쿼리, 키, 밸류의 세 가지 요소가 서로 영향을 구조 받는 구조를 가진다.
- 쿼리(Query):
- 쿼리 벡터는 현재 위치의 단어에 대한 정보를 담는다.
- 이 벡터는 입력 시퀀스의 각 단어를 나타내며, 단어의 의미나 특징을 인코딩한다.
- 예를 들어, "I love natural language processing"라는 문장에서 "love"라는 단어에 대한 쿼리 벡터는 해당 단어의 의미와 주변 단어들과의 관계를 포함한다.
- 키(Key):
- 키 벡터는 다른 단어들과의 관련성을 측정하는 데 사용된다.
- 각 단어에 대한 키 벡터는 해당 단어와 다른 모든 단어 간의 상호 작용을 나타낸다.
- "love"라는 단어의 키 벡터는 "I", "natural", "language", "processing" 등 다른 단어들과의 관계를 표현한다.
- 밸류(Value):
- 밸류 벡터는 입력 시퀀스의 각 단어에 대한 정보를 담고 있다.
- 이 정보는 주로 해당 단어의 의미나 특징을 나타낸다.
- 예를 들어, "love"라는 단어의 밸류 벡터는 해당 단어의 의미를 인코딩한다.
우선, 트랜스포머 블록 내에는 문장 내 각 단어가 벡터 형태로 입력된다. 각 단어 벡터는 블록 내에서 어떤 계산 과정을 거쳐 쿼리, 키, 밸류 3가지로 변환된다. 만약 트랜스포머 블록에 입력되는 문장이 6개의 단어로 구성돼 있다면 이 블록의 셀프 어텐션 계산 대상은 쿼리 벡터 6개, 키 벡터 6개, 밸류 벡터 6개 등 총 18개가 된다.

셀프 어텐션은 쿼리 단어 각각을 대상으로 모든 키 단어와 얼마나 유기적인 관계를 맺는지를 확률값으로 나타낸다. 모든 확률값의 합은 1로, 카페라는 쿼리 단어와 가장 관련이 높은 키 단어는 0.4의 값을 가지는 거기가 된다.
셀프 어텐션은 밸류 벡터들을 가중합하는 방식으로 계산을 마무리한다. 새롭게 만들어지는 카페 벡터는 아래와 같은 수식으로 완성될 수 있다.
$$ Z_카페 = 0.1*V_어제 + 0.1*V_카페 + 0.2*V_갔었어 + 0.4*V_거기 + 0.1*V_사람 + 0.1*V_많더라 $$
이와 같은 방식으로 나머지 단어들도 셀프 어텐션을 수행하면 전체 시퀀스를 대상으로 셀프 어텐션 계산이 끝나게 된다.
모델 입력과 출력
모델의 입력을 만드는 계층을 입력층(input layer)이라고 한다. 인코더 입력은 소스 시퀀스의 입력 임베딩에 위치 정보(positional encoding)를 더해서 만든다.

입력 임베딩에 더하는 위치 정보는 해당 토큰이 문장 내에서 몇 번째 위치인지를 나타낸다. 예를 들어, 소스 언어의 토큰 시퀀스가 어제, 카페, 갔었어라면 어제는 첫 번째, 카페는 두 번째, 갔었어는 세 번째 인덱스를 가진다.
입코더가 이러한 방식으로 소스 언어의 토큰 인덱스 시퀀스를 이에 대응하는 벡터 시퀀스로 변환해 인코더 입력을 만든다. 디코더 입력 역시 만드는 방식이 동일하다.
아래 그림은 트랜스포머의 인코더와 디코더 블록만을 떼어낸 것이다.

인코더 입력층에서 만들어진 벡터 시퀀스가 최초 인코더 블록의 입력이 되며, 그 출력 벡터 시퀀스다 다음 인코더 블록의 입력이 된다.
마찬가지로 디코더 입력층에서 만들어진 벡터 시퀀스는 최초 디코더 블록의 입력이 되며, 출력 벡터 시퀀스가 두 번째 디코더 블록의 입력이 된다. 이전 블록의 출력이 다음 블록의 입력이 되는 과정은 트랜스포머의 구조에 따라 N번 반복된다.
출력층의 출력은 타깃 언어의 어휘 수만큼의 차원을 갖는 벡터가 된다. 만약 타깃 언어의 어휘가 총 3만개라고 가정하면 출력 벡터의 차원수는 3만이고, 그 요솟값들을 모두 합하면 1이 된다. 이 벡터는 디코더에 입력된 타깃 시퀀스의 다음 토큰 확률 분포를 가리킨다.

셀프 어텐션 내부 동작
(1) 쿼리, 키, 밸류 만들기
인코더에서 수행되는 셀프 어텐션의 입력은 이전 인코더 블록의 출력 벡터 시퀀스이다.
셀프 어텐션은 쿼리, 키, 밸류 3개 요소 사이의 문맥적 관계성을 추출하는 과정이다. 이는 아래와 같은 행렬 곱셈을 통해 수행된다.

여기서 X는 입력 벡터 시퀀스를 의미하고, W_q,k,v 각각은 입력 벡터 시퀀스를 쿼리, 키, 밸류로 만들어 주는 행렬을 의미한다.



위의 수식은 입력 벡터 시퀀스 X를 한번에 쿼리/키/밸류 벡터 시퀀스로 변환하는 과정이다. 실제 벡터 구축 또한 위의 과정과 같이 행렬곱을 통해 이루어지며, 이는 벡터 시퀀스에서 하나식 떼어 결괏값을 만드는 과정과 같은 결과를 가진다.
(2) 첫 번째 쿼리의 셀프 어텐션 출력값 계산하기
아래는 셀프 어텐션을 정의하는 수식이다. 먼저, 쿼리와 키를 행렬곱한 뒤 해당 행렬의 모든 요솟값을 키 차원 수의 제곱근으로 나눠 준다. 그런 다음, 이렇게 나누어진 행렬을 행 단위로 소프트맥스를 취해 스코어 행렬로 만든다. 그 후 이 스코어 행렬에 밸류를 행렬곱을 수행해 주면 셀프 어텐션 계산이 끝나게 된다.

먼저, 쿼리 만들기를 수행하여 나온 벡터 3개 가운데 첫 번째 쿼리를 통해 예시를 들어보자. 아래는 쿼리의 첫 번째 벡터와 키 벡터의 전치를 행렬곱한 결과이다.
결괏값으로 나온 2, 4, 4는 각각 첫 번째 쿼리 벡터와 첫 번째 키 벡터 사이의 문맥적 관계성이 녹아든 결과, 첫 번째 쿼리 벡터와 두 번째 키 벡터 사이의 문맥적 관계성이 녹아든 결과, 각각 첫 번째 쿼리 벡터와 세 번째 키 벡터 사이의 문맥적 관계성이 녹아든 결과를 의미한다.

이제 이렇게 계산한 결과에 키 벡터의 차원 수의 제곱근으로 나눈 후 소프트맥스를 취하면 아래와 같은 결과가 나온다.

이는 스코어 행렬을 의미하고, 이 스코어 행렬의 밸류를 행렬곱 해 주면 아래와 같이 소프트맥스 벡터의 각 요솟값에 대응하는 밸류 벡터들을 가중합한 결과가 나온다.

(3) 두 번째 쿼리의 셀프 어텐션 출력값 계산하기
(4) 세 번째 쿼리의 셀프 어텐션 출력값 계산하기
두세 번째 쿼리의 셀프 어텐션 출력값도 (2)와 같은 과정으로 진행할 수 있다. 여기서는 자세한 과정을 생략하도록 하겠다.
멀티 헤드 어텐션(multi-head attention)
멀티 헤드 어텐션은 셀프 어텐션을 동시에 여러 번 수행하는 것을 의미한다. 즉, 헤드의 수만큼 어텐션을 병렬로 나누어 계산을 진행한 후, 도출된 Attention Value들을 concatenate하여 하나로 합친다.
예를 들어, 총 2개의 입력 단어가 3차원의 밸류, 8개의 헤드를 갖고 있는 멀티 헤드 어텐션을 진행한다고 해 보자. 그렇다면 개별 헤드의 셀프 어텐션 수행 결과는 '입력 단어 수 * 밸류 차원 수'인 2*3 행렬을 가진다. 8개의 셀프 어텐션을 수행한 다음 그들을 이어 붙이면 2*24의 행렬이 된다.

위 사진과 같이 셀프 어텐션을 모두 이어 붙인 행렬에 새로운 가중치 행렬을 곱하면 '입력 단어 수 * 목표 차원 수'가 된다. 여기서 가중치 행렬은 w_q, w_k, w_v와 같이 학습이 진행됨에 따라 학습 데이터에 맞춰 조정된다.
인코더에서 진행하는 셀프 어텐션
아래 그림은 트랜스포머의 인코더 블록을 나타낸 것이다. 여기서 붉은색 실선은 이전 블록의 단어 벡터 시퀀스, 즉 입력을 의미하고 녹색 실선은 블록 수행 결과로 도출된 단어 벡터 시퀀스, 즉 출력을 의미한다.

쿼리, 키, 밸류는 모두 소스 시퀀스와 관련된 정보이기 때문에, 만약 한국어->영어로 번역하는 태스크라면 이의 쿼리, 키, 밸류는 모두 한국어가 된다.
아래의 예시를 토대로 셀프 어텐션을 살펴 보자. 만약 쿼리를 '어제'라고 하면 과거 시제를 포함하는 갔었어와 많더라가 높은 확률값을 가질 것이다.
이는 모든 단어를 쿼리로 설정하여 계산하게 되고, 각 쿼리별로 확률과 밸류 벡터를 가중합하여 셀프 어텐션을 마치게 된다.

디코더에서 수행하는 셀프 어텐션
다음은 인코더, 디코더 블록을 모두 나타낸 그림이다. 붉은색 실선은 인코더 마지막 블록에서 나온 소스 단어 벡터 시퀀스를 의미하고, 파란색 실선은 이전 디코더 블록의 수행 결과로 도출된 타깃 단어 벡터 시퀀스를 의미한다.

우선 디코더에서는 마스크 멀티 헤드 어텐션(masked multi-head attention)을 통해 셀프 어텐션을 수행한다. 이는 타깃 언어의 단어 벡터 시퀀스를 계산 대상으로 한다.
여기서는 대상이 타깃 언어로 바뀌었을 뿐, 어텐션 수행 과정은 인코더와 다르지 않다.
아래 예시에서도 볼 수 있듯이 쿼리가 cafe라면 장소를 지칭하는 대명사인 there가 가장 높은 값을 지니는 것을 알 수 있다.

다음으로는 인코더와 디코더의 정보를 모두 활용하여 멀티 헤드 어텐션을 수행한다.
인코더에서는 어제 카페 갔었어 거기 사람 많더라의 단어 벡터 시퀀스를 넘기고, 디코더 직전 블록에서는 <s> I went to the cafe yesterday There의 단어 벡터 시퀀스를 넘긴다.
만약 학습이 잘 진행되었다면, 아래와 같이 타깃 언어 문장의 쿼리와 소스 언어 문장의 키가 잘 매칭될수록 높은 확률값을 지니게 된다.

트랜스포머 모델의 최종 출력은 타깃 시퀀스 각각에 대한 확률 분포이다. 즉, 모델이 한국어를 영어로 번역하는 태스크를 수행하고 있다면
영어 문장의 다음 단어로 어떤 것이 적절할지에 관한확률을 출력하는 것이다.
하지만 학습 과정에서 모델이 이번에 맞혀야 할 정답을 미리 알려주게 되면 학습의 의미가 사라진다. 그렇기 때문에 디코더에서는 정답을 포함한 타깃 시퀀스의 미래 정보를 셀프 어텐션 계산에서 제외한다. 이를 마스킹이라고 한다.

정확하게는 타깃 시퀀스에 대한 마스크 멀티 헤드 어텐션을 계산할 때, 제외 대상 단어들의 소프트맥스 확률이 0이 되도록 하여 멀티 헤드 어텐션에서도 해당 단어 정보들이 무시되게 하는 방식으로 수행된다.
모델이 I라는 단어를 맞힐 차례이면, 트랜스포머 모델은 앞서 설명한 것과 같이 정답 I에 관한 확률은 높이고 다른 단어들의 확률은 낮아지도록 한다.

트랜스포머 모델은 이런 방식을 통해 말뭉치 전체를 훑어 가면서 반복 학습한다.
인퍼런스 과정
트랜스포머 모델의 학습이 끝나면, 학습을 마친 모델은 다음의 과정을 통해 기계 번역을 수행(인퍼런스)한다.
1. 소스 언어(한국어) 문장을 인코더에 입력해 마지막 블록의 단어 시퀀스를 추출한다.
2. 인코더에서 넘어온 소스 언어 문장 정보와 디코더에 타깃 문장 시작을 알리는 <s> 토큰을 넣어 타깃 언어(영어)의 첫 번째 토큰을 생성한다.
3. 인코더 쪽에서 넘어온 소스 언어 문장 정보와 이전에 생성된 타깃 언어 토큰 시퀀스를 디코더에 넣어 만든 정보로 타깃 언어의 다음 토큰을 생성한다.
4. 생성된 문장 길이가 충분하거나 문장 끝을 알리는 </s>가 나올 때까지 3.을 반복한다.
'ai - study' 카테고리의 다른 글
[Do It! 자연어 처리] Chapter 04 - 문서에 꼬리표 달기 (0) | 2024.04.03 |
---|---|
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 下 (0) | 2024.04.01 |
[Do It! 자연어 처리] Chapter 02 - 문장을 작은 단위로 쪼개기 (3) | 2024.03.18 |
[Do It! 자연어 처리] Chapter 01 - 처음 만나는 자연어 처리 (0) | 2024.03.13 |
[혼공머신] Chapter 07, 08, 09 딥러닝 (0) | 2024.03.13 |