카테고리 없음

스파르타 AI-8기 TIL(11/5) -> hugging face와 transformer로 다양한 NLP 모델 찾아보기

kimjunki-8 2024. 11. 5. 20:47
Transformers 라이브러리란?
transformers 라이브러리는 Hugging Face에서 개발한 자연어 처리(NLP)용 파이썬 라이브러리로, Transformer 기반의 다양한 사전 훈련 모델을 제공하고 쉽게 사용할 수 있도록 도와줍니다. 이 라이브러리는 GPT, BERT, T5, RoBERTa 등과 같은 대표적인 Transformer 모델들을 포함하여 텍스트 생성, 번역, 감정 분석 등 여러 NLP 작업에 활용할 수 있습니다.
주요 특징과 기능
사전 훈련 모델 제공
transformers 라이브러리에는 수많은 사전 훈련된 NLP 모델이 포함되어 있어, 특정 작업을 위해 처음부터 모델을 학습시키지 않고도 바로 사용할 수 있습니다.
모델은 여러 언어와 데이터셋에서 학습되었으며, 높은 성능을 보이는 다양한 버전의 BERT, GPT-2, T5 등 유명한 모델을 제공합니다.

모델 허브
transformers는 Hugging Face의 모델 허브와 연결되어 있어, 최신 모델을 바로 불러와 사용할 수 있습니다.
이 허브에는 연구자와 개발자들이 업로드한 다양한 모델이 있으며, API를 통해 손쉽게 로드 가능합니다.

다양한 NLP 작업 지원
텍스트 분류: 감정 분석, 주제 분류 등
텍스트 생성: 글쓰기 보조, 번역, 대화 생성
질의응답(Q&A): 주어진 텍스트에서 질문에 대한 답을 찾는 기능
요약: 긴 텍스트를 요약하여 중요한 정보만 추출
번역: 여러 언어 간의 번역 지원
마스킹된 언어 모델링(MLM): 문장의 일부 단어를 숨기고 해당 단어를 예측하는 작업 (ex: BERT)

확장성
파이토치(PyTorch)와 텐서플로(TensorFlow)를 모두 지원하며, 각 프레임워크에 맞는 코드로 변환 없이 사용 가능하므로 유연하게 활용할 수 있습니다.

사용하기 쉬운 API
직관적이고 간편한 API를 제공해 모델 로딩, 데이터 전처리, 추론 과정을 쉽게 수행할 수 있습니다. 특히, pipeline 기능을 통해 간단한 코드로 여러 작업을 처리할 수 있습니다.

transformers의 주요 클래스
Tokenizer: 텍스트 데이터를 모델에 맞게 전처리하는 클래스입니다. 예를 들어, BERT 토크나이저는 BERT 모델에 맞춘 형태로 문장을 토큰으로 나누고, 이를 숫자 인덱스의 시퀀스로 변환합니다.

Model: 사전 훈련된 모델을 불러오는 클래스입니다. AutoModel이나 AutoModelForSequenceClassification과 같은 클래스를 사용하면, 특정 작업에 맞는 모델을 자동으로 로드할 수 있습니다.

Pipeline: 파이프라인은 특정 작업을 수행하기 위한 API로, 복잡한 코드 작성 없이 텍스트 분류, 번역, 텍스트 생성 등을 바로 실행할 수 있도록 도와줍니다.
from transformers import pipeline

# 감정 분석 파이프라인 생성
sentiment_analysis = pipeline("sentiment-analysis")

# 예시 텍스트
text = "I love using transformers library for NLP tasks!"

# 감정 분석 수행
result = sentiment_analysis(text)
print(result)


tokenizer와 model 객체를 사용하여 만든 코드 예시

# 필요한 라이브러리 임포트
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 1. 토크나이저와 모델 로드
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

# 2. 입력 텍스트 설정
text = "I love using transformers library for NLP tasks!"

# 3. 텍스트를 토큰화 (토큰 ID로 변환)
inputs = tokenizer(text, return_tensors="pt")

# 4. 모델에 입력하여 추론 수행
outputs = model(**inputs)

# 5. 출력 해석 (로지츠 -> 감정 예측)
logits = outputs.logits
predicted_class = torch.argmax(logits, dim=1).item()

# 6. 결과 출력
label_map = {0: "Negative", 1: "Positive"}
print(f"Input Text: '{text}'")
print("Predicted Sentiment:", label_map[predicted_class])

이제 하나하나 보겠습니다.

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

AutoTokenizer와 AutoModelForSequenceClassification은 Hugging Face의 transformers 라이브러리에서 제공하는 모듈입니다.
AutoTokenizer: 지정된 모델 이름에 맞는 적합한 토크나이저를 자동으로 불러옵니다.
AutoModelForSequenceClassification: 텍스트 분류를 위한 사전 훈련된 모델을 불러옵니다. 여기서는 감정 분석을 위한 모델을 사용합니다.

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

