HAN_PY 2020. 10. 16. 17:16
반응형

0. 들어가면서

 기본적인 자연어 처리 흐름을 알기 위해서는 아래의 블로그에서 확인을 하자.

han-py.tistory.com/249?category=942088

 

자연어처리 개념(RNN에서 BERT)

1. RNN (Recurrent Neural Network) RNN이 왜나왔을까? 기존 신경망은 연속적인 시퀀스를 처리하기 어렵다. 따라서 입력의 순서가 중요한 분야인 자연어 처리, 음성인식, 주식, 날씨, 음악 같은 부분에서 한

han-py.tistory.com

 

1. BERT(Bi-directional Encoder Representations from Transformers) 기본 개념

 기본적으로 Pre-trained BERT에 위에 classification layer를 하나 추가해주면 다양한 NLP를 처리할 수 있다. (fine-tuning)

Transformer의 인코더만 사용해서 언어를 임베딩한다고 보면 된다. 기본적인 구성은 영어 데이터로 구성이 되어 있다. wiki나 book data와 같은 대용량 unlabeled data로 모델을 미리 학습 시킨 후에, 특정 task를 가지고 있는 labeled data로 transfer learning을 하는 모델이다.

 

1.1 BERT의 특징

 우선 학습적 측면에서 기존의 ELMo, OpenAI GPT에서는 pre-training시에 동일한 objective function으로 학습을 수행한다. 하지만 BERT는 새로운 방식은 pre-trained Language Representation으로 학습을 진행했다. 그렇다면, BERT의 pre-training이란 무엇이고 기존의 학습과 무엇이 다른지를 알아보자. pre-training의 새로운 방법론에는 크게 2가지로 나눌 수 있다. 우선 기존 방법론을 보면 ELMo, OpenAI GPT는 일반적인 language model을 사용했다. 즉, 앞의 n개의 단어를 가지고 뒤의 단어를 예측하는 모델을 만든 것이라고 할 수 있다. 따라서 unidirectional 할 수 밖에 없다.

 첫 번째 새로운 방법론은 Masked Language Model(MLM)이다. MLM은 input에서 무작위로 몇개의 token을 mask 시키는 것이다. 이를 Tranformer 구조에 넣어서 주변 단어의 내용만 보고 mask 된 단어를 예측하는 것이다. 두 번째 방법은 next sentence prediction이다. 이 방법은 두 문장을 pre-training 시에 같이 넣어서 두 문장이 이어지는 문장인지 아닌지를 맞추는 방법이다. 50:50 비률로 실제로 이어지는 문장과 랜덤하게 추출된 두 문장을 넣어서 BERT가 맞추게 한다.

 즉, BERT의 핵심은 Attention을 이용하여 만든 Transformer을 사용하지만 pre-training과 fine-tuning 시의 아키텍처를 조금 다르게 하여 Transfer Learning을 용이하게 만드는 것이 핵심이다.

 

 

 

 

 여기서 가장 중요한것은 WordPiece tokenizing이라고 보면된다. 데이터를 전처리 이후에 tokenizing하는 것인데, 이 부분하나로 영어로 모든 언어를 포함하여 쓸 수 있다. 쉽게 말하면 많이 나오는 단어수를 빈도수에 맞게 tokenizing으로 분류한다고 생각하면 된다.

 학습 시에는 2개의 token sequence를 이용해서 학습을 하게 된다. 학습을 할 때는 아래와 같이 문장1과 문장2를 넣어서 학습을 하게 된다.

 

 

2. 버트 구조(Model architecture)

 

 

https://velog.io/@jinml/BERT

BERT는 transformer 중 encoder만 사용한다. 그리고 모델 크기에 따라 base 모델과 large 모델을 사용하는데, 대부분의 NLP task SOTA는 BERT_large 모델로 이루어져 있다.

 

위 그림을 보면 input은 두개의 sentence를 받는다. sentence를 먼저 임베딩(토큰)을 한다.

그리고 transformer layer를 거친다. transformer layer에는 여러개의 self-attention과 12개의 Transformer layer를 거친다.

최종적으로는 input으로 들어왔던 것을 표현한다. 

 

 

 

3. WordPiece tokenizing

 Bert에서 tokenizing하는 방법은 WordPiece tokenizing 방법을 사용한다. 비슷한 의미로는 Byte Pair Encoding(BPE)라고도 한다. 빈도수를 기반으로 단어의 의미를 파악하고 tokenizing하는 것이다.

 

word2vec에서는 '한파이' '두파이' '삼파이'라는 단어가 있다면 모두 독립된 토큰으로 보고 독립된 단어로 여긴다. 하지만 BPE에서는 '파이'가 많이 등장한다는 것을 인지하고, tokenizing으로 단어를 잘라서 vocab을 만들게 된다. 그러면 '한파이'의 경우에 '한'. '##파이'로 나눠서 토그나이징이 이뤄진다.

 

자세한 것은 아래의 url을 따라가 보자.

han-py.tistory.com/253

 

WordPiece Model(WPM)_tokenizing

0. 들어가면서 텍스트 데이터를 학습한 모델의 크기는 단어의 개수에 영향을 받는다. RNN에서는 단어 개수에 비례하여 계산비용이 증가하기 때문에 word embedding 벡터의 종류가 제한이 생기는 문제

han-py.tistory.com

 

 

 

BPE의 순서도

 학습 데이터(tokenizing을 해야하는 대상)를 이용해서 vocab을 만든다. 즉, 1단계로 모든 단어마다 tokenizing을 진행한다. 2단계로는 빈도수가 많은 단어의 묶음을 반복하여 계속 확인을 한다. 그러면, 특정 반복을 통해 만들어진 vocab을 최종 vocab으로 저장을 한다.

 정리하면 tokenizing을 한번해서 바로 vocab을 만드는게 아니라 빈도수 계산의 반복을 통해 vocab 후보를 업데이트 하고 그런한 후보가 최종적으로 vocab이 되는 것이다.

 

