데이터사이언스 이론 공부

BERT 모델에서의 임베딩 벡터 추출 방식에 관하여

soopy 2022. 12. 17. 08:53
728x90

사전 학습된 BERT 모델에서의 임베딩 벡터 추출

 

  • 먼저 각 문장에 [CLS], [SEP], [PAD] 토큰을 추가한다.
    • CLS 토큰은 각 문장의 맨 앞자리에 추가 생성한다.
    • SEP는 문장의 끝에 추가 생성한다.
    • PAD의 경우 모든 입력 문장의 길이를 맞춰주기 위해 문장 최대 길이(max_seq_len)에 미달하는 문장은 padding한다.
  • 각 문장을 vocab 딕셔너리와의 매핑을 통해 int로 변환한다.
  • 각 단어를 설정한 embedding_dimension 크기만큼의 벡터로 임베딩한다.
    • BERT-base 모델의 경우 각 토큰 당 768차원의 임베딩 벡터로의 변환을 요구한다.
여기까지의 과정이 input_ids의 생성 과정이다.

 

  • 실제 문장의 영역과 PAD 영역의 구분을 위해 attention_mask를 생성한다. 실제 단어에 해당하는 자리(인덱스)는 0, PAD 자리는 1로 하는 리스트를 생성한다.
  • 여러 문장 간 구분이 필요한 다운스트림 Task의 경우 token_type_ids를 생성한다. 이는 문장의 구분을 위해 사용한다.
여기까지하면 Task에 따라 input_ids, attention_mask 두 가지의 입력 또는 token_type_ids가 추가된
세 가지의 입력 데이터가 생성된다.

 

위 과정은 사전에 준비된 BertTokenizer를 통해 간단히 준비할 수 있다.

from transformers import BertTokenizer
text = ['I love Paris']

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
inputs = tokenizer.encode_plus(text, 
                      truncation = True, 
                      add_special_tokens = True, 
                      max_length = 7, 
                      padding = 'max_length')

>>>
[{'input_ids': [101, 1045, 2293, 3000, 102, 0, 0], 
  'token_type_ids': [0, 0, 0, 0, 0, 0, 0], 
  'attention_mask': [1, 1, 1, 1, 1, 0, 0]}]

토크나이저를 통해 준비된 입력값을 pre_trained model에 입력하면 문장과 각 단어의 특징이 반영된 임베딩을 획득한다.
종류는 아래와 같다.

  • hidden_representation(hidden_states)
  • cls_representation(pooler_output)

첫번째 hidden_states는 총 12번의 인코더(최종 인코더)를 거친 결과로 각 문장별로 각 단어에 대한 임베딩 값을 출력한다.
(bs, seq_len, emb_dim)

두번째 pooler_output은 최종 인코더를 거친 결과 중 CLS 토큰에 대한 임베딩값을 출력한다. (bs, emb_dim)

만약 BERT 모델의 from_pretrained argument에서 output_hidden_states=True로 설정했다면 12개의 인코더 기준으로 첫 인코더의 입력값 임베딩부터 최종 결과물까지 각 인코딩 결과물 총 13개의 출력값을 함께 획득할 수 있다. 이는 반드시 최종 인코딩 결과 만이 성능이 우수하다고 장담할 수 없어 각 인코딩 레이어에서 얻은 결과들을 조합하여 가중합을 하거나 하는 방식의 결과로 모델 성능을 향상시키기 위함에 있다.

 

Classification task별 BERT fine-tuning 접근법

학습과정에서 사전 학습된 BERT를 단순히 특징 추출기로 활용한 뒤 추출한 데이터를 토대로 task에 맞는 분류 작업을 진행하는 경우가 있다. 이 경우 BERT 모델의 weight값을 변경하는 과정이 없으므로 fine-tuning에 해당하지 않는다.
fine-tuning은 evaluation을 통한 back-propagation의 영향이 BERT 모델의 weight까지 미치도록 설계된 경우를 말한다. 이 경우는 BERT의 특징 추출 성능에 대한 세부 조정을 가하는 것이므로 단순히 특징 추출기로서만 활용하는 것이 아니게 된다. 이 둘을 구분할 필요가 있다.

  • 긍부정 분류, 감정 분류, 자연어추론(NLI)등이 존재한다. 이는 최종 인코더의 결과 중 CLS 토큰에 대한 표현(representation)을 softmax 레이어에 통과시켜 학습시킨다.
  • 질문-응답 Task의 경우 SQUAD라는 스탠포드 질문응답 데이터셋의 사례가 있다. 이는 응답과 그 외 문장이 포함된 ‘단락’에서 질문에 대한 응답 문장을 추출하는 방식으로 학습을 진행했다. 학습데이터로는 질문과 단락이 합쳐진 다수의 문장을 사용하며, 인코더를 거쳐 나온 결과 중 단락에 해당하는 표현(representation)을 사용하여 학습, 평가를 진행한다. (token_type_ids 데이터가 활용되는 순간이다.)
    평가는 단락에 해당하는 문장 내 각 단어들을 시작단어와 끝단어에 각각 내적하여 얻은 결과 벡터를 softmax에 대입하여 시작 단어지점과 끝 단어 지점이 1에 가까운 확률이 나오도록 학습한다. 그러므로 필요한 label은 시작 단어지점만 1, 나머지는 0으로 표기된 단락길이와 동일한 리스트, 그리고 끝 단어 지점만 1인 리스트 이렇게 두 개가 필요하다. 그렇게해서 모델 출력값으로 시작지점 점수, 끝지점 점수가 담긴 두 리스트를 argmax를 통해 해당 지점의 인덱스를 획득한다.
  • 개체명 인식(NER) 각 단어의 개체를 분류하는 Task로 문장 내 특정 단어가 지정한 개체에 해당하는지를 두고 학습한다. 그러므로 각 단어가 어떤 객체(Class)에 속하는지에 대한 label을 활용한다. (이미지 처리에서 semantic segmentation와 비슷한 것 같다.)
728x90
728x90