model_name에 사용할 모델의 이름을 설정합니다. "distilbert-base-uncased-finetuned-sst-2-english"는 DistilBERT라는 모델로 감정 분석(SST-2 데이터셋에서 학습됨)에 맞춰 미세 조정된 버전입니다.
AutoTokenizer.from_pretrained(model_name): model_name에 맞는 토크나이저를 불러옵니다.
DistilBERT 모델의 사전 학습된 토크나이저를 로드하여 텍스트를 모델 입력에 적합한 토큰으로 변환할 수 있습니다.
AutoModelForSequenceClassification.from_pretrained(model_name): model_name에 맞는 사전 훈련된 감정 분석 모델을 불러옵니다.

text = "I love using transformers library for NLP tasks!"

감정 분석을 수행할 입력 텍스트를 설정합니다. 여기서는 text라는 변수에 예시 문장을 저장합니다.

inputs = tokenizer(text, return_tensors="pt")

tokenizer(text, return_tensors="pt")는 입력 텍스트를 토큰화하여 모델이 이해할 수 있는 형식으로 변환합니다.
토큰화: 텍스트를 "단어" 수준이 아닌 "토큰" 수준으로 나누고, 이를 모델이 이해할 수 있는 숫자 ID로 변환합니다.
return_tensors="pt": 결과를 PyTorch 텐서로 반환합니다.
inputs는 토크나이저로 변환된 딕셔너리 형태의 출력입니다. 예를 들어 다음과 같은 구조입니다:

{
    'input_ids': tensor([[101, 1045, 2293, 2478, ...]]),
    'attention_mask': tensor([[1, 1, 1, 1, ...]])
}

input_ids: 각 단어(또는 토큰)를 모델이 이해할 수 있는 숫자 ID로 변환한 값.
attention_mask: 문장의 각 토큰이 실제로 의미 있는지(1) 아닌지(0)를 나타내는 값입니다.

outputs = model(**inputs)

**inputs: inputs 딕셔너리의 키-값 쌍을 개별 인수로 풀어서 전달합니다.
예를 들어, inputs가 {"input_ids": ..., "attention_mask": ...}일 때, model(**inputs)는 model(input_ids=..., attention_mask=...)와 동일한 효과를 냅니다.
outputs: 모델이 입력을 바탕으로 생성한 예측 결과입니다. 여기서는 감정 예측 점수, 즉 로짓(logits) 값이 포함되어 있습니다.

그런데 왜 굳이 딕셔너리 형태로 보낼까요? 

대부분의 딥러닝 모델, 특히 Hugging Face의 transformers 라이브러리에서 제공하는 모델들은 특정한 키워드 인수(input_ids, attention_mask, 등)를 필요로 합니다. 이 인수들은 모델이 입력을 처리하는 데 필요한 다양한 정보를 담고 있습니다.
또한 딕셔너리의 모든 키-값 쌍을 일일이 함수에 전달하는 대신, **inputs를 사용하면 한 줄로 간단하게 전달할 수 있습니다. 그래서 입력이 많아질수록, 혹은 입력 형식이 동적으로 변할 때 **inputs를 사용하면 코드가 더 유연해지고 유지보수가 쉬워집니다. 
게다가  함수가 특정 키워드 인수를 기대할 때, **inputs를 사용하면 딕셔너리의 키가 함수의 인수 이름과 일치해야 합니다. 이는 코드의 가독성을 높이고, 오류를 줄이는 데 도움이 됩니다.

logits = outputs.logits
predicted_class = torch.argmax(logits, dim=1).item()

outputs.logits: 모델의 최종 출력값입니다. 각 클래스에 대한 점수가 담겨 있으며, 높은 값일수록 해당 클래스일 확률이 큽니다.
torch.argmax(logits, dim=1): 점수가 가장 높은 클래스의 인덱스를 선택하여 최종 예측 클래스를 결정합니다.
예를 들어, logits가 [[-1.5, 2.3]]이면 두 번째 값이 더 크므로 torch.argmax는 1을 반환하고, 이는 긍정을 나타냅니다.

여기서 torch.argmax는 텐서의 특정 차원에서 최댓값을 가지는 인덱스를 반환하는 함수입니다. 주로 딥러닝 모델의 예측 결과에서 가장 높은 확률(점수)을 가진 클래스를 선택할 때 사용됩니다.
구조는:

torch.argmax(input, dim, keepdim=False)


input: 최댓값을 찾고자 하는 텐서입니다.
dim: 최댓값을 찾을 차원의 인덱스입니다.
dim=0이면 행을 기준으로, dim=1이면 열을 기준으로 최댓값의 인덱스를 반환합니다.
keepdim (기본값=False): 최댓값을 찾은 차원을 유지할지 여부입니다. True로 설정하면 해당 차원이 유지되어 출력됩니다.

그렇게 지정된 차원에서 최댓값의 인덱스를 반환하며, 모델의 예측 결과가 클래스별 확률값으로 구성된 경우, torch.argmax를 사용하여 가장 높은 확률을 가진 클래스의 인덱스를 선택할 수 있습니다.

.item(): 텐서에서 값을 추출하여 일반 파이썬 정수로 변환합니다.

