HAN_PY 2020. 10. 30. 15:05
반응형

0. 들어가면서

 실제로 우리가 버트 모델을 훈련하기 위해서는 많은 데이터와 시간이 필요하다. 그러나 기존에 구글에서 공개한 버트 모델을 활용하면 쉽게 한글 데이터를 분석할 수 있다. 구글에서 공개한 버트 모델은 학습한 데이터에 따라 여러 형태로 공개가 되어 있지만, 대부분은 영어를 위한 모델이다. 우리는 한글 데이터를 활용한 버트를 활용할 것이기 때문에 다국어 지원을 위한 버트 모델을 활용할 예정이다.

 

 버트를 활용한 실습을 진행해 볼까 한다. 가장 기초가 되는 영어 데이터를 시작으로 한글 텍스트 데이터를 버트를 활용하며 문장 분류, 자연어 추론, 개체명 인식, 텍스트 유사도, 기계 독해 등을 해결해 보자.

 

 사실 버트 자체를 사용한다는 말은, 버트를 구현한다는 말은 아니다. 즉, 사전 훈련이 되어있는 모델인 버트를 가져와서 사용을 하는데 그 부분에 활용방향에 대한 추가적인 미세 조정을 통해 원하는 모델을 만드는 것이다. 자세한 내용은 아래의 bert의 기초를 확인하면 되고, 코드 위주로 공부를 하려면 바로 아래로 내려가서 따라하면된다.

 

han-py.tistory.com/252

 

자연어처리_BERT 기초개념(완전 초보용)

0. 들어가면서  기본적인 자연어 처리 흐름을 알기 위해서는 아래의 블로그에서 확인을 하자. han-py.tistory.com/249?category=942088 자연어처리 개념(RNN에서 BERT) 1. RNN (Recurrent Neural Network) RNN이..

han-py.tistory.com

 위의 내용을 봤다면, 기초적인 버트는 transformers의 encoder 부분을 활용한다는 것을 알 수 있다. 우선은 우리는 공신력 있는 오픈소스중 사용성이 편리한 transformers 라이브러리를 사용할 것이다. 아래의 라이브러리는 사전 학습된 상태에서 시작하는 주제의 연국를 다룰 때 유용하고 새로운 모델 연구의 베이스라인 성능 측정을 할 때 많이 사용된다. pip로 쉽게 설치가능하다.

# 관련 문서
# https://huggingface.co/transformers/index.html
$ pip install trnasformers

 

 

 

1. 버트 활용 준비

 

버트를 활용하기 위해서는 기본적으로 2 가지 모듈을 불러와야 한다. 하나는 토크나이저가 될 것 이고, 다른 하나 가중치를 가지고 있는 bert 모델이다.  주의할 점은 전처리의 경우 모델을 사전 학습시킬 때와 동일한 규칙을 사용해야 하기 때문에 모델을 학습할 때 사용했던 것과 동일하게 사용해야한다. 

 

 우선은 다국어(102개 언어) 토크나이저를 한글에 적용해 보고자 한다. 아래와 같은 코드를 사용해서  토크나ㅣ저를 자동으로 다운로드하자.

from transformers import *
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')

huggingface.co/transformers/index.html

 

Transformers — transformers 3.4.0 documentation

Blenderbot (from Facebook) released with the paper Recipes for building an open-domain chatbot by Stephen Roller, Emily Dinan, Naman Goyal, Da Ju, Mary Williamson, Yinhan Liu, Jing Xu, Myle Ott, Kurt Shuster, Eric M. Smith, Y-Lan Boureau, Jason Weston.

huggingface.co

 위는 관련 문서고, 아래는 코드를 볼 수 있는 깃헙이다.

github.com/huggingface/tokenizers

 

huggingface/tokenizers

💥Fast State-of-the-Art Tokenizers optimized for Research and Production - huggingface/tokenizers

github.com

 

