extraction based MRC 모델링 방법, 필수 용어 간단하게 알아보기

1. 정의

 

질문의 답변이 항상 주어진 지문 내 span으로 존재하는 경우

 

SQuAD, KorQuAD, NewsQA, Natural Questions

 

 

 

 

이런 가정을 할 수 있다면 정답 text를 생성하는 문제가 아니라 지문 내 정답 text의 위치를 찾는 문제로 바뀌어 편리해진다

 

 

2. dataset

 

각각의 데이터셋을 제작한 웹사이트에서 다운 받을 수도 있지만 편리성을 위해 HuggingFace 웹사이트에서 다운 받기도 가능

 

HuggingFace는 다운받기도 쉬우면서 다루기도 쉬운 format으로 되어 있음

 

 

3. 평가방법

 

1) Exact Match

 

prediction과 ground truth가 정확하게 character level로 일치하는 경우만 1점

 

단 하나라도 틀리면 0점

 

 

2) F1 score

 

예측값과 정답의 overlap 비율을 계산함

 

EM과는 다르게 0점과 1점사이 부분점수를 받을 수 있는 soft한 metric

 

precision은 prediction의 총 token 수에 대해 prediction과 ground truth가 일치하는 token 수의 비율

 

쓸데없이 prediction이 길어지면(분모가 커지면) 아무리 겹치는 token 수가 많더라도 precision은 작아짐

 

recall은 ground truth의 총 token 수에 대해 prediction과 ground truth가 일치하는 token 수의 비율

 

recall은 겹치는 token수가 너무 적으면 감소하는 metric

 

F1은 2*precision*recall을 precision+recall로 나눈 값

 

 

 

일반적으로 Exact match가 F1에 비해 더 낮아야 정상임

 

 

 

 

F1 score 계산 예시.. ground truth 부분 그림이 좀 이상하긴 한데

 

 

prediction token = 1, ground truth token = 2

 

겹치는 token =1이므로 precision=1, recall = 1 / 2

 

F1 = 1 / (1 + 1 / 2) = 2 / 3

 

참고로 ground truth가 여러개인 경우 위와 같이 F1 score를 각각의 ground truth에 대해 모두 계산한 다음

 

실제 evaluation은 그 중 가장 높은 계산값을 score로 한다.

 

 

4. model overview

 

input raw data로 context랑 question을 받는데 preprocessing으로 context와 question을 tokenizing함

 

각각의 token을 embedding하여 vector로 만들고 pretrained extraction MRC model에 전부 넣어서 fine-tuning을 수행

 

prediction 결과가 재밌는데 start position과 end position을 주느냐? 그것은 아니다.

 

 

 

 

token embedding vector들을 넣으면 model은 start랑 end로 10과 17을 바로 내놓는 것이 아니라

 

원래는 contextualize vector를 내놓는다.

 

그냥 또 하나의 embedding vector를 내놓는다는 말인데 이 vector로부터 각각 position의 시작과 끝에 대한 점수를 계산하여

 

가장 score가 높은 시작 vector와 끝 vector를 찾은 다음에 그 위치를  구해서 바꿔서 반환하는 것임

 

start와 end 위치를 찾기만 하면 token 그대로 가져오면 되니까 단어로 만드는 것은 쉬워

 

 

5. preprocessing

 

raw data를 model에 넣어주기 전에 model이 알아먹을 수 있도록 processing하는 과정이 필요함

 

title과 context는 동일한데 거기에 여러 질의쌍이 존재함

 

주황색 질문에 대한 정답은 주황색으로 표시되어 있고 파란색 질문에 대한 정답은 파란색으로 표시되어 있음

 

 

 

6. tokenization

 

input text를 작은 단위의 token으로 나누는 것임

 

simple하게는 띄어쓰기 기준인데 복잡하게 들어가면 형태소나 subword 기준으로 나눌 수 있음

 

최근엔 Out of vocabulary 문제를 해결해주면서 정보학적으로 이득인 byte pair encoding을 주로 사용한다고 함

 

여기서도 byte pair encoding의 일종인 wordpiece tokenizer를 주로 사용하기로 함

 

 

 

wordpiece tokenizer는 자주 나오는 단어는 ‘미국’, ‘군대’, ‘두번째’처럼 하나의 단어로 만들고 자주 나오지 않는 단어는 ‘내’, ‘로’, ‘위는’,’직’으로 나뉨

 

'직위'는 같은 경우는 vocab에서 자주 나오는 단어가 아니라 ‘직’, ‘위는’으로 나뉘었다고 함

 

 

7. special tokens

 

[CLS]는 input의 시작을 나타내는 special token이고 [SEP]는 질문과 지문을 구분해주는 token이다

 

‘[CLS] 질문 [SEP] 지문’의 형태로 질문과 지문을 하나의 input으로 합쳐서 tokenizing을 함

 

질문과 지문을 special token을 이용하여 하나로 묶은 형태

 

 

