본문 바로가기
CS/MachineLearning

BERT와 GPT로 배우는 자연어 처리

by Diligejy 2023. 3. 26.

p.3

핵심만 알면 길을 잃지 않을 수 있습니다. 2020년 전후 자연어 처리 분야에서 기술 발전을 이끈 방아쇠는 두 개입니다. 하나는 트랜스포머(Transformer), 다른 하나는 전이 학습(transfer learning)이라는 기법입니다.

 

p.18

다음 단어 맞히기로 업스트림 태스크를 수행한 모델을 언어 모델(language model)이라고 합니다.

 

p.19

빈칸 채우기로 업스트림 태스크를 수행한 모델을 마스크 언어 모델(masked language model)이라고 합니다.

 

p.20

사람이 만든 정답 데이터로 모델을 학습하는 방법을 지도 학습이라고 합니다. 이 방식은 데이터를 만드는 데 비용이 많이 들뿐만 아니라 사람이 실수로 잘못된 레이블을 줄 수도 있습니다.

 

이에 반해 다음 단어 맞히기, 빈칸 채우기 같은 업스트림 태스크는 강력한 힘을 지닙니다. 뉴스, 웹 문서, 백과사전 등 글만 있으면 수작업 없이도 다량의 학습 데이터를 아주 싼값에 만들어 낼 수 있습니다. 덕분에 업스트림 태스크를 수행한 모델은 성능이 기존보다 월등히 좋아졌습니다. 이처럼 데이터 내에서 정답을 만들고 이를 바탕으로 모델을 학습하는 방법을 자기지도학습(self-supervised learning)이라고 합니다.

 

p.24

파인튜닝 이외의 방식이 주목받고 있는 이유는 비용과 성능 때문입니다. 최근 언어 모델의 크기가 기하급수로 커지고 있는데요. 파인튜닝 방식으로 모델 전체를 업데이트하려면 많은 비용이 듭니다. 그 뿐만 아니라 프롬프트 튜닝, 인컨텍스트 러닝으로 학습한 모델이 경쟁력 있는 태스크 수행 성능을 보일 때가 많습니다. 

 

p.27

미국 자연어 처리 기업 허깅페이스(huggingface)에서 만든 트랜스포머(transformers)라는 오픈소스 파이썬 패키지에 주목해야 합니다. 이 책에서는 BERT, GPT 가틍ㄴ 트랜스포머 계열 모델로 실습을 진행하는데, 이 패키지를 쓰면 단 몇 줄만으로 모델을 사용할 수 있습니다.

 

p.27~28

자연어 처리 모델의 입력은 대개 토큰(token)입니다. 여기서 토큰이란 문장(sentence)보다 작은 단위입니다. 한 문장은 여러 개의 토큰으로 구성됩니다. 토큰 분리 기준은 그때그때 다를 수 있습니다. 문장을 띄어쓰기만으로 나눌 수도 있고, 의미의 최소 단위인 형태소(morpheme) 단위로 나눌 수도 있습니다.

 

문장을 토큰 시퀀스(token sequence)로 분석하는 과정을 토큰화(tokenization), 토큰화를 수행하는 프로그램을 토크나이저(tokenizer)라고 합니다. 

 

p.28

파이토치에는 데이터 로더(DataLoader)라는 게 포함돼 있습니다. 파이토치로 딥러닝 모델을 만들려면 이 데이터로더를 반드시 정의해야 합니다.

 

데이터 로더는 데이터를 배치(batch) 단위로 모델에 밀어 넣어주는 역할을 합니다. 전체 데이터 가운데 일부 인스턴스를 뽑아 배치를 구성합니다. 데이터셋은 데이터 로더의 구성 요소 가운데 하나입니다. 데이터셋은 여러 인스턴스(문서+레이블)를 보유하고 있습니다. 

 

p.30

