강의 자료
이번 강의 내용은 다음과 같다.
강의 발표자는 프린스턴 대학 교수인 Danqi Chen이다.
Question Answering이 뭘까?
시스템이 자동적으로 자연어 질문에 대해 응답하는 것이다. QA 시스템은 1960년대부터 연구되어졌다.
QA시스템은 구글 검색기에서도 사용이 되고, Alexa같은 홈 스마트 기기에서도 활용되고 있다.
(1) 질문을 하면
(2) 여러 답변을 생성해내고
(3) 답변 후보들을 점수화해서
(4) 합치고 랭킹을 만들어서
(5) 답변을 하는 것이다.
최신 QA 시스템들은 end-to-end 훈련을 기반으로 하고 BERT와 같은 pre-trained 모델을 사용한다.
오늘은 Knowledge based QA, Visual QA 등, 구조화 되지 않은 텍스트를 기반으로 질문에 대해 답변을 어떻게 하는지 알아볼 것이다.
Reading comprehension은 독해력이다.
다음 단락을 읽고 문제를 풀어보자.
답은 German이다.
다른 문제도 풀어보자.
답은 Hindi이다.
인간은 이런 문제를 어렵지 않게 해결할 수 있지만, 기계는 이러한 작업을 어려워한다.
독해력에 대해서 우리는 왜 생각해야할까?
단락을 읽고 정보를 추출하는 문제도 독해력에 속한다. 우리는 쉽게 ?에 해당하는 것이 Columbia University라는 것을 알 수 있다.
문장 구조에 따라 주어와 목적어등을 이해하는 것도 독해력이다.
그럼 당연히 QA 시스템을 개발하기 위해서는 필요한 것이 있다.
바로 Dataset이다.
Stanford question answering dataset을 줄여서 SQuAD라고 한다.
🧚 평가 방식
완전히 맞았는지(exact match) 확인하고 partial credit인 F1을 확인한다.
그럴듯한 답변이 여러개 있을 수도 있기 때문에 3개의 gold 답변이 수집된다.
-> 각 정답에 대해 예측된 답과 각 정답을(a,an,the,문장 부호는 제거) 비교해서 최대 점수를 구한다. 마지막으로, 모든 예제의 평균을 구한다.
Q: What did Tesla do in December 1878?
A: {left Graz, left Graz, left Graz and severed all relations with his family}
-> 그럴 듯한 답변 3가지를 작성한다.
Prediction: {left Graz and served} -> 실제 답
Exact match: max{0, 0, 0} = 0
-> 완전히 맞았는지 확인한다.
F1: max{0.67, 0.67, 0.61} = 0.67
-> 얼마나 부분적으로 맞았는지 확인한다.
🤔 그럼 SQuAD를 풀기 위해서 어떻게 모델을 수립해야 할까?
문제 형식은 다음과 같다.
크게 두가지 방식으로 해결한다.
✌️ LSTM-based vs BERT models
우린 LSTM-based model을 중점적으로 살펴볼 예정이다.
🤩 seq2seq model with attention 를 다시 살펴보자.
이전에는 input source 문장을 통해 target sentences를 만들었다. 하지만 QA를 하는 우리는 passsage와 question이라는 시퀀스를 가지고 있다.
BiDAF는 the Bidirectional Attention Flow model의 줄임말이다.
맨 아래 3 layer를 Encoding 영역이라 한다.
영역을 나누어서 BiDAF에 대해 자세히 알아보자.
1. Encoding
2. Attention
BiDAF는 문맥(context)와 질문(question)사이의 관계를 두 방향으로 탐색한다.
일단 첫번째로, 문맥과 질문 사이의 유사성 점수를 계산한다.
그 다음 각각 어텐션을 수행한다.
Context to query 어텐션은 어떤 질문 단어가 가장 문맥 단어인 에 관련이 있는지 알아보는 것이다.
그래서 softmax를 통해서 가장 관련이 있는 것을 라고 한다. 그리고 가중치 합계를 통해 a를 구한다.
💛 나는 문맥 단어 i와 질문 단어 j의 유사도를 구한 값 를 j에 대해 softmax를 취해서 확률 분포(가중치)로 만들고 이 가중 평균을 로 정의했다고 이해했다.
Query to Context 어텐션은 어떤 문맥 단어가 몇개의 질문 단어들에 가장 관련이 있는지 알아보는 것이다. context-to-query와 다르게 MAX가 추가되었다.
💛 이 행렬의 각 행에 대해 최대값을 취해주면서 어떤 질문 단어가 어떤 문맥단어와 가장 관련이 있는지 확인하기 위함이다. 이 수치가 낮다면, 문맥 world와 일치할 수 있는 질문 단어가 없음을 의미한다. 그래서 최대값을 취한 후에도 가 여전히 매우 낮다면, 문맥단어와 그다지 관련성이 없는 것이다.
💛 나는 일단 어떠한 문맥 단어 i와 가장 유사도가 높은 질문 단어를 선택해서 i에 대해 softmax를 취하고, 확률 분포(가중치)로 만든 다음 가중치와 문맥 단어를 곱한 가중 평균을 b라고 정의한다고 이해했다. -> 순차적으로 문맥단어 i를 진행하지만, 질문 단어는 중복으로 뽑힐 수도 있는 것이다!
3. Modeling layer: 어텐션에서 수행한 정보들은 양방향 LSTM을 거쳐서 처리된다.(BiLSTM)
4. Output layer : 두개의 분류기는 시작점과 끝 지점을 예측한다.
점수는 77.3점을 받았다.
어텐션을 비주얼화해서 살펴보면 중요한 문장에서 진한 색으로 나타나는 것을 알 수 있었다.
우린 이미 BERT에 대해서 배웠다. 그러니 기초 BERT개념은 생략하자~
BERT에 대해서는 간략히만 알아보자.
우리가 BERT에 넣는 문자열은 다음과 같다.
Question = Segment A
Passage = Segment B
Answer = Segment B에서 두개의 end point를 예측하는 것.
그러니까 질문과 질문에 필요한 글을 같이 입력으로 넣고, 질문에 답하기 위한 문장을 글에서 뽑아내는 것이다.
손실함수를
라고 정의하자.
모든 BERT의 파라미터들을 L에 최적화해서 정의했다고 하자.
BiDAF와 비교해서 점수를 보면 BERT의 점수가 훨씬 큰것을 확인할 수 있었다.
RoBERTa, ALBERT와 같은 사전 훈련된 최신 언어모델은 더 좋은 결과를 보여주었다.
BiDAF와 BERT는 완전히 다른 모델인가?
아니다!
그럼 BERT를 더 나은 성능을 갖게 할 수 있을까? YES
두가지 idea를 가진다.
1) 연속된 단어를 MASK한다. (가린다)
2) MASK된 범위의 끝점을 사용해서 MASK된 부분을 예측한다. 범위의 정보를 두 끝점으로 압축하는 것이다.
사실 이해가 잘 안되긴한다.
아무튼 기존 BERT보다 더 성능이 좋다고 한다.
그럼 독해력이 완전히 해결되었을까?
아니다!
우리의 현재 시스템은 공격적인 예제나 외부 도메인에 대해서는 잘 작동하지 않는다.
하나의 dataset에서 훈련된 것은 다른 dataset에서 잘 실행되지 않는다. -> SQuAD에서 학습된 모델은 TriviaQA에서 정확도가 낮은편.
그래서 (Ribeiro et al., 2020): Beyond Accuracy: Behavioral Testing of NLP Models with CheckList라는 논문이 있는데, 이는 NLP model을 테스트하기위한 여러 체크리스트를 작성한 글이다.
Open domain에서는 더이상 주어진 passage만 고려하는 것이 아니다.
대신 우리는 대규모 문서 모음(위키피디아 같은)에만 접근할 수 있고, 우리가 찾는 답이 어디 있는지 모른다. 그래서 더 어렵지만 더 실용적인 문제이다!
정보 검색 및 질의 응답 시스템에서 사용되는 주요 구조 중 하나이다.
'Retriever'
역할 : 대규모 문서 집합에서 관련 문서나 정보를 빠르게 검색한다.
방법 : 키워드나 문장을 기반으로 문서를 검색한다. TF-IDF 같은 방법이나 BERT와 같은 검색 방법을 사용할 수 있다.
-> 가장 관련성이 높은 정보를 포함하고 있는 문서를 식별한다.
'Reader'
역할 : Retriever가 선택한 문서를 분석해서 구체적인 답변을 찾아낸다.
방법 : 문서의 텍스트를 깊이 있게 분석해서 특정 질문에 대한 답변을 추출하거나 생성한다. GPT, BERT와 같은 모델이 사용된다.
-> 정확하고 구체적인 답변을 제공한다. 'Reading comprehension'에서 배운 내용과 같은 작업을 수행하는 것이다.
Retriever를 훈련하기 위해서 노력한 논문 두가지가 있다.
Retriever 구조가 항상 필요한 것은 아니다.
매우 큰 언어모델을 사용하는 경우, 공개 도메인을 통해 답변을 생산해낼 수 있다.
reader모델이 필요하지 않을 수 있다.
모든 위키피디아 글을 인코딩하고 질문을 선택하면 질문을 단일 벡터로 인코딩할 수 있다. 단일 벡터에서 가장 가까운 최근접이웃 알고리즘을 통해 임베딩 벡터를 구할 수 있다.
❤️끝❤️