[PAD]같은 경우는 모든 input의 길이를 맞추기 위해 뒷부분에 사용

 

tokenizing을 시키고 나서도 special token들은 여전히 special token 그 자체로도 남아있다

 

 

 

8. attention mask

 

입력 sequence에 대하여 attention 연산을 할 때 무시할 token을 표시하는 작업

 

0은 무시하고 1은 attention 연산에 활용함

 

보통 special token중 [PAD]는 언어적 의미가 전혀 없는 부분이므로 보통 이것을 0으로 표시함

 

model에 입력을 줄 때 attention mask도 같이 주면서 model 입장에서 무시할 부분을 알려준다

 

 

 

9. token type IDs

 

입력이 질문과 지문 2개 이상 sequence인 경우 붙여서 input으로 주더라도 질문과 지문을 정확히 구분할 수 있어야함

 

구분하는 방법은 2가지 인데 [SEP]라는 special token을 사용

 

token type IDs라고 질문의 token은 0으로 하고 지문은 1로 하여 model이 구분하여 해석할 수 있도록 input에 이것도 같이 준다

 

마지막 PAD는 그냥 편의상 0으로 준다고함

 

1인 부분이 지문이고, 여기서 정답을 찾을 수 있도록 만듦

 

 

 

10. output processing

 

supervised learning을 위해 정답도 같이 processing해서 줘야함

 

정답의 경우 context level에서 character 위치로 파악함

 

tokenize 후 학습할 때 supervise signal을 주는 방식은 정답 token이 어디있는가로 주어져서 약간의 processing이 필요하다

 

정답의 위치는 84~88

 

 

original text 내에 존재하는 84번부터 88번까지 위치를 model이 찾을 수 있도록 processing하여 supervised signal로 줘야함

 

거의 대부분은 문제 없는데 진짜 재수없게 ‘미국’같은 경우 ‘미’, ‘##국’,... 이렇게 나뉘어버리면

 

정확하게 일치하는 정답이 없을 수 있으나 그렇다 하더라도 최소한으로 포함하는 단어들(예를 들면 육군 부 참모 총장까지???)을 정답으로 포함하여 학습할 때 사용해야한다?

 

그래서 정답 후보를 조금은 더 넓게 가져와야하지 않을까..? 그랬던것 같기도 하고 ㅎㅎ?

 

 

11. fine tuning

 

실제 학습에는 pretrained bert model에 preprocessing한 input을 주면 context question embedding vector를 output으로 내놓음

 

이것은 input embedding과는 조금 다르게 contextualize된 vector임

 

이 vector를 fine-tuning하여 여러가지 용도로 사용할 수 있게 만든 것이 BERT의 가장 큰 특징인데 MRC에는 어떻게 쓸까?

 

지문 내에서 정답에 해당하는 contextualize embedding을 모두 가져와 linear transformation으로 각 단어마다 하나의 숫자가 mapping되도록 바꿔줌

 

linear transformation을 두번 하는건데 하나는 시작 위치에 대한 점수를 구하기 위한 linear transformation이고

 

다른 하나는 끝 위치에 대한 점수를 구하기 위한 linear transformation

 

각각에서 가장 점수가 높은 위치를 시작 위치와 끝 위치로 구하고 최종 답안을 내는 방식을 취한다

 

 

 

직관적인 예시로 위와 같이 5개 token의 정답 후보를 가져와 각각 linear transform하여

 

시작 위치에 대한 점수와 끝 위치에 대한 점수를 구해서 가장 높은 vector를 가져옴

 

이 linear transformation은 물론 학습 해야하는 부분임

 

실제 학습할 때는 linear transformation 수치를 softmax를 취하여 negative log likelihood로 학습한다

 

total loss는 시작 loss와 끝 loss에 대해 평균을 구하고 있네

 

 

12. post processing

 

불가능한 답을 제거하는 것으로

 

예를 들어 end position이 start position보다 앞에 있는 것

 

예측한 위치가 context를 벗어나는 경우로 input을 질문과 지문을 붙여서 주는데 상당히 드물게 질문에서 정답을 찾은 경우

 

미리 설정한 정답의 최대 길이(max_answer_length)보다 긴 정답이 발생하는 경우

 

(+추가) model이 이해하는 contextualize embedding vector를 score로 환산하여 사람이 이해할 수 있게 start, end로 바꾸는 과정

 

 

13. 최적의 정답을 찾기

 

start prediction을 위해 score가 가장 높은 N개를 찾음

 

end prediction을 위해 score가 가장 높은 N개를 찾음

 

N*N의 경우의 수에서 바로 위에서 언급한 불가능한 조합은 제거함

 

가능한 조합들에 대해 score합이 가장 높은 순서대로 정렬함

 

가장 큰 score의 조합을 최종 prediction으로 산정함

 

만약 Top-k가 필요한 경우는 위에서 정렬하여 점수가 높은 상위 k개를 출력한다

 

TAGS.

Comments