label_map = {0: "Negative", 1: "Positive"}
print(f"Input Text: '{text}'")
print("Predicted Sentiment:", label_map[predicted_class])

label_map: 예측된 클래스 인덱스를 "Negative" 또는 "Positive"로 변환하기 위해 사용하는 딕셔너리입니다.
predicted_class가 1이면 "Positive", 0이면 "Negative"가 출력됩니다.


 

GPT2
GPT2는 오래되었지만 아직까지 속도도 빠르고, 실습으로 쓰기 좋은 성능을 가지고 있습니다.
import warnings
warnings.filterwarnings(action = 'ignore')
from transformers import pipeline

generator = pipeline('text-generation', model = 'gpt2')

먼저, pipeline의 주요 인수들을 보겠습니다.
task: 수행할 작업의 유형을 지정하는 문자열입니다.
예시: "text-generation", "text-classification", "question-answering", "summarization", "translation", "sentiment-analysis" 등.
이 인수에 따라 자동으로 모델과 토크나이저가 선택되고 설정됩니다.

model: 사용할 모델의 이름 또는 경로입니다. 사전 학습된 모델을 로드하는 방식이며, transformers 라이브러리의 허브 모델 이름을 지정할 수 있습니다.
예시: "gpt2", "bert-base-uncased", "distilbert-base-cased" 등.
커스텀 모델 경로를 지정할 수도 있습니다.

tokenizer: 사용할 토크나이저의 이름 또는 경로입니다. 모델과 동일한 이름을 지정하면 해당 모델에 맞는 토크나이저가 자동으로 로드됩니다. 커스텀 토크나이저를 사용할 수도 있습니다.
예시: "gpt2", "bert-base-uncased" 등.

device: 파이프라인을 실행할 디바이스를 지정합니다.
-1로 설정하면 CPU에서 실행됩니다.
0 이상으로 설정하면 해당 GPU 장치에서 실행됩니다.

config: 모델의 설정을 지정하는 데 사용됩니다. 모델의 하이퍼파라미터나 세부적인 설정을 조정하는 데 필요한 PretrainedConfig 객체 또는 설정 파일 경로를 전달할 수 있습니다.

framework: 백엔드 프레임워크를 지정합니다.
"pt"를 지정하면 PyTorch에서 실행되며, "tf"를 지정하면 TensorFlow에서 실행됩니다.
기본값은 PyTorch입니다.
예시:

from transformers import pipeline

# 텍스트 생성 파이프라인 예제
generator = pipeline("text-generation", model="gpt2", tokenizer="gpt2", device=-1)
result = generator("The future of AI is")
print(result)  # GPT-2 모델을 이용한 텍스트 생성 결과

# 질문 답변 파이프라인 예제
qa_pipeline = pipeline("question-answering", model="distilbert-base-uncased", 
tokenizer="distilbert-base-uncased", device=-1)

result = qa_pipeline(question="What is the capital of France?", 
context="Paris is the capital of France.")

print(result)  # {'score': ..., 'start': ..., 'end': ..., 'answer': 'Paris'}

혹시 모르니 Tokenizer와 model도 보겠습니다.
Tokenizer는 입력 텍스트를 모델이 이해할 수 있는 형태로 변환하는 역할을 합니다.
from_pretrained(pretrained_model_name_or_path, *args, **kwargs): 지정된 모델 이름에 맞는 토크나이저를 로드합니다.
pretrained_model_name_or_path: 사전 학습된 모델의 이름 또는 경로 (예: "bert-base-uncased").
use_fast: 빠른 버전의 토크나이저를 사용할지 여부를 지정합니다. 기본값은 True.

__call__(text, **kwargs): 주어진 텍스트를 토큰화하여 모델에 필요한 형식으로 변환합니다.
text: 입력할 텍스트입니다.
padding: True로 설정하면 입력 길이를 맞추기 위해 패딩을 추가합니다.
truncation: True로 설정하면 최대 길이에 맞춰 텍스트를 잘라냅니다.
return_tensors: "pt"로 설정하면 PyTorch 텐서로 반환하고, "tf"로 설정하면 TensorFlow 텐서로 반환합니다.

encode(text, **kwargs): 입력 텍스트를 토큰화하고 ID로 변환합니다.
text: 인코딩할 텍스트입니다.
add_special_tokens: True로 설정하면 [CLS], [SEP] 등의 특수 토큰을 추가합니다.

decode(token_ids, **kwargs): 주어진 토큰 ID를 원래의 텍스트로 복원합니다.

from transformers import AutoTokenizer

# BERT 모델의 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 입력 텍스트를 토큰화하여 입력 텐서로 변환
inputs = tokenizer("Hello, world!", return_tensors="pt", padding=True, truncation=True)
print(inputs)  # {'input_ids': tensor(...), 'attention_mask': tensor(...)}