배치의 모양 등을 정비해 모델의 최종 입력으로 만들어 주는 과정을 컬레이트(collate)라고 합니다. 컬레이트 과정에는 파이썬 리스트(list)에서 파이토치 텐서(tensor)로 변환 등 자료형 변환도 포함됩니다. 컬레이트 수행 방식 역시 파이토치 사용자가 자유롭게 구성할 수 있습니다.

 

p.30

파이토치 라이트닝은 딥러닝 모델을 학습할 때 반복적인 내용을 대신 수행해줘 사용자가 모델 구축에만 신경쓸 수 있도록 돕는 라이브러리입니다.

 

p.65-66

언어모델(Language Model)이란 단어 시퀀스에 확률을 부여하는 모델입니다. 다시 말해 단어 시퀀스를 입력받아 해당 시퀀스가 얼마나 그럴듯한지 확률을 출력하는 모델입니다. 따라서 한국어 말뭉치로 학습한 언어 모델은 자연스러운 한국어 문장에 높은 확률값을 부여합니다. 어떤 문장이 한국어스러운지 해당 모델이 이해하고 있다는 것이죠.

 

"언어 모델이란 단어 시퀀스에 확률을 부여하는 모델이다."

 

문장에서 i번째로 등장하는 단어를 w_i로 표시한다면 n개 단어로 구성된 문장이 해당 언어에서 등장할 확률, 즉 언어 모델의 출력은 다음 수식처럼 쓸 수 있습니다. 이 수식은 n개 단어가 동시에 나타날 결합 확률(joint probability)을 의미합니다. 잘 학습된 하눅ㄱ어 모델이 있다면 P(무모, 운전) 보다는 P(난폭, 운전)이 큰 확률값을 지닐 겁니다.

 

P(w_1, w_2, w_3, w_4, ..., w_n)

 

그렇다면 난폭이 나타난 다음에 운전이 나타날 확률은 어떻게 정의할까요? 이러한 확률을 조건부확률(conditional probability)이라고 하는데요. 다음 수식과 같이 정의합니다. 

 

P(운전 | 난폭) = P(난폭, 운전) / P(난폭)

 

조건부 확률을 표기할 때 결과가 되는 사건(운전)을 앞에, 조건이 되는 사건(난폭)을 뒤에 씁니다. 조건이 되는 사건이 우변 분자의 일부, 그리고 우변 분모를 구성하고 있음을 볼 수 있는데요. 이는 결과가 되는 사건(운전)은 조건이 되는 사건(난폭)의 영향을 받아 변한다는 개념을 내포하고 있습니다. 그도 그럴 것이 앞선 단어가 난폭이라면 다음 단어로 어떤 것이 자연스러울지 그 선택지가 확 줄어들겠죠.

 

결합 확률과 조건부 확률 사이에는 밀접한 관련이 있습니다. 조건부 확률의 정의에 따라 단어 3개가 동시에 등장할 결합 확률을 수식으로 나타내면 다음과 같습니다.

 

P(w_1, w_2, w_3) = P(w_1) * P(w_2 | w_1) * P(w_3 | w_1, w_2)

 

조건부 확률의 정의에 따라 우변을 쭉 펼쳐 계산해보면 좌변과 같습니다. 이를 직관적으로 곱씹어 보면, 단어 3개로 구성된 문장이 나타나려면 (즉, 단어 3개가 동시에 등장하려면) 다음 3가지 사건(event)이 동시에 일어나야 한다는 말이 됩니다.

 

- 첫 번째 단어(w_1) 등장

- 첫 번째 단어 등장(w_1) 후 두 번째 단어(w_2) 등장

- 첫 번째 단어(w_1)와 두 번째 단어 등장(w_2) 후 세 번째 단어(w_3) 등장

 

이로부터 언어모델을 조건부 확률 개념으로 다시 쓰면 다음 수식과 같습니다. 

 

