[AI 이야기-카카오]


‘경찰서 번호가 뭐야’ vs ‘원자 번호가 뭐야’…문형·품사 등으로는 단답형·서술형 구분 불가능
진화하는 ‘AI 대화 엔진’…질문 유형 나눠 알고리즘 가동 [AI 이야기-카카오]
[한경비즈니스 칼럼=카카오엔터프라이즈 기술기획셀 이수경·카카오엔터프라이즈 자연어처리파트 조승우·카카오엔터프라이즈 자연어처리파트 최동현·카카오엔터프라이즈 기술블로그 Tech&(테크앤)] 현대인은 자신이 원하는 정보를 찾는 데 점차 많은 어려움을 느끼고 있다.

언제 어디서나 경제적인 부담 없이 편리하게 정보를 습득할 수 있는 인터넷이 가진 장점과는 별개로 유용한 정보에 접근하는 데는 물리적인 한계가 있기 때문이다. 모르거나 모를 수밖에 없는 정보량이 압도적으로 많이 생산되고 있어 특정 상황과 조건에 따른 답을 파악하기가 쉽지 않다. 이에 따라 부정확하거나 잘못된 정보를 습득할 가능성도 이전보다 더 높아지고 검색 정보를 이해하고 활용하는 수준이 낮아 발생하는 새로운 형태의 불평등도 야기되고 있다.


카카오엔터프라이즈 AI 랩(Lab)이 자사의 인공지능(AI) 기술을 집약한 플랫폼인 ‘카카오 아이(i)’의 대화 엔진 1을 고도화하는 이유는 사용자에게 도움이 될 만한 정보를 효율적으로 찾아주는 검색 시스템의 중요성을 인지하고 있기 때문이다. 그중에서도 음성·키보드와 같은 다양한 인터페이스를 통해 입력된 사용자 질의(query)에 대한 답을 포함하는 후보 문서에서 정답 부분을 추출하는 기술인 ‘질의응답’에 대한 연구()를 활발하게 진행하고 있다. 질의응답 시스템을 구성하는 요소 중 하나인 딥러닝 기반 정답 유형(서술형·단답형) 분류 모델을 소개한다.
진화하는 ‘AI 대화 엔진’…질문 유형 나눠 알고리즘 가동 [AI 이야기-카카오]
질의응답 시스템이란

카카오 i 대화 엔진은 사용자 질의 분석을 통해 호출 의도에 따른 적합한 시스템을 가동한다. 에서처럼 인텐트 분류 단계를 거친 사용자 발화가 답변을 요구할 때 질의응답 시스템이 활성화된다.


질의응답 시스템의 작동 과정은 다음과 같다. 첫째, 입력 문장을 분석해 검색에 유용한 쿼리를 생성한다. 둘째, 추출된 검색 쿼리를 활용해 찾은 모든 문서를 기계 독해에 적합한 형태로 잘게 쪼갠다. 셋째, 잘게 쪼갠 텍스트에서 후보 정답을 추출한다. 넷째, 후보 정답 중 질문에 가장 적합한 정답을 제공한다.


마지막 넷째 단계에서 질의응답 시스템은 질문과 가장 연관성이 높은 N개의 문서를 분석해 얻은 서로 다른 N개의 정답을 각각 제시하거나 또는 여러 후보군에서 가장 적합한 단일 정답을 제시할 수 있다. 스마트 스피커와 같은 음성 인터페이스나 스마트폰과 같은 소형 디스플레이에서는 텍스트를 쪼갠 수만큼 늘어난 추출된 모든 정답을 사용자에게 그대로 제공하는 방식은 사용자에게 큰 불편을 초래할 수 있다. 이에 따라 하나의 정답을 제공하는 둘째 방식이 보편적으로 활용된다.

문제는 수많은 후보군 중 하나의 최종 정답을 제공하는 질의응답 시스템에서는 하나의 알고리즘으로 서로 다른 정답 유형을 처리하기가 쉽지 않다는 데 있다.
진화하는 ‘AI 대화 엔진’…질문 유형 나눠 알고리즘 가동 [AI 이야기-카카오]
에서 보듯이 ‘마우스 발명자는 누구’라는 질의에 따라 각 문서에서 추출한 후보군은 대부분 비슷한 문형을 지니며 그 표현 범위 또한 다소 한정돼 있다. 그래서 그 후보를 압축하는 데 도움이 될 만한 정답 사이 포함 관계나 날짜·요일과 같은 규칙성에 따른 투표를 통해 최종 정답을 가려낼 수 있다. 이를 단답형 정답이라고 부른다.


반면 ‘컴퓨터가 뭐야’라는 질의에 따라 각 문서에서 추출한 후보군은 다양한 문형을 지니며 그 표현 범위가 상당히 넓다. 후보 답변 사이 규칙성을 발견하기 어려워 앞서 설명한 투표 알고리즘을 사용하기가 어렵다. 그래서 각 정답 후보에서 추출한 중심어와 수식어에 따른 새로운 투표 알고리즘이 필요하다. 이를 서술형 정답이라고 부른다. 이처럼 질의응답 시스템에서는 정답의 유형에 따른 적절한 알고리즘이 동작돼야 한다는 점에서 정답 유형 분류는 매우 중요하다고 할 수 있다.