Model 클래스는 사전 학습된 딥러닝 모델을 로드하고, 입력 데이터를 통해 예측을 수행하는 역할을 합니다.
from_pretrained(pretrained_model_name_or_path, *args, **kwargs): 지정된 모델 이름에 맞는 사전 학습된 모델을 로드합니다.
pretrained_model_name_or_path: 모델의 이름 또는 경로 (예: "bert-base-uncased").
config: 모델의 설정을 조정하는 데 사용되는 PretrainedConfig 객체 또는 설정 파일 경로.

forward(*input, **kwargs): 모델에 입력값을 전달하여 예측을 수행합니다. 일반적으로 __call__() 메서드에서 호출되며, 텐서 또는 텐서 딕셔너리를 입력받습니다.
input_ids: 입력 텍스트의 ID.
attention_mask: 패딩을 구분하기 위한 마스크.
token_type_ids: 문장의 종류를 나타내는 ID (선택적).

training: 모델의 학습 모드를 설정합니다. model.train()을 호출하면 학습 모드로 설정되며, model.eval()을 호출하면 평가 모드로 설정됩니다.

from transformers import AutoModel

# BERT 모델 로드
model = AutoModel.from_pretrained("bert-base-uncased")

# 입력 데이터를 모델에 전달하여 출력 생성
outputs = model(**inputs)  # inputs는 Tokenizer를 통해 생성된 입력값
print(outputs)  # 모델의 출력 (은닉 상태)

pipeline에서는 스스로 모델을 선택할 수 있는데, 여기서 "text-generation", "text-classification", "question-answering", "summarization", "translation", "sentiment-analysis"들은 각각 추가 속성이 있습니다. 여기서 한번 다뤄보겠습니다
1. Text Generation (text-generation)
주어진 텍스트(프롬프트)에 기반하여 새로운 텍스트를 생성하는 작업입니다. 모델은 이전의 단어들을 기반으로 다음에 올 단어를 예측하고, 이를 반복하여 연속적인 문장을 만듭니다. 
예를 들어, 이야기를 이어 나가거나, 시를 쓰거나, 특정 주제에 대한 글을 생성하는 데 사용됩니다("Once upon a time"라는 입력으로 시작하여 그 뒤에 나올 문장을 생성합니다).

주요 인수
model: 
사용할 모델 이름
tokenizer: 
사용할 토크나이저 이름 (예: "gpt2").

추가 속성
max_length: 
생성할 최대 토큰 길이 (예: 50).
num_return_sequences: 
생성할 결과의 개수 (예: 3).
temperature: 생성의 다양성을 조절하는 매개변수 (높을수록 다양함, 보통 1.0 사용).
top_k:
 가장 높은 확률의 k개 단어만 선택하여 샘플링하는 방법 (예: 50).
top_p: 
누적 확률이 p에 도달하는 단어들만 선택 (예: 0.95).
do_sample: 
True로 설정하면 샘플링을 통해 텍스트를 생성하고, False로 설정하면 Greedy 방식을 사용합니다.
from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")
result = generator("Once upon a time", max_length=50, num_return_sequences=1)
print(result)


2. Text Classification (text-classification)
주어진 텍스트를 미리 정의된 여러 클래스(범주) 중 하나에 분류하는 작업입니다.
 주로 특정 주제나 카테고리로 문서를 분류할 때 사용됩니다.
예를 들어, 이메일이 스팸인지 아닌지 판단하거나, 뉴스 기사를 정치, 경제, 스포츠 등으로 분류하는 데 활용됩니다("I love using transformers!"라는 문장을 긍정적인 감정으로 분류합니다).

주요 인수
model: 
사용할 모델 이름 (예: "distilbert-base-uncased").
tokenizer: 
사용할 토크나이저 이름 (예: "distilbert-base-uncased").

추가 속성
return_all_scores: 
True로 설정하면 각 클래스의 점수를 모두 반환합니다.
truncation:
 True로 설정하면 입력 텍스트가 최대 길이를 초과할 경우 잘립니다.
padding: 
True로 설정하면 입력 텍스트를 최대 길이에 맞춰 패딩합니다.
classifier = pipeline("text-classification", model="distilbert-base-uncased")
result = classifier("I love using transformers!", return_all_scores=True)
print(result)

3. Question Answering (question-answering)
주어진 질문에 대해 관련된 문맥(또는 텍스트)에서 답을 찾아내는 작업입니다. 모델은 질문에 대한 정확한 답변을 찾아야 합니다. 
예를 들어, 문서에서 특정 정보를 추출하거나, FAQ 시스템에서 사용자 질문에 답변하는 데 사용됩니다("What is the capital of France?"라는 질문에 대해 "Paris"라는 답변을 제공합니다).
주요 인수
model: 사용할 모델 이름 (예: "distilbert-base-uncased").
tokenizer: 사용할 토크나이저 이름 (예: "distilbert-base-uncased").

추가 속성
handle_impossible_answer: True로 설정하면 답변이 불가능한 경우에 대한 처리를 추가합니다.
max_seq_len: 최대 입력 시퀀스 길이.
truncation: True로 설정하면 입력 텍스트가 최대 길이를 초과할 경우 잘립니다.

