자연어처리

BERT Transformers 라이브러리를 사용한 자연어처리 [MASK]기법

coding art 2022. 6. 22. 11:31
728x90

Bidirectional Encoder Representations From Transformers

 

참조: BERT 101 ? State Of The Art NLP Model Explained

https://huggingface.co/blog/bert-101?text=The+goal+of+life+is+%5BMASK%5D. 

 

머신 러닝에 있어서 단일 수기문자를 인식하는  MNIST가 가장 잘 알려진 언어 관련 주제  일 것이다. 이 보다 더 나아가서 컴퓨터가 단어수준을 넘어서 문장을 이해하는 단계가 바로 인간의 지능에 근접한 인공지능화의 지름길일 것이다.

언어를 배워서 이해하고 자연스럽게 사용하게되는 과정을 살펴보면 초기 단계에는 하나 둘 간단한 단어를 중심으로 학습을 하게 되고 결국 어느 정도 규모가 있는 텍스트 기반의 단어장(corpus)을 형성하게 된다. 이 단어장의 단어들은 단순한 단어들의 집합이 아닌 언어의 사용에 따라 주어 동사 목적어 부사 형용사들을 적절하게 연결하여 의미가 있는 문장을 형성하게 되는 과정에서 사용되는 즉 관계설정형 단어를 의미한다.

 

따라서 단어장 corpus 를 준비하려면 시대성 반영은 물론이고 의미있는 영역의 문장들을 대상으로 추출해야 한다. 만약 옛날 조선시대에 사용된 문장들을 사용해서는 지금의 언어와는 너무나 차이점이 크므로 의미있는 단어장 준비가 불가능할 것이다. 즉 단어장을 만들기 위한 문장들의 대상 선정이 너무나 중요하게된다. 

 

상당히 진보된 자연어 처리기법인 BERT에 있어서 단어장을 형성하기 위해 사용한 문장들의 출처는 2종류이다. 하나는 구글이 제공하는 ~8M 문장 및 단어수를 포함하는 BookCorpus 이다. BookCorpus는 16개의 다른 하위 장르(예: 로맨스, 역사, 모험 등)의 11,038권(약 7400만 문장 및 1G 단어)을 포함하는 미출간 작가가 쓴 무료 소설 책들의 대규모 컬렉션이다.

또 다른 하나는~2.5B(10억) 단어수(words)의  Wikipedia이다.

 

이와같이 제법 거대한 정보 데이터세트를 학습하게 되는 BERT의 딥 지능은 영어뿐만 아니라 오늘날 우리 문명의 많은 부분을 포함한다. 학습규모는 구글의 64개의 TPU(Tensor Processing Unit) 를 사용하여 4일이 걸린다. 학습된 내용을 사용함에 있어 사용자가 그때 그때 학습해서 사용하는 것이 아니라 Transfer Learning 방식에 의해 그대로 사용하거나 아니면 fine tuning 하여 사용하도록 한다.

 

BERT모델이 상당히 크기때문에 자연히 스마트폰이나 라즈베리파이 또는 젯슨 나노 보드와 같이 보다 작은 모델들에 대한 수요가 있을 수밖에 없어 2020년 3월에 23개 모델이 배포되었다. DistilBERT 가 바로 그것이며 60% 속도로 95%성능을 발휘한다. 그밖에도 다양한 호환 모델과 커뮤니티 모델이 있다.

 

마스크 언어 모델(MLM: Masked Language Model)-->괄호 메우기 모델

언어 모델링에서 가장 보편적인 문제 중의 하나이다. 다음 문장에서 [MASK] 에 적절한 단어는 무엇인가?

"Artificial intelligence [MASK] take over the world."

이 문제에 해답을 얻으려면 좌->우 아울러 우->좌 로 쌍방향성으로(bidirectionally) 생각해 봐야 적합한 단어를 생각해 낼 수 있을 것이다.

[MASK]에 적합한 단어 후보는 can, will, to, ##s, would 들이 될 수 있다. can의  확률 값이 가장 높다. 3번째 ##s는 intelligences 즉 복수형을 취한다는 의미이다. 마지막 would 까지 포함 여러 개의 답이 있을 수 있다. 하나의 답을 결정하기 위해서는 앞이나 뒤 문장이 추가로 필요할 것이다.

 

Colab에서 BERT 를 사용하여 다음과 같이 이 문제를 처리해 보자.

!pip install transformers # transformers 라이브러리를 설치하자.
 
from transformers import pipeline
unmasker = pipeline('fill-mask', model='bert-base-uncased')
 
#첫번째 문제
unmasker("Artificial Intelligence [MASK] take over the world.")
 
[{'score': 0.3182411789894104,
'sequence': 'artificial intelligence can take over the world.',
'token': 2064,
'token_str': 'can'},
{'score': 0.18299679458141327,
'sequence': 'artificial intelligence will take over the world.',
'token': 2097,
'token_str': 'will'},
{'score': 0.05600147321820259,
'sequence': 'artificial intelligence to take over the world.',
'token': 2000,
'token_str': 'to'},
{'score': 0.04519503191113472,
'sequence': 'artificial intelligences take over the world.',
'token': 2015,
'token_str': '##s'},
{'score': 0.045153118669986725,
'sequence': 'artificial intelligence would take over the world.',
'token': 2052,
'token_str': 'would'}]
 
 
#두번째 문제: 로켓엔진은 발사를 위해 추진제(propellent) 와 [MASK]가 필요하다.
unmasker("Rocket engine needs propellent and [MASK] to launch.")
fuel, energy, power, water, oxygen 이 제시되었다. 산화제인 oxygen이 적합한 답일 것이다.
 
괄호 메우기 문제에서 어느 정도 인공지능으로서의 성과를 느껴 볼 수 있다. 하지만 아직 2개 이상의 괄호 즉 [MASK] 가 있는 문제를 처리할 수 없는 수준이다.
 
현재의 BERT  알고리듬은 LSTM 이어 소개된 ATTENTION  알고리듬에서 발전된 것으로 소개되고 있다. 따라서 BERT 알고리듬을 이해하려면 LSTM, ATTENTION 알고리듬을 검토해 보아야 할 것이다.

easy_bert.ipynb
0.00MB