정답 유형 분류가 어려운 이유

앞서 설명한 정답 유형 인식은 ‘단답형’과 ‘서술형’이라는 이진 분류 문제라고 볼 수 있다. 언뜻 봐서는 질문의 길이가 짧고 간단해 답변의 유형을 둘 중 하나로 분류하기가 매우 쉽다고 느껴질 수도 있다. 하지만 실제 질의 형태만 봐서는 정답 유형을 구분하기가 거의 불가능하다. 같은 문형을 가진 질문임에도 그 정답의 유형이 완전히 다름을 알 수 있는 예를 한 번 보자.
진화하는 ‘AI 대화 엔진’…질문 유형 나눠 알고리즘 가동 [AI 이야기-카카오]
에서 1번과 2번 문장은 ‘~번호가 뭐야’라는 동일한 문형으로 종결된다. 1번은 ‘경찰서’라는 주제어의 하위 속성에 대한 질문이다. 따라서 단답형으로 정답이 제공돼야 한다. 원자 번호라는 주제어에 대한 정의를 질의하는 2번에서는 서술형 정답이 제공돼야 한다.


특정 단어 시퀀스에 대한 정답 유형의 단답형 또는 서술형 확률을 구할 때는 형태소·품사와 같은 정보를 고려한다. 그런데 품사 정보는 문장을 두 범주 중 하나로 분류하는 데 크게 도움이 되지 않는다. 즉, ‘번호가 뭐야’라는 동일한 문형을 가진 두 개의 문장에서 주제어의 형태소만 다른 상황에서는 해당 문장이 요구하는 정답이 단답형일 확률 또는 서술형일 확률은 서로 크게 다르지 않을 것이라는 의미다. 이에 따라 단순한 키워드 나열이나 단문 형태를 취하는 질의 분석만으로는 예상 정답의 유형을 분류하기가 쉽지 않다.


질의 형태의 변형(‘경찰서 번호가 뭐야’, ‘경찰서 번호 좀 알려줘봐’)이나 입력 오류(‘경칠서 번호가 뭐야’, ‘경찰서 반호가 뭐야’) 등 수제 규칙이나 패턴에서 벗어난 질문에 대해서도 적절한 정답을 제공하지 못할 수도 있다. 질의를 제대로 분석하지 못해 정답 유형에 따른 적합한 알고리즘을 제대로 호출하지 못하게 되기 때문이다. 이처럼 대부분의 서비스 이용자가 자신만의 스타일로 문장을 입력한다는 사실을 고려할 때 패턴이나 규칙에서 벗어난 질의 문장 또한 제대로 분류할 수 있는 강건한 시스템이 필요하다.
진화하는 ‘AI 대화 엔진’…질문 유형 나눠 알고리즘 가동 [AI 이야기-카카오]
AI 랩이 정답 유형을 분류하는 방법

1. 전처리
한국어 어절 하나는 두 개 이상의 형태소를 포함하는 경우가 많다. 이에 따라 한국어 관련 기존 연구에서는 한국어 형태소 분석기를 이용해 입력 문장을 형태소 단위로 나누는 데이터 전처리를 실시한다. AI 랩 또한 규칙과 통계 기반으로 동작하는 자체 한국어 형태소 분석기를 이용해 입력 문장에서 형태소와 품사 정보를 추출했다.
하지만 AI 랩은 형태소를 분석하는 것만으로는 오탈자 여부를 알기가 쉽지 않다고 판단했다. 사용자는 비슷하게 발음되는 두 단어를 혼동하거나 키보드에서 가까이 있는 키를 잘못 타이핑하거나 단순히 띄어쓰기를 생략할 수도 있다. 대부분은 정상적인 표현에서 자음·모음 한두 개가 다른 경우가 많다. 이에 AI 랩은 자음과 모음 추출기를 이용해 어절의 자모음 정보도 획득했다. 이 자모음 정보는 뒤에서 설명할 통합 어절 임베딩(행렬) 생성에 활용된다.

2. 통합 어절 임베딩 생성

자연어 어절을 벡터로 바꾸는 데는 워드 임베딩(word embedding)을 사용한다. 워드 임베딩은 대규모 말뭉치에 등장하는 단어의 일반적인 의미를 벡터로 표현한다. 예를 들어 의미가 비슷한 ‘인간’과 ‘사람’을 비슷한 방식으로 표현할 수 있다. 또 ‘왕-남자=왕비’와 같은 관계에서 보듯이 단어의 실제적 의미적 차이를 거리로 표현하기도 한다.