qa_pipeline = pipeline("question-answering", model="distilbert-base-uncased")
result = qa_pipeline(question="What is the capital of France?", 
context="Paris is the capital of France.")

print(result)​

4. Summarization (summarization)
주어진 긴 텍스트를 간결하게 요약하는 작업입니다.
주요 아이디어나 핵심 내용을 보존하면서 텍스트의 길이를 줄입니다. 
예를 들어, 긴 뉴스 기사나 연구 논문을 간단하게 요약하여 필요한 정보를 빠르게 전달하는 데 사용됩니다("Your long text goes here..."라는 긴 텍스트를 130자 이하로 요약합니다).

주요 인수
model: 
사용할 모델 이름 (예: "facebook/bart-large-cnn").
tokenizer: 
사용할 토크나이저 이름 (예: "facebook/bart-large-cnn").

추가 속성
max_length: 
요약할 최대 길이 (예: 130).
min_length: 
요약할 최소 길이 (예: 30).
do_sample: 
True로 설정하면 샘플링을 통해 요약을 생성합니다.
length_penalty: 
생성된 요약의 길이에 대한 패널티를 조정합니다 (예: 2.0).
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
text = "Your long text goes here..."
result = summarizer(text, max_length=130, min_length=30, do_sample=False)
print(result)​

5. Translation (translation)
한 언어로 쓰인 텍스트를 다른 언어로 변환하는 작업입니다. 번역 모델은 원문을 이해하고 의미를 정확하게 전달하는 번역문을 생성해야 합니다. 
예를 들어, 영어에서 프랑스어, 스페인어 등으로 번역하는 데 사용됩니다("Hello, how are you?"를 프랑스어로 "Bonjour, comment ça va?"로 번역합니다).

주요 인수
model: 
사용할 모델 이름 (예: "Helsinki-NLP/opus-mt-en-fr").
tokenizer: 
사용할 토크나이저 이름 (예: "Helsinki-NLP/opus-mt-en-fr").

추가 속성
max_length: 
번역할 최대 길이 (예: 40).
min_length: 
번역할 최소 길이 (예: 5).
do_sample:
 True로 설정하면 샘플링을 사용하여 번역합니다.
translator = pipeline("translation_en_to_fr", model="Helsinki-NLP/opus-mt-en-fr")
result = translator("Hello, how are you?", max_length=40)
print(result)

6. Sentiment Analysis (sentiment-analysis)
주어진 텍스트의 감정을 분석하여 긍정적, 부정적, 중립적 등의 감정 상태를 판단하는 작업입니다.
일반적으로 소셜 미디어, 리뷰 등의 감정을 분석하는 데 사용됩니다.
예를 들어, 고객 리뷰의 감정을 평가하여 제품에 대한 반응을 이해하거나, 소셜 미디어 포스트의 감정을 분석하는 데 사용됩니다("I love this product!"라는 문장을 긍정적인 감정으로 분류합니다).

주요 인수
model: 
사용할 모델 이름 (예: "distilbert-base-uncased-finetuned-sst-2-english").
tokenizer: 
사용할 토크나이저 이름 (예: "distilbert-base-uncased-finetuned-sst-2-english").

추가 속성
return_all_scores:
 True로 설정하면 모든 클래스에 대한 점수를 반환합니다.
truncation:
 True로 설정하면 최대 길이를 초과하는 경우 잘립니다.
padding: 
True로 설정하면 입력을 패딩합니다.
sentiment_classifier = pipeline("sentiment-analysis", 
model="distilbert-base-uncased-finetuned-sst-2-english")

result = sentiment_classifier("I love this product!", return_all_scores=True)
print(result)
여기서 이제 각 모델마다 쓰는 model를 찾아보겠습니다.
1. Text Generation (text-generation)
모델(model)

gpt2: OpenAI의 GPT-2 모델로, 다양한 텍스트 생성 작업에 적합합니다. (참고로 gpt2-medium, gpt2-large, gpt2-xl도 있습니다)
gpt-neo: 
EleutherAI에서 개발한 모델로, GPT-3와 유사한 성능을 제공합니다. (gpt-neox도 있습니다)
gpt-j:
 또 다른 EleutherAI의 모델로, 높은 성능을 목표로 합니다.
ctrl: 
Salesforce의 조건부 텍스트 생성 모델로, 특정 주제나 스타일을 따르는 텍스트를 생성할 수 있습니다.


토크나이저(Tokenizer)
GPT2Tokenizer: 
gpt2와 함께 사용.
GPTNeoTokenizer:
 gpt-neo와 함께 사용.
GPTJTokenizer:
 gpt-j와 함께 사용.
CTRLTokenizer:
ctrl 모델과 함께 사용.

예시:

GPT-2
from transformers import pipeline

gpt2_generator = pipeline('text-generation', model='gpt2')
result = gpt2_generator("Once upon a time", max_length=50)
print("GPT-2 Result:", result)​

GPT-Neo(1.3b은 약 13억 개의 매개변수를 가지고 있음을 의미합니다)

