MRC 및 관련 개념들

DONGJIN IM·2022년 7월 8일

MRC 이론

목록 보기
1/4
post-thumbnail

MRC

개념

  • Machine Reading Comprehension(기계 독해)

    • Reading : 지문 및 질의를 읽음
    • Comprehension : 질문에 대한 답변 수행
  • 주어진 지문(Context)를 이해하고, 주어진 질의(Query/Question)의 답변을 추론하는 문제

  • 사용자의 질문을 답할 수 있는 Question Answering Task

MRC 종류

Extractive Answer Datasets

  • 질의에 대한 답이 항상 주어진 지문의 Segment(Span), 즉 부분으로 존재

  • 지문에서 "추출"하여 질의에 대한 답변을 반환함

  • SUqAD, KorQuAD, NewsQA, Natural Questiosn 등

Descriptive/Narrative Answer Datasets

  • 답이 지문 내에서 추출한 Span이 아닌 질의를 보고 생성된 답변 Sentence를 반환

Multiple-choice Datasets

  • 질의에 대한 답을 여러 개의 Answer Candidates 중 하나를 고르는 형태

  • 객관식 문제

  • MCTest, RACE, ARC 등

MRC의 어려운 점

  1. Paraphrasing

    • 다른 단어, 같은 의미인 문장을 이해해야 할 필요성이 존재

    • (ex) "A는 미션을 성공했다"와 "A는 주어진 일을 완료했다" 문장의 경우 둘 다 성공했다는 의미이지만 문장 구조는 다르다. 이 2문장을 동일하다고 이해해야 한다.

  2. Coreference

    • 지칭 대명사가 무엇을 지칭하는지 알아야 함

    • 지칭대명사가 곧 답이 되는 경우도 많으므로 매우 중요한 Task

  3. Unanswerable Questions

    • 답이 없는 Case(No Answer Case)에 대한 처리
  4. Multi-hop Reasoning

    • 문서 1개가 아닌 여러 개의 Document에서 질문에 대한 답을 찾아야 하는 문제

    • 여러 개의 Document를 동시에 고려하여 답이 얻어짐


MRC 평가 방법

Exact Match

  • Extractive Answer나 Multiple-choice answer datasets에서 활용되는 Metric

  • 예측한 답과 Ground-truth가 정확히 일치하는 샘플의 비율

  • 부분 점수 없이 답이 "완전히" 동일해야 점수를 얻을 수 있음

F1-score

  • Extractive Answer나 Multiple-choice answer datasets에서 활용되는 Metric

  • 예측한 답과 Ground-truth 사이의 Token Overlap을 F1-score를 통해 계산

  • 부분 점수가 존재

ROUGE-L Score

  • Descriptive Answer Datasets에서 활용되는 Metric

  • Ground-truth와 예측한 답 사이의 Overlap을 계산

  • L : LCS 기반

    • LCS : Longest common subsequence

BLEU

    • Descriptive Answer Datasets에서 활용되는 Metric
  • 예측한 답과 Ground-truth 사이의 Precision


Unicode & Tokenization

Unicode

  • 모든 문자를 일관되게 표현하고 다룰 수 있도록 만들어진 문자셋

  • U+AC00

    • U+ : 유니코드임을 알리는 접두어
    • AC00 : 16진수
    • U+ACOO가 "가"라는 글자를 나타낼 수 있다고 약속된 문자셋

인코딩

  • 문자를 컴퓨터에서 저장 및 처리할 수 있도록 이진수로 바꾸는 것

  • UTF-8

    • 현재 가장 많이 활용하는 인코딩 방식
    • 문자 타입에 따라 다른 길이의 바이트를 할당
      • 1 Byte : Standard ASCII
      • 2 Byte : Arabic, Hebrew, most European Scripts
      • 3 Byte : BMP(Basic Multilingual Plane); 대부분의 현대 글자(한글 포함)
      • 4 Byte : 이모지를 포함한 모든 Characters