AI 랩은 여타 다른 임베딩 기법보다 단어의 의미를 더 잘 담아내는 Glove 임베딩 모델을 포함한, 입력 오류에 강건한 (자모) 통합 어절 임베딩 생성기를 구축했다. 형태소 어휘 사전에 존재하지 않은 오탈자로 인해(out of vocabulary) 형태소 분석 오차(noise)를 최소화하기 위해서다. 통합 어절 임베딩 생성기는 형태소와 자모음 정보에 각각 부여한 임베딩 벡터를 이용해 다시 원래 어절을 조합하는 과정을 학습한다. 그 결과 입력 오류가 발생하더라도 원래 어절을 유사하게 추정할 수 있다.
진화하는 ‘AI 대화 엔진’…질문 유형 나눠 알고리즘 가동 [AI 이야기-카카오]
3. 문장 임베딩 벡터 생성


문장에 존재하는 각 어절을 표현하는 임베딩을 추출했다면 이를 바탕으로 문맥까지 표현하는 임베딩 벡터를 생성할 차례다. 여기에는 CNN 기반 모델이 활용된다.


1) DenseNet

이미지 분류와 분할, 객체 감지와 같은 비전 문제에서 탁월한 성능을 내는 CNN은 자연어 처리 문제에도 효과적이다. 콘볼루션 연산층(convolution layer)의 필터가 문맥 파악에 중요한 부분만 도출하는 데 유리한 덕분이다. 그 결과 CNN을 통과한 최종 벡터는 문장의 지역 정보를 보존하는 추상화 과정을 거쳐 단어나 표현의 등장 순서를 반영한 문장의 의미 정보(semantic information)를 표현할 수 있게 된다.


2) 깊이별 분리 콘볼루션 연산

형태소와 자모 정보를 반영한 통합 어절 임베딩을 모델에 바로 입력하면 전체 학습 시간이 지나치게 길어지는 문제가 발생할 수 있다. 각 임베딩별로 콘볼루션 연산이 이뤄지다 보니 매개 변수 수가 늘어나는 만큼 처리 시간이 비례해 늘어나기 때문이다. 따라서 매개 변수가 늘어나는 상황에 대비해 학습 속도나 추론 속도를 높일 필요가 있다.


이를 해결하기 위해 AI 랩은 깊이별 분리 콘볼루션 연산을 이용한다. 2D 이미지 데이터에 대한 깊이별 분리 콘볼루션은 매개 변수 수 최적화를 통해 메모리 사용량을 줄이고 학습 속도를 높인다. 채널을 기준으로 각각 ‘필터 높이, 필터 너비, 1’과 ‘1, 1, 채널 수’로 분리한 두 종류의 새로운 필터로 각각 깊이별 콘볼루션(Depthwise convolution)과 포인트별 콘볼루션(Pointwise convolution) 연산을 순차적으로 진행한다.


3) 동적 셀프 어텐션

서로 연관성이 높지만 거리상 멀리 떨어진 어절이 서로 참조할 수 있게 하는 기법으로 어텐션이 있다. 다만 기존의 어텐션 기법은 입력 발화 길이에 제약이 없는 실제 서비스에 적합하지 않을 수 있다. 어텐션 행렬의 형태가 어절 수에 제약을 받기 때문이다. 이에 AI 랩은 입력 어절의 수에 관계없이 어텐션 벡터의 계산과 관리 기법인 동적 셀프 어텐션을 적용했다.


과정은 다음과 같다. 첫째, 각 어절 임베딩 벡터와 셀프 어텐션을 나타내는 동적 가중치 벡터(dynamic weight vector)를 곱해 각 어절의 문맥 점수를 구한다. 둘째, 각 문맥 점수에 대한 소프트맥스(softmax) 연산을 거치면 중요도 점수(소프트맥스 확률 값)를 얻게 된다. 셋째, 어절 임베딩 벡터에 중요도 점수를 가중치로 두고 선형 결합(linear combination)한다. 넷째, 이 가중합의 결과는 다시 동적 가중치 벡터로 재정의된다. 이 과정을 거치면 어절 길이에 제약을 가진 가중치 행렬을 사용하지 않으면서도 현재 보는 어절과 관련성이 높은 다른 어절의 중요도도 반영할 수 있게 된다.


4. 분류

문장 임베딩 벡터는 마지막 출력 층인 FFNN(Feed-forward neural network)과 소프트맥스 연산을 거쳐 사용자 질의문이 요구하는 답변 유형을 단답형 또는 서술형으로 분류한다.
AI 랩은 예기치 않은 오분류 문장을 완전히 제어할 수 있어야 비로소 사용자에게 충분한 만족감을 선사하는 서비스를 제공할 수 있다고 보고 있다. 지금까지는 육하원칙, 개체명 인식기, 가젯 티어와 같은 추가 특징을 딥러닝 분류 모델에 적용했을 때 유의미한 성능 개선을 확인했다.


정답 유형 분류에 맞게 미세 조정된 BERT 모델을 전문가(teacher)로, CNN을 숙련자(student)로 설정하는 실험에서는 괄목할 만한 성능 개선을 이뤘고 현재 그 결과를 정리하고 있다. 이처럼 AI 랩은 정답 유형 분류기의 성능을 개선하기 위한 연구를 앞으로도 계속 진행할 계획이다.

[본 기사는 한경비즈니스 제 1303호(2020.11.16 ~ 2020.11.22) 기사입니다.]