BERT는 Fine-tuning 하여 다양하게 사용할 수 있는데
그 중 하나가 질의응답(Question Answering)이다.
조금 더 공부해봐야 확실하게 말할 수 있겠지만, 이 글에서 말하는 질의 응답은 대화형 챗봇과는 다른 맥락이다.
Fine-tuning이란?
- 우리가 풀고자 하는 태스크의 데이터를 사전학습 된 BERT에 추가로 학습시키는 것
- 가중치 업데이트
- 실질적으로 BERT를 활용하는 작업이라고 볼 수 있다.
이 글에서 말하고자 하는 '질의 응답'을 정의하자면
- 추출형 질의응답(extractive question answering)
- 질문에 답을 하는 것
- 구체적으로는, 질문(question)에 대한 답(answer)을 지문(context)에서 찾는 것
- 지문에 대해서 질문을 제시하고 지문 자체에 존재하는 텍스트 범위를 해당 질문에 대한 답변으로 추출하는 작업
이게 무슨 말인지는 아래 예시를 보면 이해할 수 있다.
EX)
- 지문(context): 한글은 홀소리와 닿소리 모두 소리틀을 본떠 만든 음소문자로 한글 맞춤법에서는 닿소리 14개와 홀소리 10개, 모두 24개를 표준으로 삼는다. “나랏말이 중국과 달라” 문제를 느낀 조선의 세종대왕이 한국어는 물론 이웃나라 말까지 나타내도록 1443년 창제하여 1446년 반포하였다.
- 질문(question): 한글이 창제된 연도는?
- 답변(answer): 1443년
어떻게 지문에서 질문에 대한 답을 얻을 수 있는걸까?
모델의 입력과 출력
- 모델의 입력: 지문과 질문(sep 토큰으로 구분)
- 모델의 출력: 지문의 각 토큰이 [답변의 시작일 확률, 답변의 끝일 확률] 인 형태
EX)
- 나타내도록 → [0.02, 0.01]
- 1443 → [0.93, 0.01]
- 년 → [0.01, 0.90]
- 창제하여 → [0.01, 0.01]
-> 답변의 시작일 확률이 가장 높은 '1443' + 답변의 끝일 확률이 가장 높은 '년'
: '1443년'이 지문에서 답변으로 추출됨
- 각 토큰에 대해서 답변의 시작일 확률과 답변의 끝일 확률의 합은 1이 아님
- 확률은 전체 토큰에 걸쳐 계산 됨.(지문 속 모든 토큰에 대해서 답변의 시작일 확률을 모두 더했을 때 1)
Q. 확률은 어떻게 도출되는걸까?
우선 입력(지문과 질문)을 토큰화한 뒤, BERT모델을 통해 각 토큰의 임베딩 벡터를 반환한다

그 후에 소프트맥스 함수 형태로
아래와 같이 지문 내의 각 토큰이 답변의 시작 or 끝이 될 확률 P를 계산할 수 있음
S or E : 시작벡터(or 끝 벡터) -> '학습 시 업데이트 할 가중치라고 생각하면 됨'
Ri : 각 토큰 i에 대한 임베딩 벡터
S· : 내적 계산



위 사진은 모델의 입력과 출력을 그림으로 나타낸 것이다.
자세하게 풀어보자면,
총 n개의 토큰이 입력으로 들어왔고, 각각은 768차원의 임베딩 벡터이다.
net1^1은 첫번째 토큰이 답변의 시작일 확률과 가중치를 곱한 것. -> 'S· : 내적 계산' 을 의미함
net2^1은 첫번째 토큰이 답변의 끝일 확률과 가중치를 곱한 것. -> 'S·E : 내적 계산' 을 의미함
...
각 토큰의 768차원의 임베딩 벡터를 2차원 벡터(net, net) 즉, [답변의 시작일 확률, 답변의 끝일 확률] 로 변환해준 것이다.
그리고 이 값들에 대해서 소프트맥스 함수를 적용하면 y1,,,yn 과 z1,,,zn이 도출된다
위의 예시를 다시 가져와서 설명하자면,
EX)
- 나타내도록 → [0.02, 0.01]
- 1443 → [0.93, 0.01]
- 년 → [0.01, 0.90]
- 창제하여 → [0.01, 0.01]
여기서 각 토큰의 첫번째 벡터 값 0.02, 0.93, 0.01, 0.01이 y1,,,yn
각 토큰의 두번째 벡터 값 0.01, 0.01, 0.90, 0.01이 z1,,,zn 인 것이다.
모델의 최종출력(y, z)은 정답레이블(토큰 기준 위치)와 비교하게 된다.
'1443년' 이 정답이라면 정답레이블은 [0, 1, 0, 0] 과 [0, 0, 1, 0]
그리고 모델 출력이 정답레이블과 최대한 같아지도록 BERT레이어 전체를 포함해서 모델 전체를 업데이트 한다.
"즉, 학습(train) 한다."
모델 구조
모델의 구조는 아래 그림과 같다

좀 더 자세하게는 아래 그림으로 이해할 수 있다

- 질문과 지문을 BERT의 input으로 사용하기 위해 토큰화하고, sep토큰으로 질문과 지문을 구분한다
- 모든 입력 토큰에 대해 BERT의 마지막 레이어 출력을 뽑았을 때, 지문의 각 토큰은 ‘해당 토큰이 답변의 시작/끝일 확률’이 된다
참고
Question Answering - ratsgo's NLPBOOK
Question Answering
pratical tips for Natural Language Processing
ratsgo.github.io
BERT-QA(Question-Answering, 질문-응답) task workflow (velog.io)
+
-> BERT는 인코더 전용 모델
- "누가 Transformer 아키텍처를 발명했습니까?"와 같은 사실적인 질문에 대한 답변을 추출하는 데 우수한 성능을 나타내는 경향이 있음
- "하늘은 왜 파란색입니까?"와 같은 개방형 질문이 주어지면 제대로 처리 x
-> 생성기반 질의응답(generative question answering)
- 위의 예시 처럼 답변하기 어려운 질문을 처리하는 경우에 T5 및 BART와 같은 인코더-디코더 모델을 사용
- 일반적으로 텍스트 요약과 매우 유사한 방식으로 정보를 합성하는 데에 사용됨
'Python > NLP' 카테고리의 다른 글
단어 표현 방법 - 시소러스, 통계 기반 기법 (0) | 2023.09.16 |
---|---|
트랜스포머(Transformer) - 인코더, 디코더 (0) | 2023.07.19 |
트랜스포머(Transformer) - 입력(포지셔널인코딩) (0) | 2023.07.15 |
어텐션(인코더-디코더 Attention, Dot-Product Attention) (0) | 2023.06.27 |
시퀀스-투-시퀀스(seq2seq) (0) | 2023.04.11 |