글 수 94

딥러닝을 사용한 챗봇 개발방법 정리

조회 수 15432 추천 수 0 2018.02.03 04:15:45


현재까지 챗봇을 개발하는데 많이 쓰이는 방법은 규칙기반 방식입니다. 형태소 분석이나 구문 구석을 한 후 특정 문자열이나 정해진 규칙을 판단하여 명령을 실행합니다. 하지만 최근에는 딥러닝으로 학습을 하여 자연어를 처리하는 방법이 새롭게 연구되고 있습니다. 여기서는 최대한 간단하게 개략적인 내용만 소개하도록 하겠습니다. 보다 자세한 사항은 링크된 문서들을 참고하시기 바랍니다.

 

 

 

워드 임베딩

 

신경망을 사용하여 자연어를 처리하려면 우선 컴퓨터가 이해할 수 있는 형식으로 변환해야 합니다. 가장 쉬운 방법은 One-Hot Encoding을 사용하는 것입니다. 전체 단어의 수 만큼 벡터의 차원을 만들고 각 단어마다 하나의 차원에 대입합니다. 하지만 이 방식은 벡터의 차원이 너무 커지기 때문에 학습이 힘들다는 단점이 있습니다.

 

one-hot.png

 

[ One-Hot Encoding - 출처 : 쉽게 씌어진 word2vec ]

 

 

 

두번째 방법은 워드 임베딩(Word Embedding)으로 0, 1과 같이 두개의 값이 아니라 0~1 사이의 벡터값을 가집니다. 하나의 단어마다 각 벡터의 차원을 모두 사용하기 때문에 벡터의 크기를 작게 할 수 있습니다. 또한 비슷한 단어는 벡터의 값 역시 유사하기 때문에 학습이 더 잘된다는 장점이 있습니다. 대표적으로는 Word2Vec를 들 수 있는데 신경망을 통해 문서 데이터에서 각 단어의 벡터를 학습합니다.

 

dense.png

 

[ 워드 임베딩 - 출처 : 쉽게 씌어진 word2vec ]

 

 

 

< 참고 자료 >

- 쉽게 씌어진 word2vec

자연어 기계학습의 혁명적 진화 - Word2Vec에 대하여

단어 간 유사도 파악 방법

 

 

 

RNN과 LSTM

 

보통 일반적인 신경망은 피드포워드(feedforward) 방식입니다. 입력에서 출력까지 한쪽 방향으로만 흐릅니다. 하지만 순환 신경망인 RNN(Recurrent Neural Networks)은 출력이 다시 입력으로 들어가는 것이 가장 큰 특징입니다.

 

예를 들어, 신경망은 그림 데이터가 들어오면 어떤 사진인지 분류를 할 수 있습니다. 다음 번 그림이 입력되면 바로 전 그림과는 전혀 상관이 없이 다시 처음부터 판단을 합니다. 하지만 RNN은 시간적인 순서가 중요합니다. 이전 출력이 다음번 출력에 영향을 주기 때문입니다. 그래서 주식 같은 시계열 데이터나 자연어 같이 연속적인 상관관계가 있는 분야에서 많이 사용됩니다.

 

rnn.jpg

 

multidimensional-rnn-4-638.jpg

 

이런 RNN의 가장 큰 단점은 입력 데이터 사이의 거리가 멀어질 수록 의미를 기억하지 못한다는 것입니다. 예를 들어, '철수는 남자다. 그는 '이란 문장이 들어왔을때 '멋지다'란 결과를 내도록 학습할 수 있습니다. 하지만 '철수는 남자다. 하지만 나는 여자다. 여자인 나는 아름답다. 그런데 그는 '처럼 '철수'와 '그' 사이가 멀 경우에는 문맥을 파악하기가 힘듭니다. 

 

이런 문제를 보완한 것이 LSTM(Long Short Term Memory networks)으로 RNN의 특별한 종류입니다. 보통 텐서플로에서 구현을 할 때면 이런 LSTM Cell을 기본으로 사용하게 될 것 입니다.

 

 

 

< 참고 자료 >

Recurrent Neural Network (RNN) Tutorial

- LSTM(RNN) 소개

 

 

 

Seq2Seq로 챗봇 구현

 

딥러닝으로 챗봇을 만드는 한가지 방법은 Seq2Seq(Sequence-to-Sequence) 모델을 사용하는 것입니다. 문장을 그대로 입력 받아서 바로 문장이 출력되도록 하는 방식입니다. Encoder와 Decoder 두개의 RNN을 사용하여 구현합니다.

 

예를 들어, 아래 그림처럼 'ABC'가 입력으로 들어오면 'WXYZ'가 출력으로 나옵니다. <go>와 <eos>는 시작과 끝을 나타내는 기호입니다. 'ABC'를 Encoder로 순차적으로 넣고 그 다음 Decoder에서 결과를 출력합니다. 여기서 Decoder의 출력이 다시 입력으로 들어가는 것을 볼 수 있습니다.

 

basic_seq2seq.png

 

 

 

