레플리
글 수 281

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

조회 수 25393 추천 수 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
제목 글쓴이 날짜sort 조회 수
Pi를 만든 Inflection AI, MS로 대거 이직한 이유 깊은바다 2024-03-25 48
LLaMA나 Mistral이 계속 무료로 유지될 수 있을까 깊은바다 2024-03-05 148
GPT-3.5와 클로바X 가격 비교 file 깊은바다 2024-02-25 188
OpenAI, 성능은 높아지고 가격은 싸진 새로운 모델 공개 file 깊은바다 2024-01-26 293
AI 휴대용 기기 R1을 만든 Rabbit의 대표 Jesse Lyu 깊은바다 2024-01-12 234
화면을 보고 스마트폰 앱 사용방법을 배우는 모델 - AppAgent file 깊은바다 2024-01-08 269
LLM의 새로운 기법 - Merge와 DPO file 깊은바다 2024-01-02 959
업스테이지 SOLAR 10.7B에서 사용한 DUS 모델 확장 방법 file 깊은바다 2023-12-27 375
죽은 아들의 AI 아바타를 만든 중국의 부모 file 깊은바다 2023-12-21 165
Private sLLM - 어떻게 만들고 어떻게 배포할까? file 깊은바다 2023-12-18 299
GPT-4가 내 여자친구보다 나를 더 잘 알까? file 깊은바다 2023-12-12 148
FSM과 생성 에이전트의 차이점 깊은바다 2023-11-22 164
RAG를 사용한 페르소나 챗봇 - ChatHaruhi file 깊은바다 2023-10-17 635
LLM Multi Agent: Customer Service를 기깔나게 자동화하는 방법 file [1] 깊은바다 2023-10-09 568
사진을 인식할 수 있는 ChatGPT 멀티모달 버전 공개 file 깊은바다 2023-09-26 272