BERT
구글이 2018년에 공개한 사전 훈련된 언어 모델
33억 단어에 대해 약 4일간 학습시킨 언어 모델
위키피디아의 25억개 단어와 북코퍼스의 8억개 레이블이 없는 데이터를 이용하여 사전 훈련됨
레이블이 없는 데이터로 학습한후 레이블이 있는 데이터에서 후가학습하며 미세조정 과정에서 하이퍼파라미터를 다시 조정함.
튜닝해 영어 잘하는 사람이 비슷한 다른 언어를 쉽게 배우는것과 유사한 원리로 다양한 용도로 활용이 가능하다.
- 이진분류, 자연어 다중분류, 감성분류, ...
BERT-Large는 Base보다 데이터, 모델크기, 파라미터 수가 훨씬 많은
Hugging Face 홈페이지에서 무료로 다운로드하여 사용할 수 있다 .
약 110 개의 언어에 대한 BERT 모델이 제공되며 한국어 BERT 모델도 제공된다.
BERT-Base: Encoder L 12, 은닉벡터크기 D 768, self Attention head의 개수 A 12 약 1억 1천만개의 파라미터
BERT-Large: Encoder L 24, 은닉벡터크기 D 1024, self Attention head의 개수 A16 약 3억 4천만개의 파라미터
Hugging Face – The AI community building the future.
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
huggingface.co
# BERT 기반 이진 감성 분류 모델 클래스를 정의합니다.
class BertForBinaryClassification(nn.Module):
# 모델 객체가 생성될 때 실행되는 초기화 메서드입니다.
def __init__(self, model_name):
# 부모 클래스인 nn.Module의 초기화 메서드를 실행합니다.
super().__init__()
# 사전 학습된 KLUE BERT 본체 모델을 불러옵니다.
self.bert = BertModel.from_pretrained(model_name)
# 과적합을 줄이기 위해 분류층 앞에 Dropout을 적용합니다.
self.dropout = nn.Dropout(p=0.1)
# BERT의 hidden_size 값을 가져옵니다. klue/bert-base는 일반적으로 768입니다.
hidden_size = self.bert.config.hidden_size
# hidden_size 차원의 CLS 표현을 1개의 로짓으로 바꾸는 선형 분류층입니다.
self.classifier = nn.Linear(hidden_size, 1)
# 모델의 순전파 계산을 정의합니다.
def forward(self, input_ids, attention_mask, token_type_ids):
# BERT 본체에 토큰 ID, 어텐션 마스크, 세그먼트 ID를 입력합니다.
outputs = self.bert(
input_ids=input_ids, # 문장을 정수 ID로 표현한 입력입니다.
attention_mask=attention_mask, # 실제 토큰과 패딩을 구분하는 마스크입니다.
token_type_ids=token_type_ids # 한 문장 입력에서는 대부분 0으로 구성됩니다.
)
# pooler_output은 CLS 토큰을 기반으로 문장 전체 의미를 요약한 벡터입니다.
pooled_output = outputs.pooler_output
# Dropout을 적용하여 일부 뉴런을 무작위로 비활성화합니다.
dropped_output = self.dropout(pooled_output)
# 선형 분류층을 통과시켜 긍정 클래스에 대한 로짓을 계산합니다.
logits = self.classifier(dropped_output)
# [batch_size, 1] 형태를 [batch_size] 형태로 바꿔 손실 계산을 쉽게 합니다.
return logits.squeeze(-1)