Seq2Seq는 구글의 신경망 번역에서도 중요하게 사용되고 있습니다. 또한 아래 링크에 있는 것처럼 바로 간단한 챗봇을 만들 수도 있습니다. 하지만 단순한 잡담이 아니라 피자를 주문하거나 물건을 구입하는 등 여러가지 명령어를 수행하는데는 아직 적합하지 않다는 단점이 있습니다.

 

 

 

< 참고 자료 >

문장을 학습하는 딥러닝 RNN의 Seq2Seq 모델 설명

- 골빈해커님의 Seq2Seq 챗봇

 

 

 

Char-CNN으로 문장의 의도 파악

 

보통 챗봇에서 많이 사용하는 방법은 의도와 개체를 파악하는 것입니다. 규칙기반과 마찬가지로 딥러닝을 통해서도 이런 방식으로 구현할 수 있습니다. CNN은 대표적으로 이미지 분류에 높은 성능을 보이지만 캐릭터 문자를 처리하는데도 유용합니다. 아래 그림처럼 문장을 벡터로 변환하고 특징을 추출한 다음 어떤 의도인지 분류를 할 수 있습니다.

 

딥러닝의 장점은 규칙기반과 다르게 복잡한 구문분석 없이도 문장의 의미를 보다 정확하게 파악할 수 있다는 것입니다. 질문-답변 데이터만 충분히 확보가 된다면 앞으로 이런 학습을 통한 방식이 많이 사용되지 않을까 생각합니다.

 

python-tensorflow-ai-chatbo.jpg

 

[ Char-CNN 개요 - 출처 : Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용 ]

 

 

 

< 참고 자료 >

합성곱 신경망(CNN) 딥러닝을 이용한 한국어 문장 분류

CNN으로 문장 분류하기

Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용

딥러닝 기반 자연어처리 기법의 최근 연구 동향

 

 

 

RNN으로 개체명 인식 학습

 

NER(Named Entity Recognition)은 문장에서 개체명을 인식하는 것을 말합니다. 예를 들어, '피자 4개 서울시청으로 갔다줘'라는 문장에서 다음과 같이 개체명을 뽑아낼 수 있습니다. '피자(음식), 4개(숫자), 서울시청(장소)'. 예전부터 HMM이나 SVM 같은 머신러닝 기법으로 개체명을 학습할 수 있었는데 최근에는 딥러닝이 주로 사용되고 있습니다. 그 중에서 Bi-LSTM이 좋은 성능을 보인다고 합니다.

 

아래 그림처럼 문장이 입력으로 들어오면 개체명이 출력으로 나옵니다. 예를 들어, '여행 정보 알려줘'는 '여행(B-Travel) 정보(B-Info) 알려줘(O)'로 각각 매칭됩니다. 이렇게 RNN으로 개체명을 학습할 경우 문맥에 따라 보다 정확하게 판단할 수 있다는 장점이 있습니다. 단순히 단어로만 개체명을 비교한다면 '애플(음식) 파이'와 '애플(회사) 컴퓨터'에서 '애플'의 개체명을 정확히 인식할 수 없습니다. 하지만 RNN은 문장의 순서에 따라 결과가 다르게 나오기 때문에 둘 사이에 구분이 가능합니다.

 

python-tensorflow-ai-chatbot-38-1024.jpg

 

[ Bi-LSTM의 NER 태그 - 출처 : Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용 ]

 

 

 

< 참고 자료 >

개체명 분석기 개발

 

 

 

< 챗봇 개발자 모임 >

- 페이스북 그룹에 가입하시면 챗봇에 대한 최신 정보를 쉽게 받으실 수 있습니다.

https://www.facebook.com/groups/ChatbotDevKR/

List of Articles
제목 글쓴이 날짜 조회 수
문장 입력 이진분류 모델 레시피 - 영화평점 학습 [3] 깊은바다 2018-04-04 394
잡담봇 삽질기 - 문봇에서 딥러닝 Seq2Seq로 문장 생성 깊은바다 2018-03-25 664
챗봇에 딥러닝 학습을 적용하기 어려운 이유 file 깊은바다 2018-03-23 3744
RNN과 Torch로 발라드곡 작사하기 깊은바다 2018-03-23 341
딥러닝을 사용한 감성분석기 개발 깊은바다 2018-02-22 1285
한국어 자연어처리를 위한 딥러닝 깊은바다 2018-02-14 2526
딥러닝을 사용한 챗봇 개발방법 정리 file 깊은바다 2018-02-03 15432
구글 딥러닝 자연어 처리 오픈소스 SyntaxNet file 깊은바다 2017-12-28 2300
쉽게 씌어진 Word2Vec [2] 깊은바다 2017-12-25 915
딥러닝 기반 자연어처리 기법의 최근 연구 동향 [2] 깊은바다 2017-12-17 826
문장을 학습하는 딥러닝 RNN의 Seq2Seq 모델 설명 file 깊은바다 2017-09-15 6168
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용 깊은바다 2017-08-25 1920
End-To-End Memory Networks - 자연어 질문에 대답하는 모델 [2] 깊은바다 2017-08-21 774
딥러닝 RNN으로 구현한 챗봇 깊은바다 2017-08-01 6171
추론이 가능한 딥러닝인 Relational Networks [2] 깊은바다 2017-06-11 2566