Abstract
본 논문은 질의응답 시스템을 위한 자연언어 질의 이해를 위해 새로운 의미 표현 방법을 제안한다.
기존 문장 의미 표현을 위한 연구로 RNN encoder를 이용한 skip-thought가 있었다.
본 시스템은 자연언어 질의를 입력받아 이를 바로 skip-thought를 통해 문장 의미로 변환하고, 그것을 통해 QA를 수행하고 그 성능을 분석하였다.
질의응답 코퍼스 중 155문장으로 테스트한 결과 입력한 문장에 적절한 증거문장을 출력하는 성능은 accuracy 30.97%로 우리의 방법이 유용함을 보였다.
Introduction
<QA 필요성 증가>
QA는 사용자가 입력한 자연어 질의에 적합한 응답을 내어줌을 목표로 하는 연구 분야이다.
입력으로 자연어 질의를 취하고, 그 응답으로 자연어 문장, 구 또는 절, 단어를 내어준다. 예를 들면 다음과 같다.
Q. "이순신 장군이 1597년에 명량해협에서 지휘한 해전은 무엇인가?"
A. "명량해전"
최근에는 Apple의 Siri, Amazon의 Echo 등 개인비서 시스템이 대중화되면서 QA 연구가 활발히 진행되고 있다.
<분산 언어 표현>
인공신경망이 높은 성능으로 주목받게 되면서 인공신경망을 이용한 자연어 처리 연구가 진행되었다. 이미지나 음성 인식 등과는 다르게 언어처리 분야의 주요 원소인 단어나 한국어의 형태소 등은 인공신경망에 직접 입력할 수 없다.
이러한 한계를 극복하기 위해 언어에 실수 벡터를 부여하기 위한 연구가 진행되었다. 그 중에서도 인공신경망을 이용한 NNLM과 그 것을 개선한 CBOW, skip-gram등이 괄목할 만한 성과를 거두었고 많은 연구에서 변형 및 사용되고 있다.
<문장의 의미 표현>
(위의) 이러한 단어 의미 표현은 단어 단위에서는 성공적이었지만, 문장 단위로 확장하는 것에는 또 다른 연구가 필요하였다. 현재의 인공신경망은 고정된 길이의 입력만을 입력 레이어로 취할 수 있기 때문이다. 여러 연구자들이 문장 또는 구 단위 의미 표현을 생성하기 위한 연구를 진행하였고 그 중 일부는 괄목할 만한 성과를 거두었다. 우리는 그 중 unsupervised learning으로 높은 성능을 낸 skip-thought(R. Kiros, Skip-thought)를 QA문제에 적용하였다.
<skip-thought vector를 이용한 문장의 의미 표현>
우리는 (R. Kiros, Skip-thought)의 skip-thought를 이용해 문장의 의미를 표현하고 그것을 이용해 QA 시스템을 구현하였다.
skip-thought는 RNN-encoder를 이용한 문장 의미 표현 생성 방법이다. skip-thought는 연속되는 문장열을 이용하여 현재 문장을 입력하였을 때 앞 뒤의 문장을 재생성함을 목적으로 학습된다.
우리의 시스템에 질의가 입력되면, 그 질의를 의미 단위로 분리하고, 그것을 KB에 검색하여 가장 유용하다고 판단되는 지식을 출력한다.
skip-thought를 이용한 실험과 함께, 형태소 벡터 mean을 이용한 방법도 제시하고 그 통찰을 공유한다.
형태소 mean은 (Armand Joulin, 2016 arxiv, fastText)fastText의 방법에서 영감을 얻어 시도한 방법이다. 문장의 모든 형태소를 vector dictionary에 검색해 벡터를 가져온다. 그 vector를 mean하여 문장 의미 표현에 해당하는 벡터를 생성한다. 그리고 그것을 KB에 조회하여 가장 유용하다고 판단되는 지식을 출력한다.
문장 벡터를 skip-thought와 morpheme mean으로 생성한 후, 지식과의 매치에 supervised machine learning을 사용할 수도 있다. 하지만, 기 작성된 의미 벡터가 그 자체로 충분히 유사할 것이라는 판단에서, 두 벡터의 cosine similarity로 유사 정도를 측정하였다.
<관련연구>
분산 의미 표현
인공신경망은 numeric data만을 입력으로 취할 수 있다. 음성, 이미지, 영상 등은 별다른 처리 없이 직접 인공신경망의 입력으로 사용할 수 있다. 그러나 자연어는 인공신경망의 입력으로 직접 사용하지 못하고 실수 벡터로 변환하는 과정을 거쳐야 한다. 따라서, 딥러닝을 이용한 자연어 처리 분야에서 의미 표현을 실수 벡터로 전환하기 위한 연구가 진행된 바 있다.
분산 언어 표현 이전에는 n-gram을 사용하였으나, 기계학습 기술의 진보로 여러 컨셉의 언어모델 연구가 진행되었고, 그 중 단어 분산 표현 연구가 가장 성공적이었다. (T. Mikolov, W2V)
(Y. Bengio, NNLM)은 단어간 joint probability를 학습하는 데에 기존에 큰 이슈였던 차원의 저주를 극복하고자, distributed representation과 인공신경망 학습기를 제안하였다. 그 성능은 기존 state-of-the-art였던 n-gram based 모델에 비해 나은 성능을 보였다.
(T. Mikolov, W2V)은 (Y. Bengio, NNLM)의 모델을 기반으로 두 개의 모델을 제안하였다.
첫번째는 (Y. Bengio, NNLM)의 모델에서 non-linear hidden layer를 제거하고, projection layer를 공유하도록 설계하였다. 또 (Y. Bengio, NNLM)과는 다르게 과거(왼쪽)의 단어 뿐 아니라 미래(오른쪽)의 단어도 사용하였다는 점이 있다. (T. Mikolov, W2V)는 이 모델을 Continuous Bag-of-Words라 명명했다.
두번째는 위 CBOW모델과 유사하지만, 문맥의 단어로 현재 단어를 추측하는 대신, 문장 내 단어로 문장 내 다른 단어를 분류하도록 학습한 방법이다. 현재 단어를 log-linear classifier에 입력하고, 그 단어와 특정 거리 이내에 존재하는 단어를 추론하도록 모델을 학습한다. 논문에서는 그 범위가 넓어질 수록 성능이 좋아짐을 보였다.
문장 의미 표현
단어의 분산 의미 표현이 큰 성공을 거두고 나서, 구 또는 문장의 의미 표현을 생성하기 위한 연구들이 진행되었다.
단어 분산 표현은 구, 문장 단위 고정된 크기의 벡터를 생성하지 못해 다양한 길이로 나타나는 자연어 문장을 처리하기 위한 조치가 필요하다.
1. Distributed Representations of Sentences and Documents (Quoc Le, Tomas Mikolov, Phrase vector)
(Quoc Le, Phrase Vector)에서는 (T. Mikolov, W2V)의 CBOW 구조와 유사하지만, 입력으로 phrase-vector를 함께 주고 단어를 추론하는 모델을 제안한다. 최초 phrase-vector는 word vector와 같이 random 초기화한다. phrase 내의 단어들과 함께 입력되어 다음 단어를 추론하도록 학습된다. 이러한 학습 설정으로부터 저자는 paragraph vector가 "이 컨텍스트에서 없어진 것을 기억하는 메모리"처럼 동작한다고 이야기 했다.
각각의 paragraph마다 vector를 할당하기에, 추론 중 unseen paragraph가 나타나면 고정된 word vector를 이용해 inference를 수행해 paragraph vector를 생성하여야 한다.
그러나, 이 방법은 구문정보 등을 사용하지 않고, 길이에 무관하게 적용이 가능하며, 문장을 넘어서도 적용이 가능하다는 이점이 있다.
<<내용 추가 필요>>
2. Jointly optimizing word representations for lexical and sentential tasks with the C-PHRASE model
(Nghia The Pham, C-PHRASE)에서는 (T. Mikolov, W2V)가 flat window-based context를 사용함을 지적하며 구문분석 결과를 이용한 단어/구/문장 분산 표현 학습 방법을 제안한다. 구문 트리의 리프노드에서는 (T. Mikolov, W2V)의 skip-gram과 같이 행동한다. inner node에서는 hyper-parameter로 얼마나 많은 문맥을 학습할 것인지 결정한다. 그 수치는 다음과 같다.
w = p1 * h(c)*p2
여기서 w는 window size, p1은 hyper-parameter1, h(c)는 현재 constituent의 높이, p2는 hyper-parameter2이다.
식에 따라, 높은 높이의 constituent일 수록 많은 context를 가지게 설정할 수 있다.(p2가 0이 아닌 경우)
이는 높은 constituent일 수록 넓은 정보, 낮은 constituent일 수록 좁은 컨텍스트를 사용하는 것이 좋을 것이라는 것이다.
3. skip-thought
(R. Kiros, Skip-Thought Vectors)는 RNN encoder-decoder 구조에 unsupervised approach로 문장열을 학습하여 sentence distributed representation을 생성하였다. 현재의 문장을 인코딩하여 문장 분산 표현을 생성하고, 그것으로 다음문장과 이전문장을 decode하도록 학습된다. 이는 (T. Mikolov, W2V)의 skip-gram의 문장 단위 버전이라고 볼 수 있다. 학습이 완료되면 encoder만을 이용하여 문장을 embedding할 수 있다. Unsupervised learning이고 단어 벡터만 존재한다면 언제든 문장 벡터를 생성할 수 있다는 장점을 가진다.
4. fastText
형태소/단어 벡터의 mean을 문장 벡터로 보고 분류를 해결한 사례도 있었다. (Armand Joulin, Arxiv, 2016)에서 제안한 fastText는 문장에 존재하는 단어의 mean과 추가로 n-gram 벡터를 사용하여 hidden layer를 구성하고 Hierarchical softmax로 output symbol을 결정하는 간단한 구조의 network이다. 여기서의 hidden layer는 문장 내 모든 단어/형태소의 정보가 포함되어 있다고 생각할 수 있고, 그것을 이용하여 문장 분류를 수행하며 높은 성능을 달성한 바 있다. 또한 fastText는 학습/추론 속도도 다른 아키텍쳐에 비해 상당히 빠르다.
traditional 기존의 QA
자연언어 질의를 쿼리로 변경하는 방법은 '정보추출'에 의한 방법과 '의미분석'에 의한 방법이 있다.
정보추출에 의한 방법은 목표 지식베이스에 촛점이 마춰 분석이 이뤄지기 때문에 분석이 상대적으로 쉽고 높은 정확도를 보인다. 그러나 목표 지식베이스에 의존적이므로 목표 지식베이스의 완성도와 표현 범위에 크게 의존할 수 밖에 없다.
의미분석 방법은 지식베이스에 관계없이 질의가 표현하는 의도와 의미를 분석하는 것을 목표로 한다. 목표 지식베이스에 의존적이지 않기 때문에 범용적 질의 분석에 유용하다. 의미분석 방법은 또한 정보추출을 사용하는 방법에 비해 자연언어에 나타난 의미를 보다 풍부하게 해석하여 질문 의도를 파악할 수 있다. 예를 들어 '최소', '최고'와 같은 한정사, ... 와 같은 모달리티와 같은 어휘를 분석하여 정보추출 방식보다 의미를 일관성 있고 정확하게 분석한다.
인공신경망이 활발히 연구되고 나서는 (Mohit Iyyer, 2014, EMNLP)와 같이 인공신경망을 이용한 QA가 활발히 연구되었다.
(Mohit Iyyer, 2014, EMNLP)에서는 여러 문장으로 하나의 entity를 설명하는 'quiz bowl' 데이터에 대해 DT-RNN(Dependency-Tree Recursive NN)을 적용하여 좋은 성능을 내었다.
<<(Mohit Iyyer 2014 EMNLP)에 대한 내용 추가 필요>>
내용 / 이전연구 추가 필요
이동건, 2016 HCLT
또한 문장 임베딩을 이용한 시도도 있었다.(이동건, 오교중, 최호진, 허정, 2016 HCLT).
(이동건, 2016 HCLT)에서는 GRU 인코더를 이용해 현재 형태소를 입력하였을 때, 다음 형태소가 출력되도록 인코더를 학습하였다.
마지막 형태소까지 인코더에 입력하였을 때의 GRU state를 문장 분산 표현이라고 한다.
(이동건, 2016 HCLT)는 문장의 유사도를 이용해 주어진 질의와 관련있는 문장(증거문장)을 찾아내는 시스템을 개발하였고, 위키피디아 문서로 학습한 GRU encoder는 높은 성능을 내었다.
또 증거문장 지식베이스로 TV 프로그램에서 출제된 질의의 증거문장들을 사용하였다.
우리는 이와 유사한 구조를 가지지만 GRU encoder 대신 skip-thought를 사용하였다.
그리고 우리는 증거문장 대신 DBpedia의 트리플로 생성한 문장을 사용하였다는 점이 차이가 있다.
또 형태소 임베딩 차원, 문장 벡터 차원이 다르고, (이동건, 2016 HCLT)는 형태소에 어깨번호까지 부착되어 있지만 우리는 그렇지 않다.
<제안방법>
skip-thought encoder 학습
본 논문에서는 입력된 질의에 해당하는 지식을 KB로부터 retrieve하는 것을 목표로 한다. 그 방법으로 skip-thought를 사용하였다.
skip-thought 학습을 위해 위키피디아(wikipedia 레퍼런스) 문서와 인터넷 신문, 세종 코퍼스(세종계획 21)를 사용하였다.
한국어는 교착어의 특성상 형태소 분석하는 것이 효과적이다. 따라서 형태소 분석이 수행되지 않은 위키피디아 문서와 인터넷 신문 문서는 (홍진표, espresso)를 사용하여 형태소분석한 후 skip-thought 인코딩을 수행하였다.
학습에 사용한 코퍼스의 통계는 다음과 같다.
문장 수 : 7,629,639
어절 수 : 125,595,820
형태소 수 : 288,564,883
우리는 한국어 형태소를 영어의 단어와 같은 의미 단위로 보고, 문장의 형태소열을 그대로 skip-thought에 인코딩 입력으로 사용한다.
예를 들어 다음과 같이 입력한다.
"뉴욕타임즈/NNP 는/JX 미국/NNP 의/JKG 대표/NNG 적/XSN 이/VCP ㄴ/ETM 일간지/NNG 로/JKB ,/SP 1851/SN 년/NNB 에/JKB 창간/NNG 되/XSV 었/EP 다/EF ./SF" (The New York Times is the leading daily newspaper in the United States and was founded in 1851.)
skip-thought encoder로 벡터 생성
skip-thought encoder가 학습이 완료되고, 우리는 skip-thought encoder로 KB와 질의를 encoding한다. RNN based encoder로 입력을 인코딩하는 것과 마찬가지로, 주어진 질의와 Knowledge를 형태소 단위로 skip-thought model에 forward propagate한다. 그리고 최종 형태소까지 propagate한 후의 hidden state를 질의와 지식의 인코딩 상태. 즉, sentence vector라 생각한다.
이로써 질의를 KB에 검색하여 가장 유사한 지식을 retrieve할 수 있게 된다. 그리고 입력된 질의와 가장 유사한 지식을 출력하여 그 지식을 입력된 질의의 응답으로 사용자에게 내어준다. (이동건, 2016 HCLT)에서는 이러한 지식을 '증거문장'이라 명명하였다.
<실험 및 결과>
데이터와 전처리
우리는 실험을 위해, (Younggyun Ham, Sangha Nam, Key-Sun Choi, 2016, HCLT)에서 실험에 사용하였던 NLQ400과 DBpedia(S. Auer, C. Bizer, G. Kobilarov, J. Lehmann, R. Cyganiak, Z.Ives, 2007.)에서 수집한 트리플 25만여 개를 사용한다. NLQ400에는 384개의 질의에 대한 질의, 정답, 해설, 그로부터 작성할 수 있는 triple이 포함되어 있다.
모든 쿼리에 대한 정답이 KB에 존재하여야 한다. 따라서 NLQ400의 트리플을 DBpedia에서 수집한 트리플과 합쳐 KB를 구성하였다. 우리의 skip-thought는 문장으로부터 학습된 것이기 때문에 triple을 직접 입력하기에는 부적절하다고 판단하였다. 따라서 문장생성 규칙을 통해 트리플로 문장을 생성하였고, 그 결과와 벡터를 보관하였다.
우리 시스템은 NLQ400의 질의를 KB에 검색하여 질의를 풀이할 수 있는 문장을 얻어내는 것을 목표로 한다. 따라서 트리플과 규칙으로 생성한 문장과 질의 문장의 cosine similarity가 높아야 한다. 그러기 위해서는 하나의 질의 문장이 하나의 의미를 가져야 하는데, 실제 질의들은 그렇지 않다. 다음은 질의 중 한 예이다.
"태종무열왕과 문무왕을 도와 신라의 삼국 통일 전쟁을 보좌하였으며, 진평왕부터 문무왕에 이르는 다섯 명의 왕을 섬겨 신라 정권의 중추적 인물로 성장하였으며, 신하로서 왕으로 추봉된 유일한 인물이고, ... 흥무대왕으로 추존된 이 사람은?"
위 질의는 하나의 문장으로 이루어져 있지만 내부에 여러 phrase를 갖고 있다. 이러한 경우 위에서 생성한 문장과의 매치가 효율적이지 않을 것이라고 판단하였다. 따라서 우리는 NLQ400의 질의를 트리플과 매치할 수 있는 의미 단위로 자르고자 했고, 다음과 같은 규칙으로 질의를 정제하였다.
1. 문장 단위 분리
2. 연결어미로 여러 의미가 나열된 문장은 연결어미로 분리
3. '다음에서 연상되는 인물은 무엇인가?' 등 의미있는 사실정보를 포함하지 않는 문장 삭제
위 작업으로 상당히 많은 문장이 삭제되었고, 특정 사실관계가 가능한 적게 포함되도록 문장을 정제하고자 하였다.
하지만 다음과 같은 예들은 분리하지 않고 그대로 사용하였다.
"이것은 유일하게 우리나라에서 만들어진 구기 종목으로 군대에서 간편하게 배구장 네트를 땅에 내려놓고 하던 데서 발전된 운동인데, 무엇일까?"
위 문장은 먼저 2번 규칙에 의해 마지막 '무엇일까?'가 분리되고 3번 규칙에 의해 '무엇일까?'는 제거된다. 그리고 남은 문장은 다음과 같다.
"이것은 유일하게 우리나라에서 만들어진 구기 종목으로 군대에서 간편하게 배구장 네트를 땅에 내려놓고 하던 데서 발전된 운동인데,"
여기에 포함되는 트리플은 두 개이다. (X, 발생지, 대한민국), (X, 유래, 군대에서 간편하게 네트를 땅에 내려놓고 하던 것).
그러나, 두 의미 사이 연결이 조사 '으로'로 인하였기 때문에 분리하지 않고 그대로 사용한다.
실험 결과
테스트를 위해 위 전처리 과정을 거친 후의 질의 155 쿼리를 skip-thought로 encode하였다. 그리고 KB의 문장들을 모두 skip-thought로 encode하였다.
155쿼리와 KB에 포함된 문장 모두를 cosine유사도 측정하여, 가장 높은 cosine 유사도를 가지는 지식 1문장씩을 매칭하였다.
그리고 그 트리플 문장이 실제 쿼리의 정보와 일치하는 지 체크하여 성능을 측정하였다.
실험에 사용한 트리플은 모두 다른 지식을 표현하고 있어, 하나의 문장에 대해 여러 개의 정답이 존재하지는 않는다.
아래는 질의와 제안 시스템의 결과가 얼마나 유사한지 Likert Scale 평가를 수행한 결과이다.
Likert scale의 보기는 다음과 같다.
- Score 1 : (쿼리와 시스템의 결과가) 관련 없음.
- Score 2 : Subject, Object, Property 중 하나가 관련이 있음.
- Score 3 : Subject, Object, Property 중 둘 이상이 관련이 있음.
- Score 4 : (쿼리와 시스템의 결과가) 같은 Subject, Object, Property를 설명하고 있음.
<<Likert scale 평균>>
다음은 평가자 A, B의 평가 결과에 대한 Cohen’s kappa 계수 분석 결과이다. Score 1, 2는 False로, Score 3, 4는 True로 계산하였다. 도출된 Kappa 계수는 0.898로 평가 결과가 평가자 사이에서 유사하였음을 알 수 있다.
<<Cohen's kappa>>
다음은 시스템 결과의 예이다. 정답은 굵게 표시하였고, 괄호 내의 숫자는 cosine 유사도이다.
다음에서 첫번째 예의 첫번째 출력 문장은 뉴딜정책의 내용에 대해서 이야기하고 있으며, 실제 입력 문장도 뉴딜정책의 소개이자 그 정책의 이름을 묻는 질의의 일부분이다.
두번째 예는 정답이 4등에 랭크되었고, 1번과 2번은 스포츠라는 같은 카테고리의 문장이 랭크되었음을 알 수 있다. 또한 3번과 5번은 '사단법인이다.'라는 어휘를 그대로 가져 높은 유사도를 보이는 것이라 생각할 수 있다.
세번째 예는 조선시대 인물인 '논개'에 대한 설명 중 일부인데, 질의의 처음에 임진왜란이 나타났고 지식들은 임진왜란과 선조에 대한 설명이 나타났다. 정답 지식과 입력 질의에 같은 어휘가 연속으로 나타남에도 틀린 결과를 낸 것은 특정 개체명 또는 명사의 유사에 많은 영향을 받도록 학습된 것이라 예상할 수 있다. 표에서 출력 문장의 마지막 'G'는 정답 문장이다.
<<시스템 결과 (입력 쿼리/출력 문장/유사도)>>
다음은 Best1/5 모델의 성능이다. 아래 표의 성능은 4.1.에서 설명하였던 NLQ400의 트리플 문장당 각 하나가 Best1/5에 진입하는 경우에만 True, 나머지는 False로 설정하였다.
<<NLQ400 트리플 매칭 성능 (best1/best5)>>
<Conclusion>
본 논문은 자연언어 질의를 skip-thought encoder를 이용하여 인코딩하고, 인코딩된 벡터를 지식베이스에 검색하는 방식으로 QA 시스템을 구현하였고 그 성능을 측정하였다.
기존 지식베이스 기반 질의응답 시스템이 지식베이스에 적합한 쿼리를 생성하는 등 여러 단계를 거쳐야 하며, 따라서 목표 지식베이스에 크게 의존하는 경향이 있었다.
본 시스템은 자연어 문장을 그대로 인코딩하여 지식베이스의 자연어 문장과 비교를 수행하므로 그러한 프로세스가 간략화 되며, 그럼에도 불구하고 강건한 성능을 보였다.