요약하면 전체 단어 시퀀스가 나타날 확률(좌변)은 이전 단어들이 주어졌을 때 다음 단어가 등장할 확률의 연쇄(우변)와 같다는 이야기입니다. 이 때문에 언어 모델을 이전 단어들이 주어졌을 때 다음 단어가 나타날 확률을 부여하는 모델이라고 정의하기도 합니다.

 

 

p.67

우리는 임의의 단어 시퀀스가 해당 언어에서 얼마나 자연스러운지 이해하고 있는 언어 모델을 구축하려고 합니다. 그런데 조건부 확률의 정의에 따라 좌변과 우변이 같다는 사실을 알고 있으므로 언어 모델의 학습 방식을 이전 단어들(컨텍스트)이 주어졌을 때 다음 단어 맞히기로 정해도 목표를 달성할 수 있습니다.

 

다음 그림은 학습 말뭉치가 어제 카페 갔었어 거기 사람 많더라 라는 문장 하나일 때 언어 모델이 계산하는 대상을 나타낸 것입니다. 검은색 단어는 컨텍스트, 주황색 단어는 맞혀야 할 다음 단어를 의미합니다. 이처럼 문장 앞부터 뒤로, 사람이 이해하는 순서대로 계산하는 모델을 순방향 언어 모델(forward language model)이라고 합니다. GPT, ELMo같은 모델이 이런 방식으로 프리트레인을 수행합니다.

 

 

p.72-73

트랜스포머란 기계 번역 등 시퀀스-투-시퀀스 과제를 수행하는 모델입니다. 여기에서 시퀀스란 단어 같은 무언가의 나열을 의미하는데요. 시퀀스-투-시퀀스는 특정 속성을 지닌 시퀀스를 다른 속성의 시퀀스로 변환하는 작업을 가리킵니다.

 

"시퀀스-투-시퀀스란, 특정 속성을 지닌 시퀀스를 다른 속성의 시퀀스로 변환하는 작업이다."

 

기계 번역을 예시로 시퀀스-투-시퀀스가 어떤 태스크인지 알아봅시다. 기계 번역이란 어떤 언어(source language)와 토큰 시퀀스를 다른 언어(target language)의 토큰 시퀀스로 변환하는 과제입니다. 

 

자세히 살펴보면 소스 시퀀스의 길이(토큰 6개)와 타깃 시퀀스의 길이(10개)가 다르다는 점을 알 수 있습니다. 이처럼 시퀀스-투-시퀀스 태스크는 소스와 타깃의 길이가 달라도 해당 과제를 수행하는 데 문제가 없어야 합니다.

 

p.75

트랜스포머의 학습은 인코더와 디코더 입력이 주어졌을 때 정답에 해당하는 단어의 확률을 높이는 방식으로 수행됩니다. 

 

p.78

트랜스포머 경쟁력의 원천은 셀프 어텐션에 있다고들 하는데요, 여기서는 셀프 어텐션을 좀 더 살펴보겠습니다.

 

우선 어텐션은 시퀀스 입력에 수행하는 기계학습 방법의 일종인데요. 어텐션은 시퀀스 요소 가운데 중요한 요소에 집중하고 그렇지 않은 요소는 무시해 태스크 수행 성능을 끌어올립니다. 어텐션은 기계번역과제에 처음 도입됐습니다.

 

"어텐션은 중요한 요소에 더 집중해 성능을 끌어올리는 기법이다."

 

기계 번역에 어텐션을 도입한다면 타깃 단어를 디코딩할 때 소스 언어의 단어 시퀀스 가운데 디코딩에 도움이 되는 단어 위주로 취사선택해서 번역 품질을 끌어올리게 됩니다. 즉, 어텐션은 디코딩할 때 소스 시퀀스 가운데 중요한 요소만 추립니다.

 

셀프 어텐션이란, 말 그대로 자신에게 수행하는 어텐션 기법입니다. 입력 시퀀스 가운데 태스크 수행에 의미있는 요소들 위주로 정보를 추출한다는 뜻이죠. 

댓글