본문 바로가기
Data

[XLNet] XLNet으로 감성분석(sentiment classification, binary categorizing), tokenize 오류 해결

by hyemjjang 2021. 8. 6.

1. 배경

https://paperswithcode.com/task/text-classification

 

Papers with Code - Text Classification

Text classification is the task of assigning a sentence or document an appropriate category. The categories depend on the chosen dataset and can range from topics. ( Image credit: [Text Classification Algorithms: A Su

paperswithcode.com

자연어처리, 특히 categorizing을 공부하면서 느낀 것은 실무에서 가장 많이 사용하는 자연어처리 기법은 PLM (pre-training -> fine tuning) 방식이라는 것이다. 그 중에서도 top3를 꼽자면 BERT, XLNet, fasttext라고 할 수 있겠다. 사실 이 중에서도 가장 많이 알려져 있고, 파생 모델도 많은 건 단연 BERT다.

출처: https://github.com/thunlp/PLMpapers 

 

'19 처음 나온 BERT를 기반으로 상당히 다양한 '성능 좋은 PLM' 모델이 출시되었다.


이 중에서도  XLNet은 대략 20가지의 상황에서 BERT보다 나은 성능을 보이고 있다고 평가되는 모델로, 현재 해당 모델은 transformers 라이브러리에서 제공된다. 이는 XLNet의 근간이 트랜스포머 네트워크에 있기 때문이다. 

가장 처음 첨부한 사이트를 확인하면, 현재도 XLNet이 가장 좋은 성능을 보이는 text classification 문제가 상당히 많음을 확인할 수 있다. 

https://huggingface.co/transformers/model_doc/xlnet.html

 

XLNet

Overview: The XLNet model was proposed in XLNet: Generalized Autoregressive Pretraining for Language Understanding by Zhilin Yang, Zihang Dai, Yiming Yang, J...

huggingface.co

그러나 성능에 비해 자료가 부족하고, 한국어 특화 모델(LaRva)가 따로 개발되어 있지 않기에 간단히 시도해보는 데에 어려움을 겪었다. 그렇기에 내 식대로 한 번 정리해보고자 한다.  


2. XLNet이란?

reference)

XLNet의 개념은 XLNet: Generalized Autoregressive Pretraining for Language Understanding에서 처음 제시되었다.

With the capability of modeling bidirectional contexts, denoising autoencoding
based pretraining like BERT achieves better performance than pretraining approaches 
based on autoregressive language modeling. However, relying on corrupting the input with masks, 
BERT neglects dependency between the masked positions and suffers from a pretrain-finetune discrepancy.
In light of these pros and cons, we propose XLNet, 
a generalized autoregressive pretraining method that (1) enables
learning bidirectional contexts by maximizing the expected likelihood over all
permutations of the factorization order and (2) overcomes the limitations of BERT
thanks to its autoregressive formulation. Furthermore, XLNet integrates ideas
from Transformer-XL, the state-of-the-art autoregressive model, into pretraining.
Empirically, under comparable experiment settings, XLNet outperforms BERT on
20 tasks, often by a large margin, including question answering, natural language
inference, sentiment analysis, and document ranking.

abstract의 내용을 간단히 요약하면, 

1. 양방향 컨텍스트를 모델링하기 때문에 BERT(노이즈 제거 방식)보다 성능이 좋다

2. maximizing the expected likelihood over all permutations of the factorization order

인수분해 순서에 대한 모든 순열의 예상 가능성을 최대화

3. autoregressive formulation 자동 회귀 모델 (transformer-XL 개념 차용)


기존에는 pre-training 단계에서 두 가지 학습 모델을 주로 사용했다.

1. AR (autoregressive) : 데이터를 순차적으로 처리하는 기법. 이전 문백을 바탕으로 다음 단어 예측

2. AE (autoencoding) : 입력값을 복원하는 기법. 일부가 마스킹처리된 단어(노이즈)가 실제로 어떤 단어인지 맞히는 방식. BERT는 노이즈가 포함된 입력을 받아 해당 노이즈를 제거한 원본을 출력하는 모델!

 

하지만 이러한 학습 모델에는 각자 문제가 있는데, 

1. AR : 이전 단어가 입력이고 다음 단어가 출력일 때, 한 방향이기 때문에 그 다음으로 넘어가서 전체 문맥을 학습하기 어렵다는 문제가 있음, 순방향/역방향을 각각 독립적으로 학습하는 방식임

2. AE : 앞뒤 문맥을 모두 살피지만, 마스킹된 단어(토큰)을 모두 독립적이라고 하기 때문에 '의존 관계'를 파악하기 어려움. 즉 마스킹된 단어의 선후관계나 등장 여부 등의 정보는 완전히 배제하는 것

 

그렇기 때문에 사용된 것이 XLNet의 퍼뮤테이션 언어모델이다. 

permutation은 순열이라는 뜻인데, 순열이란 순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산이다. 즉, 토큰을 셔플해서 여러 방향으로 언어를 학습한다는 것이다!

이를 통해 문장의 전체 문맥 그러니까 문장의 부분집합 전부를 살펴 토큰을 예측할 수 있다

 

하나의 토큰을 예측하기 위해 여러 가지의 입력 시퀀스 모음(=부분집합)을 상정할 수 있다. AR의 한계를 극복한 양방향 모델이자 AE의 한계를 극복한 '의존관계'도 해결 가능하다. 셔플시켰지만 어쨌든 '순서'대로 이전 문맥을 다음 예측에 활용하는 방식이니까 그 둘의 관계를 고려하게 되기 때문이다. 


실제로 모델 내에서는 셔플된 시퀀스에 대한 어텐션 마스크로 구현했다. transfomer network에서 활용되는 쿼리, 키벡터간 셀트 어텐션 기법을 활용했기 때문이다.

아까도 말했듯 마스크는 노이즈다. 소프트맥스 확률값을 0으로 무시하게 만든다. 마스크를 통해 소프트맥스 확률값이 0이 되면 해당 단어 정보는 셀프 어텐션에 포함되지 않는다. 

이때 셔플된 토큰 시퀀스를 어탠션 마스크로 가려가면서 스텝마다 다른 입력-> (순서에 맞는) 출력을 내는 것이다. 하지만 랜덤 셔플한 결과가 우연히 맞아서 동일한 입력에도 다른 출력을 내게 된다면?

 

이걸 해결하기 위해 투-스트림 셀프어텐션이 나왔다. 쿼리 스트림과 컨텐츠 스트림을 혼합한 것이다. 쿼리 스트림은 토큰 정보와 타겟 단어의 위치정보를 같이 활용한다. 컨텐츠 스트림은 간단히 말하자면 이전 문맥(메모리)와 자기 자신의 토큰 임베딩 정보를 (원래는 활용 안하는데) 컨텐츠 스트림 벡터라는 이름으로 그걸 활용한다는 것이다. 

투-스트림 셀프어텐션은 쿼리스트림에서 자기 자신의 토큰 정보를 빼고 이전 문맥 단어 정보와 위치 정보를 넣는 것이다. 이럴 경우에는 <이전 문맥=즉, 입력값>이 같더라도, '원래 문장에서의 위치 정보'가 같이 활용되기 때문에 모순을 회피할 수 있다

 

이 이후부터는 상대 위치에 대한 셀프 어텐션을 계산하는 방식까지 알면 되는데, 이 부분은 다소 어려우므로 생략하도록 하자. 내가 앞서 첨부한 블로그 링크에 해당 내용이 자세히 설명되어 있다 ㅎ


 

3. Tokenize 오류 해결 (Colab)

https://stackoverflow.com/questions/65854722/huggingface-albert-tokenizer-nonetype-error-with-colab

 

Huggingface AlBert tokenizer NoneType error with Colab

I simply tried the sample code from hugging face website: https://huggingface.co/albert-base-v2 `from transformers import AlbertTokenizer, AlbertModel` `tokenizer = AlbertTokenizer.from_pretrained('

stackoverflow.com

사실 XLNet을 처음 시도했을 때 tokenizer에서부터 오류가 나서 너무 곤란했다. 

주로 뜨는 오류는 이것이다

 

'NoneType' object is not callable

 

> 이건 경고라 무시해도 된다

Some weights of the model checkpoint at xlnet-base-cased were not used when initializing XLNetModel: ['lm_loss.weight', 'lm_loss.bias'] - This IS expected if you are initializing XLNetModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model). - This IS NOT expected if you are initializing XLNetModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).

 

이러한 오류는 SentencePiece 라이브러리를 설치함으로써 해결할 수 있다

단, XLNet을 돌릴 때 가장 상단에서 두 가지를 한번에 설치해야 한다. 

변환기를 불러 온 상태에서 오류가 뜨고, 그 오류가 난 다음에 sentencePiece를 설치하면 충돌이 일어나는 것 같다 

일단 둘을 먼저 설치한 다음 tokenizer를 import하고, tokenizer를 생성해야 한다. 

 

이는 transformers 내의 BERT, GPT 등 모든 모델의 tokenizer에 동일하게 해당된다. 


해결법)

!pip install Sentencepiece
!pip install transformers

맨 처음 모듈에 이걸 넣어주기!


4. XLNet으로 긍/부정 감성분석 (한국어)

reference)

기본 조건

1. GPU가 필요하므로 구글 Colab을 이용하였다
(런타임-런타임 유형 변경-GPU 설정을 해줘야 한다)
2. 셋팅 파라미터는 추가로 건들지 않았다. 
3. 데이터셋은 네이버 영화 리뷰 감성분석 데이터셋을 활용했다
(https://github.com/e9t/nsmc/)

 


이후에는 한국어 multi label 감성분석을 시도해볼 예정이다.