brunch

You can make anything
by writing

C.S.Lewis

by YJ Min 민윤정 Jul 23. 2020

자연어 이해 모델 - BERT 비긴즈

인공지능 이야기 : 자연어 이해 BERT 주요 개념과 활용 방법

오랜만에 본업으로 돌아와서, BERT 알고리즘 활용과 자연어의 응용에 대해서 정리해 보고자 한다. 2019년부터 우리 회사에서 쓰기 위해서 연구와 개발을 해왔는데, 한 번쯤 정리해두면 안 까먹을 것 같아서 정리해보고자 한다.


2020년 7월 17일, Debuild 설립자 샤리프 샤밈이라는 사람이 트위터를 통해서 인공지능이 개발한 앱에 대해서 소개해서 하루 종일 떠들썩했다. 세상에 코딩까지 대신해 주다니.. 이모지를 넣어, 버튼을 만들어 와 같은 명령을 이해해서 코드로 출력해주는 서비스이다.

https://twitter.com/sharifshameem?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor


이 사람이 사용한 기술은 오픈 AI(https://www.openai.com/) : 엘론 머스크 등이 투자한 "비영리" AI 랩에서 창시한 GPT-3라는 NLP 중 자연어 생성 알고리즘을 사용한 사례이다. 기사를 쓰는데 사람과 구분이 거의 없이 기사를 작성하거나 자연스러운 문장을 생성해내는데 특화된 인공지능 자연어 알고리즘이라고 생각하면 된다.


자연어를 이해하는 것을 넘어서 생성까지 한다고? 하지만 실생활에 적용하기에는 더 많은 난제들이 존재한다. 코드의 유지보수, 관리를 위해서 더 높은 수준의 모델링이나 코딩은 여전히 사람이 해야 하고, 기사를 쓰긴 하겠지만,  여전히 사람이 쓰는 창조적인 문학작품이나, 칼럼에, 인스타그램 태그에 우리는 더 감명받는다.


어쨌건, 여전히 필자는 모든 어학이 그러하겠으나, 어학의 기본은 듣기(Listening)라고 생각한다. 말만 잘하면 뭐하나 듣고 이해를 못하면... 마찬가지로 기계를 학습시켜서 자연어 인터페이스를 하겠다고 마음을 먹는 순간 여전히 자연어의 생성보다 나의 관심사는 자연어의 이해(Natural Language Understanding) 쪽이다. 이해하고 나서, 정형화를 하면 훨씬 , 굉장히 많은 일들을   있으니까.


 

AI가 해야 할 일등이 이렇게 많다. 이중, NLU 부분이 오늘의 주제


SQuAD와 KorQuAD

NLP를 해봤거나, 관심이 있는 사람이라면, 모두, SQuAD를 떠올릴 것이다. 미국 스탠퍼드 대학에서 시작한 프로젝트로 말 그대로 SQuADStandford Question Answering Dataset(https://rajpurkar.github.io/SQuAD-explorer/)의 약자다. 위키피디아 등 방대한 문서 풀을 통해 구축한 데이터 세트로서, 1.0, 2.0을 다운로드하고 주로 머신러닝 모델을 적용해서, EM(Exact Match Score), F1 Score 같은 정확도 관련 스코어를 측정하는 테스트 세트라고 보면 된다.

모델을 업로드하면 테스트 코드를 오픈 안 하고 이해력 및 정확도 스코어가 표시된다. 아무튼 이 SQuAD 순위표가, 소위 난다 긴다는 리서치 랩이나, 연구소에서 새로운 모델을 발표하고 겨루는 장이 돼서 유명했는데 2018년 말부터 BERT라는 녀석이 스멀스멀 등장하기 시작했다가 지금은 거의 휩쓸고 있다.


2019년에는 LG CNS AI Research Lab에서  SQuAD와 동일한 형태의 KorQuAD(https://korquad.github.io/)를 공개하였다. 개인적으로 정말 감사하게 생각한다. 다들 눈치 보면서 데이터를 나만 쌓아야지 할 때, 한국어 질의응답의 획기적인 발전이 된 것이 사실이다. LG CNS는 KorQuAD를 오픈하면서, 논문 활동이나, 발표도 활발하게 하기 시작했다. 멋있는 회사다! 2019년 이래로 비약적으로 머신러닝을 통한 한국어 이해 쪽은 획기적인 진보를 보여주고 있다.


BERT(Bidirectional Encoder Representations for Transformers)

BERT(Bidirectional Encoder Representations from Transformers)는 2018년 10월인가 논문이 발표되었고, 11월인가 12월인가 Code까지 공개된 언어 모델이다. Google에서 발표한 거다. 논문 링크는 여기다.


https://arxiv.org/abs/1810.04805 


이름을 이렇게 딱 떨어지게 짓긴 힘들다. 아무리 봐도, 그전에 bidirectional way로 언어 이해 모델에, 상당한 진일보를 보여줬던 ELMO를 의식해서 지은 게 아닌가 싶다.

여기서 ELMO와 BERT를 찾아보자. 어릴 적 추억의 어린이 TV쇼, 새서미스트리트 캐릭터


아무튼 BERT는 자연어를 이해하기 위한 양방향 학습 모델을 모두 지원하는 언어 이해 알고리즘으로 이해하면 되겠다. 양방향의 의미는 우선 책정보와 위키피디아 등 방대한 양의 Corpus를 Univeral Learning을 통해서, Pre-training 을  하고, 그 모델에, fine-tuning을 통해서, STS(Symentic Textual Similarity) 또는 Q&A 같은 특정 목적에 활용할 수 있도록 태스크 적용을 같이 결합하는, 언어 이해 모델로 이해할 수 있다. (내가 써놓고도 한국어가 참 어렵다. 영어가 이럴때는 더 단순한 듯)

left-to-right, right-to-left의 단점을 생각해보자. 복잡한 Neural Network을 한 방향을 지원한다면, 이를 재번역, 상호 교류, 한 가지 모델을 다양한 task의 적용 시 복잡도가 올라갈 것이다.    


무엇보다 BERT는, 오픈소스다!!! 구글느님이 그냥 오픈해 버리셨다. 누구나, 사용이 가능하고 모델을 진화시키거나 트레이닝을 시킬 수 있다. 그러다 보니, 여러 branch 가 나오고, 최근 SQuAD, KorQuAD의 상위는 다 이 모델이 휩쓸고 있다.  https://github.com/google-research/bert


누군가가, 갑자기 오픈소스를 라이선스 화하면 어떻게 하냐?라는 말을 물어본 적이 있다. 머신러닝 모델이라는 게 논문이 공개되어 있고, 소스와 데이터가 발표되어 있고, 지속 각 서비스나 기업들이  fine-tuning을 해가는 싸움인데 어떻게 저작권이나, 라이선스를 주장할 수 있지? 즉, 그럴 걱정은 없을 것 같다. 우선 구글만 봐도, TPU를 통해 Tensorflow, Tensorflowic BERT를 더 잘 구현/적용할 수 있는 패키지로 클라우드 사업을 하고 있다. AWS에서도 지원하지만, 참 써보면 구글이 더 쉽다고 한다. (난, AWS에서만 아직 써봐서 잘 모르겠지만.) 수많은 자연어 이해 모델들이 구글홈에 연동이 되고, 안드로이드폰에 어플리케이션과 연동되어, 탑재되고 유통된다. 이런 공개 기술을 라이선스화할 이유도 명분도 없을 것이다.


Transformer 모델

일단 BERT는 Transformer라는 모델에 기반한다.

Transformer Model Architecture

Transformer 모델은, Input TEXT를 입력받아, 기본적으로, Attention 메커니즘을 통해, 인코딩, 디코딩하는 방식의 모델이다. Covolution도, Recurrence 도 사용하지 않는다. 따라서, LSTM+RNN처럼 각 단위 워드 벡터가 시간의 연속성을 기억하고 있을 필요는 없다. 따라서 성능이 훨씬 좋다.


이 모델 역시 2017년도에 구글이 발표한 논문, "Attention is all you need"에서 나온 모델로, 당시 CNN, RNN을 훨씬 뛰어넘는 성능과 속도를 보여줘서 각광을 받았다. 특히, 구글 다국어 번역의 혁신적인 성능 향상으로 그 활용성이 증명되면서 더 유명해졌다.

https://arxiv.org/abs/1706.03762


RNN이 CNN보다 자연어 처리에 더 각광받았던 이유는, 단어의 위치에 따라서, 단어를 순차적으로 받아서 처리했기 때문에 단어의 위치를 파악하기가 용이해서였다. (단어의 위치에 따라 의미가 달라질 수 있기 때문에..)

Attention 모델로 처리하지만 문장 내에서, 단어들의 상대적인 위치를 알아야 하기 때문에, Input에 보면, Position Encoding 단계가 추가되어 있다. 즉, 문장 내의 단어의 위치 벡터 값을 워드 임베딩 벡터에 추가해주는 거다. 아래 그림에서 일반 문장을 워드 임베딩 표현 시, 그 문장 내의 단어의 위치를 수치적으로 표현한 Posional Encoding 벡터를 추가해 준다. 그래서 빠를 수밖에 없는데 이걸 병렬 처리하는 방식이다.

Transformer의 Positional Encoding. 출처 : http://jalammar.github.io/illustrated-transformer/


BERT로 다시 돌아와서

BERT가 나중에 나왔으니, 분명 기본 Transformer 보다 나아진 장점이 있었을 거다. 뭐가 나아졌는가? 기본 적으로 BERT는 트랜스포머 모델을 사용한다. 특히 Transformer 모델 중 인코더만 쓰는 형태이다.


이미지 출처 : http://jalammar.github.io/illustrated-bert/ (<-- 이 분 참.. 온갖 딥러닝 컨셉을 이미지로 비주얼라이제이션을 잘하는 분이다. 컨셉 이해 시, 여기 만한 곳이 없고.. 우선 이미지가 예쁘고!)


앞서 언급했듯이, BERT는 방대한 양의 Corpus(위키피디아, 웹문서, 책정보 등등)를 이미 트레이닝시킨 언어 처리 모델이다. 즉, 여러 장의 GPU, TPU를 써서 직접 돌릴 필요가 없다. 저 모델은 갓구글님의 깃에서, 다운로드할 수 있다. 여기에서, 우리는 2번만 신경 쓰면 상당히 다양한 자연어 처리를 할 수 있음을 쉽게 짐작할 수 있었다.


논문에서는 아래처럼 표현되어 있다.

여기서 특징은, Fine-Tuning을 여러 가지 Task들에 적용 가능하게 구성할 수 있다. 한 개 문장으로 적용부를 구성할 수도 있고, text 페어(예: 질의응답)로 구성할 수 있다. 또 꼭 머신러닝 기법이 아니더라도, 기존 검색 기법이나 다른 알고리즘 태스크로 Hyper-Parameter를 튜닝시킬 수도 있다.


BERT는 두 가지 unsupervised task로 pre-train 시킨 모델이다.


첫번째 태스크, Masked LM


Masked LM Approach of BERT


BERT에서 pre-train을 위해 사용한 Masked LM 방식은, 의도적으로 Input 값의 특정 퍼센트의 랜덤 단어를 왜곡하는 기법이다. 논문에 따르면 80%는 [MASK]로 매스킹을 하고 10%는 다른 단어로 치환하고, 10%는 그대로 둔다. 아무튼 이렇게 왜곡을 한 이후 Transformer Encoding을 거친 후에, 해당 파트를 예측(Prediction)하는 구성이다.


두 번째 Pre-train에 사용된 기법은 Next Sentence Prediction(NSP)


Q&A시스템을 만들거나, 자연어 추론을 하기 위해서는 문장과 문장 간의 관계가 중요하다. 따라서, Pre-train을 할 때 대량 Corpus에서, 한 문장과 이어진 다른 문장을 이어 붙여서, 50:50으로 바로 다음에 이어지는 문장인지, 아닌지를 판단한다.

논문에 나온 예제다. 코퍼스에서 문장을 발췌, 트레이닝해서 다음 문장이 맞는지 Labling.


Pre-training 프로세스는 스킵


우리나라에서도 BERT 가 여러 기업에서 사용되고 유명해지게 된 배경에는, 논문이 발표될 때였던가, 그 직후였던가 다국어로 Pre-train 된 모델 자체를 구글 연구진들이 공개해 버렸기 때문이다. 즉, 이제 Fine-Tuning만 신경 쓰면,  다양한 자연어 처리 태스크에 그다지 크지 않은 비용으로 자연어 처리 엔진을 직접 만들고 구동할 수 있게 되었다. 뭐. 더 궁금한 사람들은 위에서 언급한 논문에서 Pre-training Process과정을 읽어보자. 논문을 요약해놓은 수많은 사이트들도 있겠다.

시간과 돈이 들지만, 내가 풀고자 하는 문제가 특정 범주치 이상으로 성능이 올라가지 않을 때, 스크래치 레벨로 Pre-training을 물론 다시 수행해야 할 필요도 있을 것이다.  하지만, 대다수 자연어와 연관된 처리를 다국어로 이미 상당히 학습된 모델이 공개되어 있는 상황에서 어떤 Use Case에서 Pre-train부터 시켜야 하는지는 의문이다.

필자가 사용해본 바로는 다국어 Pre-train모델을 받고, Fine-tuning시 GPU 1장 꽂힌 PC서버 한기에서 짧은 시간에 트레이닝을 마친 모델을 배포해볼 수 있었다.

 

일단, Classification, Intent 분석, 유사도 판단, 질문/답변 (문장 간 관계) 세트 정도는 fine-tuning으로도 해결이 가능한 문제들이 상당수이다.


Fine-tuning with BERT


먼저, 구현하고자 하는 모델에 적합한 Pre-train 된  BERT모델을 다운로드한다. 다국어 버전을 받아야 한다. 한국어를 처리하기 위해서는.

https://github.com/google-research/bert/blob/master/multilingual.md


https://github.com/google-research/bert

위 사이트에는, fine-tuning 예제들이 나와 있다.


문장의 분류(Sentence Classification), SQuAD v1.1, v2.0, Fixed Feature 추출, Tokenization 등이 예제로 들어있다. fine tuning 예제 스크립트와 데이터셋, 추가로 다운로드하아야 할 모델들이 소개되어 있으니 테스트해보자.

특히 직접 소유한 데이터와, 알고리즘으로 이 단계를 진행할 수 있다. 실험은 지속적으로, 정량적인 평가가 가능하도록 Input과 Test 세트를 동시 개발할 필요가 있다. 모든 AI(머신러닝) 프로젝트들이 그러하지만, 실제 활용 데이터와 테스트 세트를 동시 구축해서, 지속적으로 실험하고, 트레이닝해서 성능과 성과를 높여나갈 수 있다.


맺으며

실제 서비스에 활용할 수준의 머신러닝 기반의 자연어 처리 엔진을 구성할 때 BERT는 상당히 유용한 자산이다. 해당 논문과 데이터 세트, 심지어 학습시킨 모델이 배포될 때, 자연어 처리 쪽은 큰 패러다임 전환이 있었다.

- 이제 몇몇 랩들의 소수 박사나 석사급 인재들이, 머신러닝 기반 모델링을 하고, 학습을 시켜서, Use Case를 만들던 시대가 지났다. 비싼 비용이 드는 모델은 공개, 배포되고 더 다양한 Use Case와 데이터로 더 똑똑하고 실행 가능한 서비스들이 대중화될 수 있는 기반이 마련되었다.

- 적어도, 비즈니스 세계에서는, 아주 정통파 데이터 사이언티스트들보다, 다시 프로덕트 기획자들과 프로그래머들이 더 중요해졌다. 이런 모델을 구체화하고, 실제 서비스에 제공하기 위해서는 전처리, 후처리, fine-tuning에서도 오히려 부지런한 코더들과 풀만한 가치가 있는 문제를 발견하는 기획자들이 중요해진다.

- 알고리즘과 그래프를 최소화해서 소개해 봤지만, 실제 문제가 있고, 그 문제를 풀기 위해서, 이런 기술 활용을 고려한다면, 경험자들의 도움을 받자. 필자가 운영하는 회사 같은 곳도 먹고살아야 하지 않을까. 수많은 시행착오가 현실계에 존재한다. 어떤 모델이면 적합할까. 각각의 HyperParameter는 어떻게 설정하면 좋을까. 시작은 어떻게 시작하는 게 좋을까. 상용화 수준의 서비스를 제공하기 위해 서비스 모델은 어때야 할까. 운영 중인 클라우드나 자체 환경에서 어떤 형태가 Cost-effective 할까 등등


내가 공부한 것들을 정리하기 위해서 쓰는 글이라, 디테일하게 기술하지는 않았다.

다음번에 시간이 나면, AWS위에 배포하는 BERT모델 사례를 한번 소개해 볼까 싶다.




브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari