HuggingFace KoElectra로 NSMC 감성분석 Fine-tuning해보기

김희규
6 min readAug 17, 2020

--

HuggingFace에 박장원님이 학습해서 올려주신 KoElectra-small을 이용해서 NSMC(Naver Sentiment Movie Corpus) 감성분석 모델을 학습해본다. 학습은 Googel Colab(GPU)에서 Pytorch를 이용했다.

전체 코드는 아래 코랩에서 확인 가능하다.

데이터셋 구조

15만개의 train데이터와 5만개의 test데이터로 구성됐다. 다만 일부 데이터가 NaN인 경우가 있으며, 중복된 데이터도 존재한다.

label이 0일 경우 부정, 1일 경우 긍정이고, document가 리뷰 텍스트다. 아래 코드로 NaN 필드와 document 중복이 있는 row를 제거하면

dataset = pd.read_csv(csv_file, sep='\t').dropna(axis=0)
dataset.drop_duplicates(subset=['document'], inplace=True)

Train Set은 146182개가 되고, Test Set은 49157개가 된다.

전처리

HuggingFace에서 제공하는 AutoTokenizer를 이용했다 KoElectra의 토크나이저를 쓰기 위해선 from_pretrained 함수의 인자로 monologg/koelectra-small-v2-discriminator 를 넣어주면 된다. 깃허브에는 원논문처럼 Wordpiece로 토큰화했다고 나와있다.

tokenizer = AutoTokenizer.from_pretrained(
"monologg/koelectra-small-v2-discriminator"
)
text = "안녕하세요"inputs = self.tokenizer(
text,
return_tensors='pt',
truncation=True,
max_length=256,
pad_to_max_length=True
)

padding=True를 하면 패딩이 안된다… 이유가 뭐지 ㅠㅠ 이거때문에 한참 시간을 쏟았다. 문서를 보면 기본적으로 앞뒤에 [CLS]와 [SEP] 토큰을 추가한다(문서링크). 그냥 함수처럼 실행하면 인코딩된 결과가 나오고, tokenize()함수를 사용해서 토큰이 나눠진 결과를 확인할 수 있다.

(추가) padding=”max_length”를 해야 tokenizer에 등록된 최대 길이로 자동으로 패딩됩니다!

아 더빙.. 진짜 짜증나네요 목소리['아', '더', '##빙', '.', '.', '진짜', '짜증', '##나', '##네', '##요', '목소리']

모델

Electra는 generator와 discriminator 2가지 모델을 학습하고 이중에서 discriminator를 사용한다. ElectraForSequenceClassification 에 “monologg/koelectra-small-v2-discriminator” 모델명을 줘서 모델을 가져온다.

model = ElectraForSequenceClassification.from_pretrained(
"monologg/koelectra-small-v2-discriminator"
)

Electra관련 여러 모델들이 HuggingFace에 올라가있는데, 그중 ElectraForSequenceClassification은 BERT Classification처럼 Electra의 마지막 layer에서 [CLS] 토큰을 가져온 뒤 아래 레이어를 거치도록 되어있다.

(classifier): ElectraClassificationHead(
(dense): Linear(in_features=256, out_features=256, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
(out_proj): Linear(in_features=256, out_features=2, bias=True)
)

마지막 Linear 레이어의 출력이 2라서 이중분류를 위해 구현돼있는걸 알 수 있고, 더 많은 카테고리의 분류를 위해서는 ElectraModel을 이용해서 따로 튜닝이 필요할 것 같다.

학습결과

4에폭을 학습했을 때, Train Set 정확도는 87.4%, Test Set 정확도도 86.87%를 달성했다. 1에폭 학습에 20분가량 소요됬다.

인터넷에 NSMC 감성분석 모델을 찾아보면 일반적인 모델들은 80~85% 언저리의 정확도를 보여준다. SKTBrain의 KOBERT가 90%를 달성했다고 나와있다(링크). small 모델임에도 좋은 성능을 보인다.

다시한번 좋은 모델을 공유해주신 박장원님께 감사드립니다.

References

--

--

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.