gpt_neo_generator = pipeline('text-generation', model='gpt-neo-1.3B')
result = gpt_neo_generator("In a galaxy far, far away", max_length=50)
print("GPT-Neo Result:", result)

 

GPT-J("6B"는 이 모델이 약 60억 개의 매개변수를 갖고 있다는 뜻입니다)

gpt_j_generator = pipeline('text-generation', model='gpt-j-6B')
result = gpt_j_generator("Once in a lifetime", max_length=50)
print("GPT-J Result:", result)


CTRL

ctrl_generator = pipeline('text-generation', model='ctrl')
result = ctrl_generator("The stock market is", max_length=50)
print("CTRL Result:", result)

 



2. Text Classification (text-classification)
모델(model)
distilbert-base-uncased: DistilBERT, 경량화된 BERT 모델로 다양한 텍스트 분류 작업에 사용됩니다.
distilbert-base-uncased-finetuned-sst-2-english: 감정 분석을 위해 SST-2 데이터셋으로 파인튜닝된 DistilBERT.
bert-base-uncased: 기본 BERT 모델.
roberta-base: RoBERTa 모델로, BERT의 성능을 개선한 모델입니다.
xlm-roberta-base: 다국어를 지원하는 RoBERTa 모델.
albert-base-v2: ALBERT 모델로, 메모리 효율성을 높인 경량화된 BERT입니다.

토크나이저(Tokenizer)
DistilBertTokenizer: distilbert-base-uncased와 함께 사용.
DistilBertTokenizer: distilbert-base-uncased-finetuned-sst-2-english와 함께 사용.
BertTokenizer: bert-base-uncased와 함께 사용.
RobertaTokenizer: roberta-base와 함께 사용.
XLMRobertaTokenizer: xlm-roberta-base와 함께 사용.
AlbertTokenizer: albert-base-v2와 함께 사용.

예시:

distilbert-base-uncased
from transformers import pipeline

distilbert_classifier = pipeline('text-classification', model='distilbert-base-uncased')
result = distilbert_classifier("I love using Transformers!")
print("DistilBERT Result:", result)​

 

distilbert-base-uncased-finetuned-sst-2-english
distilbert_sentiment_classifier = pipeline('text-classification', 
model='distilbert-base-uncased-finetuned-sst-2-english')

result = distilbert_sentiment_classifier("This is the best day ever!")
print("DistilBERT Sentiment Result:", result)​

bert-base-uncased

bert_classifier = pipeline('text-classification', model='bert-base-uncased')
result = bert_classifier("Transformers are amazing!")
print("BERT Result:", result)​

roberta-base

roberta_classifier = pipeline('text-classification', model='roberta-base')
result = roberta_classifier("I enjoy learning about AI.")
print("RoBERTa Result:", result)

xlm-roberta-base

xlm_roberta_classifier = pipeline('text-classification', model='xlm-roberta-base')
result = xlm_roberta_classifier("Natural language processing is fascinating.")
print("XLM-RoBERTa Result:", result)​

albert-base-v2

albert_classifier = pipeline('text-classification', model='albert-base-v2')
result = albert_classifier("Transformers make life easier.")
print("ALBERT Result:", result)


3. Question Answering (question-answering)
모델(model)
bert-large-uncased-whole-word-masking-finetuned-squad: SQuAD 데이터셋으로 파인튜닝된 BERT 모델.
roberta-large: RoBERTa의 대형 버전.
albert-large-v2: ALBERT의 대형 버전.
xlnet-large-cased: XLNet의 대형 버전으로, 순서에 대한 정보까지 고려하여 성능을 향상시킵니다.

토크나이저(Tokenizer)
BertTokenizer: bert-large-uncased-whole-word-masking-finetuned-squad와 함께 사용.
RobertaTokenizer: roberta-large와 함께 사용.
AlbertTokenizer: albert-large-v2와 함께 사용.
XLNetTokenizer: xlnet-large-cased와 함께 사용.

예시:

bert-large-uncased-whole-word-masking-finetuned-squad
from transformers import pipeline

bert_qa = pipeline('question-answering', 
model='bert-large-uncased-whole-word-masking-finetuned-squad')

result = bert_qa({
    'question': 'What is the capital of South Korea?',
    'context': 'South Korea, officially the Republic of Korea, 
    is located in East Asia. Its capital is Seoul.'
})
print("BERT QA Result:", result)​

roberta-large

roberta_qa = pipeline('question-answering', model='roberta-large')
result = roberta_qa({
    'question': 'What is the capital of South Korea?',
    'context': 'South Korea, officially the Republic of Korea, 
    is located in East Asia. Its capital is Seoul.'
})
print("RoBERTa QA Result:", result)

albert-large-v2

albert_qa = pipeline('question-answering', model='albert-large-v2')
result = albert_qa({
    'question': 'What is the capital of South Korea?',
    'context': 'South Korea, officially the Republic of Korea, 
    is located in East Asia. Its capital is Seoul.'
})
print("ALBERT QA Result:", result)​

