트랜스포머(Transformer)의 구조는 2017년 최초로 소개되고, 초기 연구 목적은 기계 번역이었다. 대표적인 Transformer 모델로는 우리가 잘 알고 있는 GPT, BERT, GPT-2, GPT-3 등이 있다. 이 모델들의 공통점은 최초의 사전 학습(pre-trained)된 트랜스포머 모델로, 이후 다양하고 특정 영역의 NLP 태스크를 수행하기 위해 미세 조정(fine-tuning) 되기 시작했다는 점이다. 이를 일컬어서 사전 학습 모델이라고 하는데 크게 3가지 범주로 구분한다.
언어 모델
GPT-like 모델(auto-regressive Transformer model)
BERT-like 모델(auto-encoding Transformer model)
BART/T5-like 모델(__seq-to-seq Transformer model)
이 트랜스포머 모델은 언어 모델(language model)로 학습되었다. 이는 그 모델들이 자가 지도(self-supervised) 학습 방식으로 원시 텍스트를 학습했음을 의미한다.
cf) 자가학습* : 목적 함수가 모델의 입력에서 자동으로 계산되는 학습 유형. (데이터에 레이블을 일일이 지정하지 않아도 됨.)
이러한 유형의 모델은 기존에 학습된 언어에 대해서는 통계적 이해가 가능하지만, 실제 현실의 태스크에서는 그닥 유용하지 않다. 때문에 사전 학습된 언어 모델들은 '전이 학습(transfer learning)'이라는 과정을 꼭 거쳐야 한다. 이 프로세스 동안에는 모델이 주어진 태스크에 대해 supervised 한 방식으로 (사람이 추가한 레이블을 사용) '미세 조정(fine-tuning)'한다.
규모
대부분의 Transformer는 더 개선된 성능을 달성하기 위해 모델의 크기와 사전 훈련된 데이터 양의 크기를 계속해서 늘린다. 하지만 사전 학습된 모델을 학습하기 위해선 그만큼 많은 양의 데이터가 필요하다. 이는 비용적인 측면에서 아주아주 단점이 있는 작업이다. 때문에 최근엔 작은 모델로도 높은 성능을 뽑아낼 수 있는 SLM을 구현하는 서비스도 속속이 등장하고 있다.
사전 학습(pretraining)이 모델을 처음부터 학습하는 작업이라면, 미세 조정(fine-tuning)은 모델이 사전학습 된 후에 수행되는 학습이다. 사전학습은 일반적으로 엄청나게 많은 양의 데이터가 필요하다. 그만큼 데이터 코퍼스(corpus - 말뭉치)의 규모도 커야하며, 학습에도 시간이 오래 걸린다.
반면 미세 조정은 사전 학습된 언어 모델을 두고 '특정 태스크'를 수행하기 위해 '특정 데이터셋'을 사용해 추가학습을 한다. 그렇게 하는 이유는 대규모 말뭉치에서 어느 정도 언어에 대한 이해를 거치고 전분야에 걸쳐서 일반적인 지식을 습득한 모델이 특정 분야에서 특화된 모델로써 사용할 수 있게 하기 위함이다.
사전 학습된 모델 -> 미세 조정된 모델
따라서 모델은 미세 조정 과정이 사전 훈련보다 제약이 적기에 보다 쉽고 빠르게, 비용이 절감한 상태로 학습을 할 수 있다.
Transformer 의 Architecture
Encoder & Decoder
Transformer 모델은 크게 두 개 블록을 구성된다.
인코더 (Encoder) 블록 : 입력에 대한 표현 혹은 특성을 도출한다. 이는 모델이 입력된 값에 대해 이해를 하고 최종 목적 태스크를 위해 입력에 대한 표현 형태를 최적화하는 작업이다.
디코더 (Decoder) 블록 : 디코더는 인코더가 구성한 표현 혹은 특성을 다른 입력과 함께 사용해서 대상 시퀀스(sequence)를 생성한다. 이는 모델이 출력 생성을 최적화하는 작업이다.
이들 각각의 블록은 태스크의 종류에 따라 개별적으로 사용할 수 있다.
1️⃣ 인코더 전용 모델 : 문장 분류(sentence classification) 및 개체명 인식(named-entity recognition)과 같이 입력값에 대한 '분석과 이해'가 필요한 태스크에 적합하다.
2️⃣ 디코더 전용 모델 : 텍스트 생성(text generation) 등과 같은 생성 태스크(generative tasks)에 유리하다.
3️⃣ 인코더 - 디코더 모델 : 번역(translation)이나 요약(summarization)과 같이 입력이 수반되는 생성 태스크(generation tasks)에 적합하다.
어텐션 계층 (attention layer)
Transformer 모델의 가장 중요한 특징은 어텐션 레이어라는 특수 레이어다. 어텐션 계층은 각 단어의 표현을 처리할 때 문장의 특정 단어들에 주의를 기울이고, 나머지는 무시하도록 모델에 지시한다.
Ex) 영어 텍스트를 한국어로 번역할 때.
"You liked the food you ate yesterday"
'like'라는 단어를 번역하기 위해선 'You'에도 주의를 기울여야 한다. (왜? 좋아한 사람이 '너'니깐) 그리고 문장의 나머지 부분은 해당 단어 번역에서 그닥 필요가 없다.
동일한 맥락에서 'ate'를 번역하기 위해선 'yesterday'에 주의를 기울여야 한다. (왜? 먹은 날짜가 '어제'니깐)
더 복잡한 문장이나 문법 규칙을 가진 언어들의 경우, 모델은 개별 단어들을 적절하게 번역하기 위해 해당 단어와 멀리 떨어진 단어에도 주의를 기울여야 한다. 이와 같은 개념은 자연어 관련 태스크 전반에 걸쳐 적용될 수 있다. 단어 자체의 고유한 의미도 있지만 주변 문맥(context)을 고려하는 작업이 어텐션 계층에서 이루어진다.
Cf) 기존의 Transformer 는 원래 기계 번역용이었다?? Transformer는 학습이 진행되는 동안 인코더(encoder)는 입력(특정 언어 구사 문장)을 받고, 디코더(decoder)는 번역하고자 하는 언어로 표기된 동일한 의미의 문장을 받는다. 인코더에서 어텐션 레이어(attention layer)는 문장의 모든 단어에 주의(attention)를 기울인다. 왜냐하면 현재 단어(입력받은)에 대한 번역 결과는 문장에서 해당 단어의 앞부분과 뒷부분의 내용(문맥)에 따라 달라질 수 있기 때문이다.
Cf) 디코더 동작 과정 디코더는 순차적으로 동작한다. 따라서 이미 번역된 문장의 단어들에만, 즉 현재 생성되는 단어 앞의 단어들에만 주의(attention)를 기울일 수 있다.
Ex) 번역 대상(target sentence)의 처음 세 단어를 예측한 경우 - 디코더에 이를 입력. - 인코더의 모든 입력(원본 문장의 모든 단어)를 사용해 네 번째 단어를 예측함.
-> 학습 도중 속도를 높이고자 디코더는 전체 번역 대상(target sentence)를 입력으로 받지만, 미래 단어(현재 디코딩 대상 단어의 이후 단어)를 사용하는 것은 허용되지 않는다. 두 번째 위치의 단어를 예측하고자 할 때, 두 번째 위치의 정답 단어에 바로 접근하면 학습이 제대로 진행되지 않기 때문.
ref) Do it! BERT와 GPT로 배우는 자연어처리
디코더 블록(오른쪽)의 첫 번째 어텐션 계층은 디코더에 대한 모든 입력에 집중한다. 반면 두 번째 어텐션 계층은 인코더의 출력을 입력으로 받아 학습한다. 따라서 현재 단어를 가장 잘 예측하기 위해 전체 입력 문장(소스의 입력 임베딩 / 소스 정보)에 엑세스가 가능하다.
-> 이는 번역 대상의 언어(target language)가 원본 원어(source language)와 비교했을 때 상당히 다른 단어 순서를 지니거나, 문장 표현 문법이 다르거나 해도, 원본 문장의 뒷부분에 나타난 문맥이 현재 단어에 대한 가장 잘된 번역을 결정하는데 유용하다. -> 어텐션 마스크는 인코더/디코더에서 모델이 특정 단어에 주의를 집중하는 것을 방지하는데 사용한다. 그리고 문장을 batch 단위로 일괄 처리할 때 모든 입력(문장)이 동일한 길이가 되기 위해 특수 패딩을 붙이기도 한다,
Pipeline 활용하기
Transformers 라이브러리의 가장 기본 객체는 pipeline() 함수. 특정 모델과 동작에 필요한 전처리 및 후처리 단계를 연결하여 텍스트를 직업 입력하고 이해하기 쉬운 답변을 얻을 수 있다.
from transformers import pipeline
// pipleline의 객체 classifier 생성 후 'sentiment-analysis' 사전 훈련 모델 선택.
// 이후 감정 분석 모델이 다운로드됨과 동시에 캐시됨.
classifier = pipeline('sentiment-analysis')
// 캐시된 모델이 대신 모델을 사용하여 다시 모델을 다운로드 할 필요가 x.
classifier("I've been waiting for this show!!")
// 여러 개의 문장을 동시 입력하는 것도 가능.
classifier(["I've been waiting for this show!!", "But I don't like it"])
파이프라인에서 동작하는 3단계
모델이 이해할 수 있는 형태로 텍스트가 전처리(preprocess)됨.
전처리된 입력 텍스트는 모델에 전달됨.
모델이 예측한 결과는 후처리(post process)를 거쳐 인간이 이해할 수 있는 형태로 변환됨.
Pipeline 소개
1️⃣ Zero - shot 분류
레이블이 지정되지 않은 텍스트를 분류해야 할 때. 텍스트에 주석(annotation)을 새로 추가하는 것은 시간이 많이 소요되고해당 분야의 지식이 요구된다. 이 작업은 실제 프로젝트에서도 흔하게 수행되는데, 해당 분류에 사용할 레이블을 마음대로 지정할 수 있으므로 사전 훈련된 모델의 레이블 집합에 의존할 필요가 없다.
Ex) (긍정, 부정) 분류 -> (교육, 정치, 사업) 분류.
from transformers import pipeline
classifier = pipeline("zero-shot-classification")
classifier(
"This is course about the Transformers library",
new_labels = ["edu", "polit", "busin"],
) // 이후 원하는 레이블 목록에 대한 확률 점수를 직접 반환할 수도 있다.
위와 같은 새로운 레이블 집합으로 문장 분류를 수행할 때, 새로운 데이털르 이용해서 모델을 미세 조정(fine-tuning)할 필요가 없기 때문에, zero-shot 분류라고 한다.
2️⃣ 텍스트 생성
입력으로 특정 프롬프트를 제공하면 모델이 나머지 텍스트를 생성하여 프롬프트를 자동 완성하는 기능. 문자, 카톡 등에서 볼 수 있는 텍스트 예측 기능(predictive text feature)와 유사하다.
from transformers import pipeline
generator = pipeline("text-generation")
generator("In this course, we will teach you how to")
3️⃣ 질의 응답
주어진 문장, 문맥(context) 정보를 사용해 입력 질문에 응답을 제공하는 기능.
from transformers import pipeline
question_answer = pipeline("question-answering")
question_answer(
question = "Where do I work?",
context = "My name is joon_ and I study at KH university in Korea",
)
제공된 context에서 정보를 추출하여 작동한다는 점. 즉, 응답을 새롭게 생성하지는 않는다.
Transformer는 다음에 계속...!
해당 글은 '위키독스 Transformers 강의'와 'Do it! BERT와 GPT로 배우는 자연어처리'를 참고했습니다