Python에서의 Unciode

  • ord : 문자를 Unicode의 Point로 변환함

  • chr : Unicode Point를 문자로 변환함

    • ord로 얻은 값, hex(ord)로 얻은 값 모두 chr을 통해 변환 가능함
  • 한국어 Unicode 특징

    • 한자 다음으로 많은 코드를 차지함

    • 완성형 + 조합형을 통해 한글을 표현 가능

    • 완성형 : '가', '각' 등 현대 한국어 자모 조합으로 나타낼 수 있는 모든 글자 11,172자

    • 조합형 : 조합하여 글자를 만들 수 있는 초/중/종성

      • (ex) '가' 자체는 완성형, '가'를 'ㄱ'+'ㅏ'로 표현하면 조합형

Tokenizing

Tokenizing

  • 텍스트를 "토큰" 단위로 나누는 것

  • 단어(띄어쓰기 기준), 형태소, Subword 등 여러 토큰 기주을 활용함

Subword 토크나이징

  • 자주 쓰이는 글자 조합은 1 토큰으로, 자주 쓰이지 않는 조합은 Subword로 쪼개 각각을 하나의 토큰으로 활용하는 것

  • (ex) '아버지 가방에 들어가신다' 문장을 Subword로 따지면 '가방'을 '가'+'##방'으로 표현된다. 이는 '가방'이라는 단어가 자주 쓰이는 조합이 아니라고 판단하여 해당 단어를 2개의 Subword로 구성된 단어로 파악하여 쪼갠 이후 '가'와 '##방'을 Subword로 고려해 2개의 토큰으로 이루어졌다고 판단하는 것이다

  • '##'

    • 디코딩(Tokenizing) 과정을 도와주기 위한 문자
    • 해당 토큰을 앞 토큰에 띄어쓰기 없이 붙여서 디코딩 해야함을 알림

BPE(Byte-Pair Encoding)

  • 데이터 압축용으로 제안된 알고리즘

    • NLP에서 자주 활용됨
  • 순서

    1. 가장 자주 나오는 글자 당뉘 Bigram(or Byte Pair)를 다른 글자로 치환함
    2. 치환된 글자를 저장함
    3. 1 ~ 2번을 반복
    • aaabb -> Zabb(Z = aa) -> ZYb(Z=aa, Y=ab)로 치환하여 관리
  • 최근 OOV 문제를 해결할 수 있고 정보학점 이점을 지닌 BPE를 자주 활용

    • Subword를 활용하므로 OOV 문제가 많이 없음
    • 특히 WordPiece Tokenizer를 활용함

KorQuAD

KorQuAD란?

  • LG CNS가 공개한 질의응답/기계독해 한국어 데이터셋

  • 인공지능이 한국어 질문에 대한 답변을 하도록 구성된 질의응답 데이터셋

  • 누구나 데이터를 활용할 수 있고 공개된 리더보드에 평가를 받을 수 있음

    • 객관적인 기준을 가진 연구 결과 공유가 가능해짐
  • v1.0, v2.0 존재

    • 2.0 : 문서의 길이가 길고, 복잡한 표와 리스트를 포함하는 HTML 형태로 구성되어 있음
  • 답변을 유추할 수 있는 문장이 중요하기 때문에 답변의 위치(answer start_index)까지 같이 출력하도록 되어 있음

    • 답변 단어가 여러 개 존재할 수도 있지만, 답을 유추할 수 있게 만들어주는 문장은 매우 적기 때문에 이런 방식을 활용

KorQuAD 데이터 수집 과정

  • SQuAD v1.0의 데이터 수집 방식을 벤치마크함
  1. 대상 문서 수집

    • 위키 백과에서 수집한 글들을 문자 단위로 정제
    • 짧은 문단, 이미지/표/URL이나 수식이 포함된 문단 등을 제거
  2. 질문/답변 생성

    • 크라우드소싱을 통해 질의응답 70000+쌍 생성
  3. 2차 답변 태깅

    • 앞에서 생성한 질문에 대해 사람이 대답하며 Human Performance 측정

KorQuAD 데이터셋 활용하기

from datasets import load_dataset

dataset = load_dataset('squad_for_v1', split='train')
# v2.0을 가지고 오고 싶다면 squad_for_v2로 지정하면 됨
# split을 valid, test로 지정하여 다른 용도의 데이터도 가져올 수 있음
  • Huggingface의 Dataset 라이브러리를 활용하는 방법

  • 접근 가능한 모든 데이터셋이 Memory-mapped, cached 되어 있어 메모리 공간 부족이나 전처리 과정 반복의 번거로움 등을 피할 수 있음

profile
개념부터 확실히!

0개의 댓글