Search

Transfer Learning

대분류
인공지능/데이터
소분류
ML/DL 정리 노트
유형
딥 러닝
부유형
NLP Pytorch
주요 레퍼런스
https://www.google.com/url?q=https%3A%2F%2Fhappy-obok.tistory.com%2F23
최종 편집 일시
2025/02/18 05:39
생성 일시
2024/10/11 07:25
13 more properties

Self-supervised Pre-Training Model

transformer의 self-attention block을 기반으로 하는 대표적인 self-supervised pre-training model인 GPT과 BERT에 관해 알아보자.

Self-supervised Learning

Self-supervised learning란, 이는 레이블이 주어지지 않은 데이터를 가지고 사용자가 정한 pretext task를 통해 pre-training을 진행하고, 학습이 완료된 모델을 여러 다른 downstream task에 fine-tuning하여 사용하고자 transfer learning을 수행한다.
Self-supervised learning에서 pre-training을 위해 사용하는 데이터 자체는 레이블이 주어지지 않은 데이터이지만, pretext task을 목표로 pre-training 하는 과정 자체에서는 pretext task의 목적에 맞게 데이터에 레이블을 새롭게 부여하는 방법 등 supervision을 직접 만든다.
다양한 문장으로 이루어진 긴 지문을 가지고 pretext task을 목적으로 pre-training하는 사례를 들면 해당 지문의 일부를 일정 확률에 의해 임의로 마스킹하고, 마스킹된 단어에 원래 어떠한 단어가 들어가야 하는지를 지도학습을 하는 것이다.
또한 지문으로 주어지는 여러 문장 사이의 논리적 관계를 추론하기 위해 모델의 입력 sequence에 문장간의 관계를 예측하기 위한 새로운 token을 하나 추가하여 문장들이 서로 모순인지 아닌지를 지도학습하는 것도 속한다.
Self-supervised learning에서 사용하는 데이터 자체에는 레이블이 처음이 주어지지 않으므로 비지도학습(unsupervised learning)의 일종이라고 대개 말하지만, 사실 모델이 pre-training 과정에서 자신의 pretext task 목적에 맞게 레이블이 부여되지 않은 데이터를 일부 변형 또는 가공하여 스스로 지도학습을 수행한다고 볼 수 있다.
GPT(Generative Pre-trained Transformer)는 테슬라의 창업자인 일론 머스크가 세운 비영리 연구 기관인 openAI에서 나온 모델이며, 최근 GPT-2부터 GPT-3까지 이어지는 모델을 통해 탁월한 자연어 생성 성능을 보이고 있다.

GPT-1 특징

GPT-1은 12개의 transformer block을 사용했으며, encoder 없이 decoder만을 가진다.
또한 transformer block의 masked multi self-attention block에서는 12개의 head를 사용하고, 인코딩 벡터의 차원을 768로 만들어 사용한다.
그리고 활성 함수(Activation Function)으로 GELU를 사용한 점이 특징이다.

GPT-1의 Pre-Training 응용

감정 분석(Sentimental Analysis)

감정 분석(Sentimental analysis)과 같은 classification task를 수행할 경우 어떤 문장이 주어졌을 때 <Start> token을 문장의 맨 앞에 넣고, 마찬가지로 문장이 끝나는 <end> token으로서 좀 더 특별한 역할을 하는 <Extract> token을 문장의 맨 뒤에 붙인다.
그리고 문장을 GPT-1 모델을 통해 인코딩한 후 나온 최종 인코딩 결과에서 <Extract> token에 해당되는 인코딩 벡터를 output layer의 입력 벡터로 넣어줌으로써 문장을 통한 감정 분석 등 분류 작업을 진행할 수 있다.

Entailment Task

또한 전제가 주어지고 이를 통해 주어지는 가설의 참 또는 거짓을 판별하는 entailment task에서도 적용할 수 있다.
"섬 A에는 사슴이 현재 50마리가 산다."라는 문장이 주어졌을 때, "섬 A의 들판에는 현재 50마리를 넘는 사슴이 있을 수가 없다."라는 문장은 참이어야 하는 논리적인 내포관계를 바르게 찾아야 한다.
이러한 task에서는 다수의 문장으로 이루어진 문장을 입력으로 받아 예측을 수행해야 하는데, 이를 위해 GPT-1 모델에서는 여러 문장을 전제와 가설을 이어서 하나의 문장으로 만들되 문장 사이에 <Delimiter>라는 특수 문자인 구분자를 추가한다.
또한 분류 문제와 마찬가지로 문장의 처음과 마지막에는 각각 <Start>와 <Extract> token을 추가한다.
이처럼 합친 문장을 모델에 넣어서 인코딩하여 출력되는 문장에서 <Extract> token에 해당되는 벡터를 output layer에 통과시켜서 주어진 입력 문장이 논리적으로 귀결되는지 아니면 모순되는지를 분류하는 task를 수행할 수 있다.
결국 <Extractor>는 입력으로 주어질 때 마지막으로 추가하는 단순한 token인 것처럼 보이지만, 모델에 통과시켜서 문장을 잘 이해하고 감정 표현을 제대로 내릴 수 있는지 또는 문장 사이의 논리적 관계에 모순이 있는지를 판단할 수 있는 query로 사용되므로 downstream task에 필요로 하는 여러 정보를 주어진 입력 문장으로부터 추출할 수 있다.

