본문 바로가기

Bert와 GPT

1장. 처음 만나는 자연어 처리

 

모델은 어떤 입력을 받아 어떤 처리를 수행하는 함수 입니다.

즉, 모델은 어떤 입력을 받아서 해당 입력이 특정 범주일 확률을 반환하는 확률 함수 입니다.

 

딥러닝이란, 데이터 패턴을 스스로 익히는 인공지능의 한 갈래 입니다. 

여기에서 딥(deep)이란 많은 은닉층을 사용한다는 의미 입니다.

 

딥러닝 기반 자연어 처리 모델의 예시로는 Bert와 GPT 등이 있습니다.

 

학습이란, 출력이 정답에 가까워지도록 모델을 업데이트 하는 과정을 말합니다.

 

사람이 만든 정답 데이터로 모델을 학습하는 방법을 '지도학습(supervised learning)' 이라고 합니다.

데이터 내에서 정답을 만들고 이를 바탕으로 모델을 학습하는 방법을 '자기지도 학습(self-supervised learning)' 이라고 합니다.

 

트랜스퍼 러닝(transfer learning)이란, 특정 태스크를 학습한 모델을 다른 태스트 수행엣 재사용하는 기법을 가리킵니다.

트랜스퍼 러닝을 적용하면 기존보다 모델의 학습 속도가 빨라지고 새로운 태스크를 더 잘 수행하는 경향이 있습니다.

 

업스트림 태스크로는 '다음 단어 맞히기' , '빈칸 채우기'등의 대규모 말뭉치의 문맥을 이해하는 과제이며, 

다운스트림태스크'문서분류', '개체명 인식' 등 풀고자 하는 자연어 처리의 구체적인 문제들 입니다.

 

다운스트림 태스크의 본질'분류(classification)' 입니다.

이 책에서 설명하는 다운스트림 태스크의 학습 방식은 모두 '파인 튜닝(fine tuning)' 입니다.

'파인 튜닝(fine tuning)'은 프리트레인을 마친 모델을 다운스트림 태스크에 맞게 업데이트하는 기법입니다.

 

'문서 분류 모델'은 자연어(문서나 문장)를 입력받아 해당 입력이 어떤 범주(긍정, 중립, 부정 따위에 속하는지 그 확률값을 반환합니다.

'자연어 추론 모델'은 문장 2개를 입력 받아 두 문장 사이의 관계가 참, 거짓, 중립 등 어떤 범주인지 그 확률값을 반환합니다.

'개체명 인식 모델'은 자연어(문서나 문장)를 입력받아 단어별로 기관명, 인명, 지명 등 어떤 개체명 범주에 속하는지 그 확률값을 반환합니다.

'질의 응답 모델'은 자연어(질문+지문)를 입력받아 각 단어가 정답의 시작일 확률값과 끝일 확률값을 반환합니다.

'문장 생성 모델'은 GPT 계열 언어 모델이 널리 쓰이며, 자연어(문장)를 입력받아 어휘 전체에 대한 확률값을 반환합니다. 

(이 확률값은 입력된 문장 다음에 올 단어로 얼마나 적절한지를 나타내는 점수 입니다.)

 

'학습 파이프라인 소개'

모델 학습의 전체 파이프라인은 5개 과제인 '문서분류', '개체명 인식', '질의 응답', '문서검색' '문장생성'에 상관없이 공통으로 적용됩니다.

1. 각종 설정값 정하기 (하이퍼파라미터- 러닝레이트(learning rate), 배치크기(batch size) 등)..)

2. 데이터 내려받기

3. 프리트레인을 마친 모델 준비하기

4. 토크나이저 준비하기

5. 데이터 로더 준비하기

6. 태스크 정의하기

7. 모델 학습하기

 

2. 데이터 내려받기

다음 코드는 downstream_corpos_name에 해당하는 말뭉치를 내려받아 downstream_corpus_root_dir 아래에 저장합니다.

또한, 코포라(Korpora)라는 오픈소프 파이썬 패키지를 사용합니다.

from Korpora import Korpora
Korpora.fetch(
	corpus_name = args.downstream_corpus_name,
	root_dir = args.downstream_corpus_root_dir,
	force_download = True,
)

 

 

3. 프리트레인을 마친 모델 준비하기