예를들어 다시 말하면, 우리는 input으로 넣은 특정 문장을 vocab으로 만드는 과정을 진행하고 있다.

ex_ 짜장면이 너무 먹고 싶어 짜장면을 샀다.

 

=> 문장을 띄어쓰기 단위로 분류를 먼저 한다. ex_짜장면이/ 너무/ 먹고/ 싶어/ 짜장면을/ 샀다.

 

=> 다시 캐릭터 단위로 분류를 한다. ex_짜/장/면/이/너/무/먹/고/싶/어/짜/장/면/을/샀/다.

 

=> 처음등장하는 캐릭터가 아닌 그 다음 캐릭터에 ##을 다 붙여준다. 왜냐하면 같은 글자라고 하더라도 같은 글자라도 단어의 첫부분에 다오는 글자와 중간 부분에 나오는 글자는 다를 것이라 판단을 하기 때문이다.

ex_짜/##장/##면/##이/너/##무/먹/##고/싶/##어/짜/##장/##면/##을/샀/##다.

 

=> 단어들 중 중복되는 단어를 지운다. python으로 치면 set 을 하는 것과 같다고 생각하면 된다. 위의 예에서는 짜장면이 중복되는 단어니 생략을 한다. (vocab후보가 줄어든다.)

 

=> 지금 까지 나온 vocab을 가지고 다시 tokenizing을 진행을 하고(한국어에서는 변화가 없다.), Bi-gram pairs를 진행한다. 쉽게 말하면 단어별로 두 글자씩 묶어준다.

ex_ (짜, ##장), (##장, ##면), (##면, ##이) (너,##무) (먹/##고)..... (띄어쓰기된 단어별로 Bi-gram pairs를 한다 생각하자.)

 

=> 위처럼 분류를 하면, 가장 높은 빈도수를 가진 Bi-gram pairs(바이그램페어)를 얻을 수 있다.

ex_ 위의 예를 무시하고 가장 높은 빈도수가 (짜, ##장) - 5번 나왔다고 가정을 해보자. 이런 경우는 이부분이 중요하다고 가정을 하고 (짜, ##장)을 하나로 합쳐서 ##짜장으로 만든다.

 

=> 그러면 합친 부분을 적용시켜준다.

ex_##짜장/##면/##이/너/##무/먹/##고/싶/##어/##짜장/##면/##을/샀/##다.

 

여기까지 진행한 부분이 한 번의 반복을 돈 것이라고 할 수 있다. (1 iteration 완료)

만약 같은 빈도수가 나온다면 가장 첫 번째의 빈도수를 선택을 한다.

 

Vocab의 생성은 정해진 iteration을 모두 수행 후 만들어 지는 것이지 iteration 마다 Vocab을 생성하는 것이 아니다.

 

 

반복 후에도 vocab에 존재하지 않는 단어는 UNK 토큰(없는 토큰)으로 바꿔서 학습을 하게 된다.

 

 

 

학습 시 입력값

 학습 시 Input 문장은 Token Embeddings, Segment Embeddings, Position Embeddings로 세 가지로 나눠서 들어가게된다.

# input 문장
my dog is cute. he likes playing

 

Token Embeddings - 입력 토큰에 대한 word 임베딩을 거친 것이다.

Segment Embeddings - 어느 문장인지에 대한 정보가 들어간다.

Position Embeddings - 각각의 단어에 순서에 맞게 0부터 하나씩 번호를 넣어준다.

 BERT의 input은 위의 그림과 같이 3가지 embedding의 합으로 이루어져있다.

 

 

위의 그림을 보면 sentence의 첫번째 token은 언제나 CLS(special classification token)이다. CLS token은 transformer 전체층을 다 가치고 나면 token sequence의 결합된 의미를 가진다. 그리고 간단한 classifier를 붙이면 단일 문장, 또는 연속된 문장의 classification을 쉽게 할 수 있다.

 

 

4. classification layer

 우리는 앞서 설명에서 버트 모델에 classification layer를 올려서 사용한다고 했다. 그러면 그러한 classification layer에 대해 알아보자. 크게 아래의 4가지 layer를 쓴다고 bert 논문에 나와있다.

 

https://arxiv.org/abs/1810.04805

Sentence pair classification

2가지 sentence가 어떤 관계를 가지는가를 설명한다. A 다음 B문장이 자연스러운 관계(문맥상 흐름)를 가지는 것에 대한 것과 의미상으로 유사한가를 분류한다.

 

Single sentence pair classification

하나의 문장을 넣고, 긍정이냐 부정이냐 중립이냐를 분류한다.

 

Question and answering(SQuAD)

SQuAD는 질문이 들어가고, 질문에 대한 답이 포함된 단락이 들어가므로 답변을 찾아낸다. output으로 정답이 나오는 것이아니고, 단락 내부의 index값을 출력한다. ex_ 5번쨰 토큰에서 7번째 토큰까지가 정답입니다.

 

Single sentence tagging

각각의 토큰에 대한 출력을 만들어 낸다. 즉, 각각의 토큰에 대한 객체명인 정보 값을 내준다.(BIO tag)

 

 

 

이제 버트를 알아보러 가보자!

han-py.tistory.com/267

 

[BERT] 버트 활용하기 기초

0. 들어가면서  실제로 우리가 버트 모델을 훈련하기 위해서는 많은 데이터와 시간이 필요하다. 그러나 기존에 구글에서 공개한 버트 모델을 활용하면 쉽게 한글 데이터를 분석할 수 있다. 구글

han-py.tistory.com

 

반응형