Multiple Choice

이외 여러 문장이 존재할 때 두 문장 간의 유사도를 측정하는 similarity task나 다수의 입력 문장에서 주어진 목적에 맞는 가장 적절한 문장을 선택하는 multiple chocie에도 GPT-1 모델을 적용할 수 있다.

BERT

BERT(Bidirectional Encoder Representations from Transformers)는 2018년에 구글이 공개한 사전 훈련된 모델.
BERT는 등장과 동시에 수많은 NLP 테스크에서 최고 성능을 보여주면서 명실공히 NLP의 한 획을 그은 모델로 평가받고 있다.

Transformer 기반의 BERT

BERT는 Transformer의 인코더-디코더 중 인코더만 사용한다.

Pre-Trained Model

그림과 같이 BERT를 이용한 자연어 처리는 2단계로 진행되며 거대 Encoder가 입력 문장들을 임베딩하여 언어를 모델링하는 Pre-training 과정과 이를 Fine-Tuning하여 여러 자연어 처리 Task를 수행하는 과정이다.
BERT는 두 가지 방식의 Pre-Training 구조를 가진다.
Masked Language Model(MLM)
Next Sentence Prediction(NSP)

MLM(Masked Language Model)

입력 문장에서 임의로 토큰을 버리고(Mask), 그 토큰을 맞추는 방식으로 학습을 진행한다.
→ 즉, 단어 단위로 학습하는 모델.

NSP(Next Setence Prediction)

두 문장이 주어졌을 때, 두 문장의 순서를 예측하는 방식이다.
→ 즉, 문장 단위로 학습하는 모델.

BERT: Input(입력)

Token Embedding + Segment Embedding + Position Embedding
[CLS]: 문장 분류를 위한 특수 토큰
[SEP]: 문장 구분을 위한 토큰. 각 문장의 끝에 붙임
Token Embedding
Word Piece 임베딩 방식 사용, 각 Char(문자) 단위로 임베딩을 하고, 자주 등장하면서 가장 긴 길이의 sub-word를 하나의 단위로 만든다.
자주 등장하지 않는 단어는 다시 sub-word로 만듭니다. 이는 이전에 자주 등장하지 않았던 단어를 모조리 'OOV' 처리하여 모델의 성능을 저하했던 'OOV' 문제도 해결 할 수 있다.
OOV(Out Of Vocabulary): 단어 사전에 없는 문제. 일반적으로 <UNK> unknown token을 반환한다.
Segment Embedding
문장을 구분하기 위한 임베딩
Position Embedding
단어 위치를 나타내는 임베딩

BERT vs GPT

BERT
BERT는 문장 의미 침 감정 분석 추출과 관련된 task에 유리하다.
BERT는 Bi-direction
"나는 개발이 재미있습니다."에서 "개발이" 를 예측하기 위해서 "나는", "재미있습니다"를 이용한다.
GPT
GPT는 문장 생성과 관련된 task에 유리하다.
GPT는 one-direction
"나는 개발이 재미있습니다."에서 "개발이" 를 예측하기 위해서 "나는" 만을 이용한다.
!pip install transformers
Python
복사
from transformers import pipeline
Python
복사

BERT

classifier = pipeline( "sentiment-analysis", model="sangrimlee/bert-base-multilingual-cased-nsmc" ) classifier("흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나.") # [{'label': 'negative', 'score': 0.9642568230628967}] classifier("액션이 없는데도 재미 있는 몇안되는 영화") # [{'label': 'positive', 'score': 0.9970554113388062}]
Python
복사

저장

classifier.save_pretrained("sentiment_pipeline")
Python
복사

불러오기

classifier = pipeline("sentiment-analysis", model = "sentiment_pipeline") classifier('오늘 너무 행복하다')
Python
복사

Fill mask

fill_mask = pipeline("fill-mask", model = "klue/bert-base") fill_mask("오늘 저녁은 [MASK] 먹자",top_k=10)
Python
복사
[{'score': 0.07854149490594864, 'token': 677, 'token_str': '꼭', 'sequence': '오늘 저녁은 꼭 먹자'}, {'score': 0.06891655921936035, 'token': 1521, 'token_str': '잘', 'sequence': '오늘 저녁은 잘 먹자'}, {'score': 0.06734155118465424, 'token': 23698, 'token_str': '이걸로', 'sequence': '오늘 저녁은 이걸로 먹자'}, {'score': 0.0492863655090332, 'token': 1, 'token_str': '[UNK]', 'sequence': '오늘 저녁은 먹자'}, {'score': 0.037069182842969894, 'token': 1097, 'token_str': '뭐', 'sequence': '오늘 저녁은 뭐 먹자'}, {'score': 0.03490210324525833, 'token': 1099, 'token_str': '뭘', 'sequence': '오늘 저녁은 뭘 먹자'}, {'score': 0.03136727586388588, 'token': 3737, 'token_str': '이렇게', 'sequence': '오늘 저녁은 이렇게 먹자'}, {'score': 0.02197464182972908, 'token': 10725, 'token_str': '떡볶이', 'sequence': '오늘 저녁은 떡볶이 먹자'}, {'score': 0.020356040447950363, 'token': 4239, 'token_str': '제대로', 'sequence': '오늘 저녁은 제대로 먹자'}, {'score': 0.019041113555431366, 'token': 3842, 'token_str': '어떻게', 'sequence': '오늘 저녁은 어떻게 먹자'}]
Plain Text
복사

Question & Answering

question_answering = pipeline("question-answering",model= "ainize/klue-bert-base-mrc") question = "대한민국의 수도는?" context = """ 서울특별시는 대한민국의 수도, 최고(最古) 도시, 최대 도시다.[19] 지방자치법의 특별법[20]으로 법률상 대한민국 제1의 도시로 규정되어 있다. 현재 대한민국 유일 특별시이며, 수장인 서울특별시장은 대한민국의 광역자치단체장 중 유일하게 장관급 대우를 받으며 국무회의 참여권 및 발언권이 있다.[21][22] 서울은 한국 제2의 도시인 부산보다도 인구가 약 3배 더 많은 명실상부한 한반도의 종주도시이다. 역사적으로도 백제, 조선, 대한제국의 고도이자 현 대한민국의 수도로서 중요성이 높다. 기원전 18년 백제가 현 송파·강동 지역에 도읍을 정한 후 492년간 한성백제 시대가 이어졌다. 이후 475년 고구려가 한성을 함락하였는데, 북쪽에 기반을 둔 국가인 고구려는 기존 백제의 한성에서 북쪽으로 한강을 건너 현 광진·성동·구리 일대를 거점으로 삼아 고구려의 북한산군 남평양으로 지정했고, 이후 서울은 강북 지역을 중심으로 발전하였다. 이후 553년 신라가 이 지역을 차지하여 신라의 한산주 한양군이 되었다. 이후 고려시대에는 약 250년간[23] 개경 이남의 남경이었다. 조선시대에는 510년 동안[24] 조선 및 대한제국의 수도 한성부였고, 이어 70여년간[25] 대한민국의 수도인 서울로서 지위를 차지하는 도시로 한국사에서 도합 1070여년간 수도로서 기능을 하였고 부수도 기간까지 합치면 1300년이 넘는 유구한 역사의 고도이다.[26] """ question_answering(question,context) # {'score': 0.641891360282898, 'start': 1, 'end': 7, 'answer': '서울특별시는'}
Python
복사

GPT

text_generation = pipeline("text-generation",model= "skt/kogpt2-base-v2") text_generation("딥러닝")
Python
복사
/usr/local/lib/python3.8/dist-packages/transformers/generation/utils.py:1186: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file (see https://huggingface.co/docs/transformers/main_classes/text_generation) warnings.warn( /usr/local/lib/python3.8/dist-packages/transformers/generation/utils.py:1273: UserWarning: Neither `max_length` nor `max_new_tokens` has been set, `max_length` will default to 50 (`generation_config.max_length`). Controlling `max_length` via the config is deprecated and `max_length` will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation. warnings.warn( [{'generated_text': '딥러닝 콘텐츠 개발을 위한 지원과 스타트업 육성을 위해 다양한 프로그램을 제공해왔다”며 “향후에도 기업 및 스타트업 성장을 위해 노력하고, 보다 혁신적인 아이디어가 현실화할 수 있도록 적극 지원할 것”이라고 밝혔다. 미국'}]
Plain Text
복사