다음 코드는 이준범 님이 허깅페이스 모델 허브에 등록한 kcbert-base 모델을 준비하는 코드입니다.

앞서 데이터 내려받기에서 args.pretrained_model_name에 beomi/kcbert-base라고 선언해 뒀으므로 

차례로 실행하면 kcbert-base 모델을 쓸 수 있는 상태가 됩니다.

from transformers import BertConfig, BertForSequenceClassification
pretained_model_config = BertConfig.from_pretrained(
	args.pretrained_model_name,
	num_labels=2,
)

model = BertForSequenceClassification.from_pretrained(
	args.pretrained_model_name,
	config = pretrained_model_config,
)

 

4. 토크나이저 준비하기

자연어 처리 모델의 입력은 대개 '토큰(Token)' 입니다. 

토큰 분리 기준은 그때그때 다를 수 있습니다. 문장을 띄어쓰기만으로 나눌 수도 있고, 의미의 최소 단위인 '형태소' 단위로 나눌수도 있습니다.

문장을 '토큰 시퀀스'로 분석하는 과정을 '토큰화', 

토큰화를 수행하는 프로그램을 '토크나이저'라고 합니다.

 

다음 코드는 kcbert-base 모델이 사용하는 토크나이저를 준비하는 코드입니다. 이 역시 토크나이저 관련 파일이 로컬저장소에 없으면 자동으로 내려받고, 있으면 캐시에서 읽어옵니다.

from transfomers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(
	args.pretrained_model_name,
	do_lower_case = False,
)

 

5. 데이터 로더 준비하기 

'파이토치(PyTorch)'는 딥러닝 모델의 학습을 지원하는 파이썬 라이브러리 입니다. 

파이토치에는 '데이터 로더(DataLoader)라는게 포함돼 있습니다. 

파이토치로 딥러닝 모델을 만들려면 이 데이터 로더를 반드시 정의해야 합니다.

 

데이터 로더는 데이터를 '배치(batch)' 단위로 모델에 밀어 넣어주는 역할을 합니다.

전체 데이터 가운데 일부 인스턴스를  뽑아 배치룰 구성합니다.

'데이터셋'은 데이터 로더의 구성 요소 가운데 하나입니다.

 

배치는 그 모양이 고정적이어야 할 때가 많으며 동일한 배치에 있는 문장들의 토큰(input_ids) 개수가 같아야 합니다.

배치의 모양 등을 정비해 모델의 최종 입력으로 만들어주는 과정을 '컬러이트(collate)'라고 합니다.

컬레이트 과정에는 파이썬 리스트(list)에서 파이토치 텐서(tensor)로의 변환 등 자료형 변환도 포함됩니다.

 

from torch.utils.data import DataLoader, RandomSampler
from ratsnlp.nlpbook.classification import NsmcCorpus, ClassificationDataset
corpus = NsmcCorpus()
train_dataset = ClassificationDataset(
	args = args,
    corpus = corpus,
    tokenizer = tokenizer,
    mode = "train",
)

train_dataloader = DataLoader(
	train_dataset,
    batch_size = args.batch_size,
    sampler = RandomSampler(train_dataset, replacement = False),
    collate_fn = nlpbook. data_collator,
    drop_last = False,
    num_workers = args.cpu_workers,
)

 

자연어 처리 모델의 입력은 토큰 시퀀스로 분석된 자연어 입니다.

하지만 더 정확하게는 각 토큰이 그에 해당하는 '정수(Integer)'로 변환된 형태입니다.

각 토큰을 그에 해당하는 정수로 변환하는 과정을 인덱싱(indexing) 이라고 합니다.

 

6. 태스크 정의하기

모델 학습을 할 때 '파이토치 라이트닝(PyTorch lightning)' 이라는 라이브러리를 사용합니다.

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

우리는 모델의 출력과 정답 사이의 차이를 작게 만드는데 관심이 있습니다.

이를 위해 옵티마이저(Optimizer), 러닝 레이트 스케줄러(Learning rate scheduler) 등을 정의해둡니다.

 

모델 학습은 배치 단위로 이뤄집니다. 배치를 모델에 입력한 뒤 모델 출력을 정답과 비교해 차이를 계산합니다.

이후 그 차이를 최소화하는 방향으로 모델을 업데이트합니다. 이 일련의 순환과정을 '스텝(step)' 이라고 합니다.

 