xlnet-large-cased

xlnet_qa = pipeline('question-answering', model='xlnet-large-cased')
result = xlnet_qa({
    'question': 'What is the capital of South Korea?',
    'context': 'South Korea, officially the Republic of Korea, 
    is located in East Asia. Its capital is Seoul.'
})
print("XLNet QA Result:", result)​


4. Summarization (summarization)
모델(model)
facebook/bart-large-cnn: BART 모델을 사용하여 CNN/Daily Mail 데이터셋으로 학습된 모델.
t5-base: Text-to-Text Transfer Transformer로, 다양한 NLP 작업에 활용됩니다.
t5-large: T5 모델의 대형 버전.

토크나이저(Tokenizer)
BartTokenizer: facebook/bart-large-cnn와 함께 사용.
T5Tokenizer: t5-base, t5-large와 함께 사용.

예시:
facebook/bart-large-cnn
bart_summarizer = pipeline('summarization', model='facebook/bart-large-cnn')
result = bart_summarizer("The quick brown fox jumps over the lazy dog. 
This is a well-known pangram.", max_length=20, min_length=5, do_sample=False)

print("BART Summarization Result:", result)​

t5-base, t5-large
t5_summarizer = pipeline('summarization', model='t5-base')
result = t5_summarizer("The quick brown fox jumps over the lazy dog. 
This is a well-known pangram.", max_length=20, min_length=5, do_sample=False)
print("T5 Summarization Result:", result)​

5. Translation (translation)
모델(model)
Helsinki-NLP/opus-mt-en-fr: 영어에서 프랑스어로 번역하는 모델.
Helsinki-NLP/opus-mt-fr-en: 프랑스어에서 영어로 번역하는 모델.
t5-base: 번역 작업에도 사용할 수 있는 T5 모델.

토크나이저(Tokenizer)
MarianTokenizer: Helsinki-NLP 모델과 함께 사용.(둘 다)
T5Tokenizer: t5-base와 함께 사용.

예시:

Helsinki-NLP/opus-mt-en-fr, Helsinki-NLP/opus-mt-fr-en
helsinki_translator = pipeline('translation_en_to_fr', model='Helsinki-NLP/opus-mt-en-fr')
result = helsinki_translator("I love programming.", max_length=40)
print("Helsinki-NLP Translation Result:", result)​

 

T5
t5_translator = pipeline('translation_en_to_fr', model='t5-base')
result = t5_translator("Hello, how are you?", max_length=40)
print("T5 Translation Result:", result)​


6. Sentiment Analysis (sentiment-analysis)
모델(model)
distilbert-base-uncased-finetuned-sst-2-english: SST-2 데이터셋으로 파인튜닝된 DistilBERT.
bert-base-uncased-finetuned-sst-2-english: SST-2 데이터셋으로 파인튜닝된 BERT.
roberta-base: 감정 분석에도 사용될 수 있는 RoBERTa.
finbert: 금융 감정 분석을 위한 모델.

토크나이저(Tokenizer)
DistilBertTokenizer:
 distilbert-base-uncased-finetuned-sst-2-english와 함께 사용.
BertTokenizer: 
bert-base-uncased-finetuned-sst-2-english와 함께 사용.
RobertaTokenizer: 
roberta-base와 함께 사용.
FinBertTokenizer: 
finbert와 함께 사용.

예시:
distilbert-base-uncased-finetuned-sst-2-english
distilbert_sentiment = pipeline('sentiment-analysis', 
model='distilbert-base-uncased-finetuned-sst-2-english')

result = distilbert_sentiment("I love using Transformers!")
print("DistilBERT Sentiment Result:", result)​

bert-base-uncased-finetuned-sst-2-english

bert_sentiment = pipeline('sentiment-analysis', 
model='bert-base-uncased-finetuned-sst-2-english')

result = bert_sentiment("Transformers are amazing!")
print("BERT Sentiment Result:", result)

roberta-base

roberta_sentiment = pipeline('sentiment-analysis', model='roberta-base')
result = roberta_sentiment("I enjoy learning about AI.")
print("RoBERTa Sentiment Result:", result)

finbert

finbert_sentiment = pipeline('sentiment-analysis', model='yiyanghkust/finbert-tone')
result = finbert_sentiment("Stock prices are rising.")
print("FinBERT Result:", result)​


그런데 궁금하지 않으신가요? 예시에서는 분명히 model을 GPT2로 하면, Tokenizer 또한 GPT2로 설정이 되었습니다. 왜 GPT2Tokenizer를 안 쓸까요?
그 이유는 자동 로딩 때문입니다. pipeline 함수는 주어진 모델 이름에 맞는 모델 클래스와 토크나이저를 자동으로 로드합니다. 따라서 model='gpt2'를 입력하면, 내부적으로 GPT2LMHeadModel과 GPT2Tokenizer를 연결합니다. 같은 이름을 사용함으로써 해당 모델에 최적화된 토크나이저가 자동으로 설정됩니다.

그래서 사용자가 모델과 토크나이저를 수동으로 지정할 필요 없이, 단일 문자열로 두 요소를 동일하게 설정할 수 있으므로 코드가 간결해집니다. 이는 사용자에게 혼란을 줄여주고 코드의 가독성을 높이는 장점이 있습니다.

그냥 model과 Tokenizer랑 이름을 똑같이 써도 상관없으며, 수동으로 쓰고 싶으면 수동으로 쓰란 그런 의미입니다.
그리고 또 한가지, AutoModel과 AutoTokenizer란 개념이 있습니다.
AutoModel은 특정한 모델의 아키텍처에 구애받지 않고, 모델 이름에 맞는 적절한 모델 클래스를 자동으로 로드합니다. 그리고 AutoTokenizer또한 비슷한 개념이며, 이는 AutoModel과 함께 쓰입니다.
그러면 어떤 것들이 있는지 알아보겠습니다.

1. Text Generation (text-generation)
모델
AutoModelForCausalLM (예: gpt2, gpt-neo, gpt-j, ctrl 등)
토크나이저
AutoTokenizer 사용

2. Text Classification (text-classification)
모델
AutoModelForSequenceClassification (예: distilbert-base-uncased, roberta-base, albert-base-v2 등)
토크나이저
AutoTokenizer 사용

3. Question Answering (question-answering)
모델
AutoModelForQuestionAnswering (예: bert-large-uncased-whole-word-masking-finetuned-squad, roberta-large, albert-large-v2 등)
토크나이저
AutoTokenizer 사용

4. Summarization (summarization)
모델
AutoModelForSeq2SeqLM (예: facebook/bart-large-cnn, t5-base, t5-large 등)
토크나이저
AutoTokenizer 사용

5. Translation (translation)
모델
AutoModelForSeq2SeqLM (예: Helsinki-NLP/opus-mt-en-fr, Helsinki-NLP/opus-mt-fr-en, t5-base 등)
토크나이저
AutoTokenizer 사용

6. Sentiment Analysis (sentiment-analysis)
모델
AutoModelForSequenceClassification (예: distilbert-base-uncased-finetuned-sst-2-english, finbert, roberta-base 등)
토크나이저
AutoTokenizer 사용

즉, 한마디로 Text Generation을 쓸때, AutoModelForCausalLM을 쓰면,gpt2, gpt-neo, gpt-j, ctrl중 알아서 하나를 쓴다는 뜻입니다

 

BERT 주의점
BERT는 강력한 성능을 자랑하지만, 사용하기에 까다로운 부분이 몇 가지 있습니다.
1. 입력 형식의 복잡성
BERT는 두 개의 문장 쌍을 입력으로 받을 수 있습니다. 이는 특히 질문-응답 작업과 같은 특정 작업에서 중요한데, 각 문장은 서로 다른 유형의 정보를 담고 있습니다. 입력은 일반적으로 다음과 같은 형식이어야 합니다:
[CLS] 문장1 [SEP] 문장2 [SEP]: 여기서 [CLS]는 문장의 시작을 나타내고, [SEP]는 문장 간의 경계를 나타냅니다. 입력을 구성할 때 이 규칙을 잘 지켜야 합니다.

2. 패딩과 트렁케이팅
BERT는 입력 문장의 길이에 제한이 있습니다. 일반적으로 최대 512개의 토큰까지 지원하는데, 이를 초과하는 경우 문장이 잘리거나 패딩이 필요합니다. 이러한 패딩 및 트렁케이팅을 적절하게 처리해야 결과가 정확하게 나오기 때문에 추가적인 코드 작성이 필요합니다.

3. 파인튜닝 과정
BERT는 일반적으로 대량의 데이터로 사전 학습되지만, 특정 작업(예: 감정 분석, 질의 응답 등)에 맞게 파인튜닝해야 합니다. 이 과정은 하이퍼파라미터 조정, 적절한 손실 함수 선택, 데이터셋 준비 등 복잡한 작업을 포함합니다. 이런 과정이 잘못되면 성능이 떨어질 수 있습니다.

4. 다중 레이블 분류 및 다양한 출력
BERT는 주로 문장 분류 작업에 사용되지만, 다양한 출력 형식이 필요한 경우가 많습니다. 예를 들어, 다중 레이블 분류 작업에서는 각 레이블에 대한 이진 분류를 해야 하고, 문장 쌍의 관계를 예측하는 등의 복잡한 작업을 수행해야 합니다.

5. 비지도 학습과 지도 학습
BERT는 비지도 학습(마스크된 언어 모델링)으로 사전 학습되기 때문에, 처음 사용할 때는 이러한 비지도 학습 모델을 적절히 활용하기 위한 지도 학습 과정을 거쳐야 합니다. 이 과정은 많은 사용자가 처음 겪는 어려움이 될 수 있습니다.

요약을 하자면, 여러 부분에서는 BERT가 제대로 처리하지 못하는 정보들은 직접 파인튜닝을 통해 직접적으로 하이파라미터를 수정해줘야 한다는 뜻입니다.

여기까지..