2. 버트 문장 전처리 

 문장을 버트에 활용하기 위해서는 활용하는 특정 분야에 맞게 다양한 입력값으로 치환해야한다. 여기서 버트는 일반적으로 3가지 입력값을 넣어줘야한다. 그 버트에 필요한 입력값인 3가지에 대해 우선 알아보자. 전처리 시 계속 나올 예정이기 때문에 개념 정도만 이해해 주고 넘어가면 된다.

 

2.1 input_ids

 문장을 토크나이즈해서 인덱스 값으로 변환하는 것이다. 일반적으로 버트에서는 단어를 subword 단위로 변환 시키는 워드 피스 토크나이저로 활용을 한다.

2.2 attention_mask

 패딩된 부분에 대해 학습에 영향을 받지 않기 위해 처리해 주는 입력값이다. 버트 토크나이저에서는 1은 어텐션에 영향을 받는 토큰을 나타내고, 0은 영향을 받지 않는 토큰을 나타낸다.

2.3 token_type_ids

 두 개의 시퀀스 입력으로 활용할 때 0과 1로 문장의 토큰 값을 분리한다. [CLS]는 문장의 시작을 의미하고, [SEP]는 문장이 분리되는 부분을 의미하는 토큰이다.

 

 

3. 버트의 스페셜 토큰

 버트 토크나이저에서는 문장의 시작이나 끝, 모델별 목적에 맞게 스페셜 토큰을 활용한다. 자주 사용되는 스페셜 토큰을 아래에서 확인해 보자.

스페셜 토큰 역할
[UNK] 모르는 단어에 대한 토큰
[MASK] 마스크 토큰, 사전 학습에서 활용
[PAD] 최대 길이를 맞추는 용도
[SEP] 문장의 끝을 알림
[CLS] 문장의 시작을 알림

 

 버트에 필요한 입력값의 형태 데이터를 변환시키는 코드를 직접 구현해도 되지만, 허깅페이즈의 Tokenizer 라이브러리를 활용하면 좀 더 쉽고 빠르게 버트의 입력값을 구할 수 있다. 위의 토크나이즈에서 말한 웹 사이트에 공식 문서들이 있으니 참고하자. 간단히 라이브러리에 대해 설명하면, 우리가 쓰는 encode_plus 기능은 버트에 필요한 입력 형태로 변환할 뿐만아니라 문장을 최대 길이에 맞게 패딩하고 결괏값을 딕셔너리로 출력해준다.

 

3.1 encode_plus의 순서

  1. 문장을 토크나이징한다.
  2. add_special_tokens를 True로 지정하면 토큰의 시작점에 '[CLS]' 토큰, 토큰의 마지막에 '[SEP]' 토큰을 붙인다.
  3. 각 토큰을 인덱스로 변환한다.
  4. max_length에 MAX_LEN 최대 길잉 ㅔ따라 문장의 길이를 맞추는 작업을 진행하고, pad_to_max_length 기능을 통해 MAX_LEN의 길이에 미치지 못하는 문장에 패딩을 적용한다.
  5. return_attention_mask 기능을 통해 어텐션 마스크를 생성한다.
  6. 토큰 타입은 문장이 1개일 경우 0으로, 문장이 2개일 경우 0과 1로 구분해서 생성한다.
    1. 문장이 바뀔 때 마다 0에서 1로 바뀐 후 다시 1에서 0으로 바뀐다.
    2. ex [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0] <= 3문장이라는 것을 알 수 있다.

3.2 encode_plus 코드 구현

  def bert_tokenizer(sent, MAX_LEN):
      
      encoded_dict = tokenizer.encode_plus(
          text = sent,
          add_special_tokens = True, # 시작점에 CLS, 끝점에 SEP가 추가된다.
          max_length = MAX_LEN,
          pad_to_max_length = True,
          return_attention_mask = True
      )
      
      input_ed = encoded_dict['input_ids']
      attention_mask = encoded_dict['attention_mask']
      token_type_id = encoded_dict['token_type_ids']
      return input_id, attention_mask, token_type_id

 

 

 이제 버트를 활용한 한국어 텐스트 분류 모델을 만들러 가보자!

 

 

반응형