7. 모델 학습하기

'트레이너(trainer)'는 파이토리 라이트닝에서 제공하는 객체로 실제 학습을 수행합니다.

이 트레이너는 GPU 등 하드웨어 설정, 학습 기록 로깅, 체크포인트 저장 등 복잡한 설정들을 알아서 해줍니다.

 

다음 코드는 문서 분류 모델을 학습하는 예시입니다. 태스트와 트레이너를 정의한 다음, 앞서 준비한 데이터 로더를 가지고 fit() 함수를 호출하면 학습을 시작합니다.

 

[ 문서분류모델 학습 코드 ]

from ratsnlp.nlpbook.classification import ClassificationTask
task = ClassificationTask(model, args)
trainer = nlpbook.get_trainter(args)
trainer.fit(
	task,
	train_dataloader = train_dataloader,
)

 

 

개발 환경 설정

코랩(Colab)은 'Colaboratory'의 준말로 구글에서 서비스하는 가상 컴퓨팅 환경입니다.

코랩을 사용하면 누구나 크롬 등 웹 브라우저에서 파이썬 코드를 작성하고 실행할 수 있습니다.

GPU는 물론 TPU학습도 할 수 있습니다.

 

코랩의 장점

- 운영체제 설치, 의존성 있는 소프트웨어 설치 등 환경 구축을 별도로 할 필요가 없어서 컴퓨팅 자원이 부족하거나 

- 개발환경 설정에 어려움이 있는 사람도 유용하게 사용할 수 있습니다.

- 코랩을 유료계정으로 사용한다면 좀더 나은 GPU를 할당받는 등의 혜택이 있습니다.

 

코랩 활용

- 파이썬 명령어를 입력하고 Ctrl + Enter (맥은 Command + Enter)를 누르면 실행 결과가 출력됩니다.

- 명령어 맨 앞에 '!'를 입력한 뒤 실행하면 해당 명령어가 대시 셸(dash shell)에서 실행됩니다. (이러한 방식으로 의존성 있는 파이썬 패키지도 설치할 수 있습니다.)

 

코랩 구글드라이브와 연결하기

- 코랩 노트북에서 아무것도 실행하지 않은 채로 일정 시간이 흐르면 해당 노트가 초기화됩니다.

- 중간 결과물을 어딘가에 저장해두는 것이 좋습니다.

 

다음 코드를 실행하여 구글 드라이브와 연결해봅니다.

from google.colab import drive
drive.mount('/gdrive', force_remount = True)

- 실행 결과로 출력된 링크를 클릭한 후 구글 아이디로 로그인 하고 <허용>을 누르면 인증 코드가 나타납니다.

- 인증코드 붙여넣으면 코랩 노트북이 자신의 구글 드라이브에 접근할 수 있게 됩니다.

- 이 모든 과정을 거쳐 성공적으로 연동죄면 'Mounted at / gdrive' 라는 메시지가 출력됩니다.

 

[ 구글 드라이브에 파일 쓰기 ]

with open('/gdrive/My Drive/test.txt', 'w') as f:
	f.writelines("test")

 

코랩 노트북 복사하기

코랩 노트북을 복사해 내 것으로 만들면 실행하거나 내용을 고칠 수가 있습니다.

- 실습에서 제공하는 코랩 노트북 링크를 클릭한 후 자신의 구글 아이디로 로그인합니다.

- [드라이브 복사]를 누르면 코랩 노트북이 자신의 드라이브에 복사됩니다.

- 별도로 설정하지 않았다면 해당 노트북은 '내 드라이브/Colab Notebooks' 디렉터리에 담깁니다.

 

학습에 도움될만한 참고 자료

- 모두를 위한 딥러닝 시즌 2 - PyTorch:

deeplearningzerotoall.github.io/season2/lec_pytorch.html

- 파이토치 한국어 공식 튜토리얼

tutorials.pytorch.kr

- Do it! 딥러닝 입문 책 

- 밑바닥부터 시작하는 딥러닝 책 

 

[출처: 책 Do it! BERT와 GPT로 배우는 자연어 처리 트랜스포머 핵심 원리와 허깅페이스 패키지 활용법 ]

 

 

'Bert와 GPT' 카테고리의 다른 글

2장. 문장을 작은 단위로 쪼개기  (0) 2022.04.20