최근 3년 전부터 챗봇의 성능이 향상되고 관심도가 높아지고 있다.
가장 큰 이유는 google에서 개발한 word2vec, Seq2Seq 와 Encoder, Decoder 때문이다.
사실 위 기술들은 번역에서 아주 성공적인 성과를 낸 기술인데 이를 챗봇에 응용한 기술들이 많이 등장하고 있다.
이들이 무엇인지 어떤 원리인지 어떻게 쓰이는지 어떤 성과를 내는지 적기에 앞서
챗봇에 대한 전반적인 지식에 대해 먼저 정리하고 넘어가도록 하겠다.
Task-oriented Dialogue Generation
: close-domain으로 불린다.
: 대화의 목적이 분명하다
: ex) 도미노 피자의 배달 주문 챗봇
Non-Task-oriented Dialogue Generation
: open-domain으로 불린다.
: 대화의 목적이 없다.
: ex) 심심이. 튜링 테스트 챗봇
open-domain의 경우 사실 아주아주 어렵다. 완전 사람처럼 행동해야하고 필요한 데이터의 량이 무한하다고 할 수 있을 정도로 거대하기 때문이다.
Task-oriented Dialogue Generation
-> Seq2Seq, FastText
-> Encoder, Decoder
Non-Task-oriented Dialogue Generation
위 내용은 챗봇 관련 논문에 대해서 조사한 것이다. 최근 나오는 챗봇 기술의 동향이라고 할 수 있다.
간단하게 이야기하면, 두 가지 영역에서 많은 알고리즘들이 적용되어 왔는데, 현재는 Seq2Seq & RNN 기반의 Decoder, Encoder가 좋은 성과를 내고 있고 이를 기반으로 여러 다른 알고리즘들(강화학습, state-base 등..)을 추가적으로 적용시키고 있다.
챗봇은 어떤 목적을 가지는지에 따라 2가지로 분류된다.
분류가 어떻게 되던간에 챗봇은 어느정도의 공통된 전체적인 시스템을 가지는데 이에 대해서 먼저 설명하겠다.
Seq2Seq & RNN 기반의 Decoder, Encoder는 Generative Model에 분류된다.
그렇다면 2번 모델만으로 챗봇을 만들 수 있을까? 가능하다. 하지만, 문법적인 오류를 해결할 수 있는 방법이 현재로는 없다.
따라서 1번 모델도 차용해 2번 모델의 결과를 1번 모델에 적용하는 형식의 챗봇이
현재 상용화된 뉴럴 네트워크 기반의 챗봇의 대부분이 사용하는 전체 시스템이다.
여러 사람들이 말하고 있으면서 다들 이야기하는 것이 "챗봇 만들기 쉽다." "텐서플로우에 있는거 가져다 쓰면 다 된다"
내가 생각했을 때는 전혀 아니다.
일단 위 2가지 모델을 모두 구현해야 한다.
Generative Model을 사용해 답변을 만들고, 문법적인 오류를 Retrieval-based Model로 해결하는 형식의 챗봇이 될 것이다.
게다가 어느정도 성과를 내는 챗봇을 만드려면 학습데이터도 엄청나게 많아야 하며 여러 필요한 과정이 상당히 많다.
챗봇에 필요한 모델을 이해했으면 이제 모델에 필요한 데이터에 대해 공부해보자.
§Count Based Data type?
GloVe는 스탠포드에서 개발한 기술로, 어떤 단어나 문서를 분류하는데 있어서 뛰어난 성능을 가지고 있다.
vector space에 대해 간단히 이야기하면
행렬(문서, 단어)에 element는 각 문서별 등장 단어의 갯수가 들어간 2차원 벡터들을 만들고,
이들을 공학선형대 수학적인 연산을 통해 토픽을 만들어 내고, 단어의 갯수를 통해 상징성을 띤 단어, 중요한 핵심 단어, 조사 등을 구분해내고 카테고리를 분류하는데 적합한 데이터 타입이다.
우리는 챗봇을 만들 것이기 때문에 아래의 데이터 타입을 사용하겠다.(word2vec)
하나의 뉴럴 네트워크 모델이다.
one-hot vector를 입력해 dense vector로 출력하도록 학습을 시켜야하는 모델이다.
Seq2Seq는 이 dense vector를 입력으로 받아 하나의 단어(one-hot vector)를 유추해내는 모델이다.
이 둘은 다른 2가지 뉴럴네트워크 모델이다.
즉, 전체 구조는 하나의 단어->Word2vec(이미 학습이 되어있음)-> dense vector->Seq2Seq->하나의 단어(예측된 값)이 나오는 것이다.
먼저 word2vec를 학습하는 과정을 알아보자.
현재 2가지 방법을 기반으로 가장 많이 구현되는데 텐서플로우는 2가지 방법을 모두 지원(파라미터를 통해 설정 가능, defalut=skip-gram), 여기서는 skip-gram을 기준으로 설명하겠다. (성능은 Skip-Gram이 더 좋다는 결과의 논문이 많이 나와있으며, CBOW의 한계를 극복했다는 평가를 받고 있다.(학습 데이터가 작거나 distribute한 데이터에 대해서는 CBOW가 더 좋다는 결과도 있음).
과정을 정리하면
학습시킬 문장이 수십만 수백만개가 있을 때
0) 수십만 수백만개의 문장 중 1개를 뽑는다.
1) 한 개의 문장을 단어 별로 분해한다. (Seq2Seq일 경우 워드 단위)
2) 각 단어를 one-hot vector로 치환한다. (등장할 단어가 1000개라면 1000개의 비트 배열에 각 단어별로 유니크한 1자리 비트 값을 주어야 함.)
3) 이를 word2vec 모델에 학습시킨다.
word2vec 내에서는
입력된 단어를 미리 정해진 상수(윈도우)내에 있는 인접한 단어들을 페어쌍으로 묶어서 반영한다.
즉, 인접한 단어들끼리 연관성을 만들어서 웨이트에 반영하는 것.
학습이 완료된 word2vec 모델은 하나의 단어를 입력했을 때 다음 단어로 가장 연관성이 깊은 단어가 출력되도록 하는 것이다.
최대한 간략히 설명하려다보니 오히려 더 헷갈리는거같다.
어떻하지
..
예시를 들어서 설명 하겠다.(Word2vec)
입력
1) 고양이가 야옹야옹 운다.
2) 강아지는 멍멍 운다.
2가지 문장이 있다.
먼저 분해한다.
"고양이가" "야옹야옹" "운다"
"강아지는" "멍멍" "운다"
일단 접미사는 때버려야 학습도 잘되고 결과도 잘나온다. 단 이런 전처리때문에 앞에서 언급했듯이 결과에 문법적으로 오류가 생긴다.
먼저 전처리 과정을 거치겠다.(텐서플로우에서 여러 함수를 지원한다. 정규 표현식으로 원하는 대로 전처리 할 수 있다. 조사, 접미사, 접두사 등..)
"고양이" "야옹야옹" "운다"
"강아지" "멍멍" "운다"
이제 1번째 문장을 학습해보자
먼저 총 단어의 갯수가 5개다.(고양이, 야옹야옹, 강아지, 멍멍, 운다)
5개의 비트로 각각의 단어를 표현하겠다.(one-hot vector)
one-hot vector로 각 단어 표현
고양이 = [10000]
야옹야옹 = [01000]
운다 = [00100]
강아지 = [00010]
멍멍 = [00001]
이들을 학습 했다라고 가정한다. (skip-gram neural network, 윈도우는 1이라고 가정-> 즉, 하나의 단어에 대해서 좌우 1개의 단어만을 페어로 만듬)
전처리의 결과는 무엇일까?
고양이 -> (고양이, 야옹야옹)
야옹야옹 -> (야옹야옹, 고양이)
-> (야옹야옹, 운다)
운다 ->(운다, 야옹야옹)
강아지 -> (강아지, 멍멍)
멍멍 -> (멍멍, 강아지)
-> (멍멍, 운다)
운다 -> (멍멍)
각 단어별(고양이, 야옹야옹, 운다, 강아지, 멍멍)은 하나의 벡터로 표현된다.
각각의 전처리 과정을 거친 array들을 학습 데이터로 삼아
모델을 만든다. 이 모델이 word2vec 모델이 되고,
이후 입력 데이터들(one-hot vector들)을 여러개의 vector로 표현하고 이들의 집합을 dense vector라 하며, 이게 word2vec의 결과값이다.
이 결과값을 Seq2Seq에 넣어서 출력되는 값을 한 번 유추해보자.
아래 4가지 단어를 서로 영향을 안 끼치도록 입력했다고 가정.
"강아지는 어떻게 우니?" 문장을 word2vec에 입력해 dense vector로 바꾸어 입력한다.
결과는? 입력은 거꾸로 넣는다. 그래야 앞에서 부터 대답함(전처리를 통해 접미사 등을 때고 하나의 단어로 대체함->문법오류발생의 원인 중 하나)
울다 / 어떻게 / 강아지 -> 멍멍 -> 예측 불가 -> 운다
-> 즉, "멍멍 운다" 가 나올 것이다. (울다, 어떻게, 강아지)와 가장 가까운 벡터는 멍멍, (울다, 어떻게, 강아지, 멍멍)과 가장 가까운 벡터는 운다 이기 때문에.
이런 유사성은 언어별(외국어)매칭, 번역에 사실 가장 적합하다.
생각해보면
사과 - apple
빨갛다 - red
가 있으면 "사과 빨갛다" 를 영어로 번역한다는 가장 유사한 위치의 벡터를 찾으면 "apple red"가 나올 수 밖에 없다.
이를 통하면 중의적 표현, 숨은 문맥조차도 번역이 가능하다. 현재 구글과 네이버(파파고) 번역이 엄청난 성능을 내는건 이것 때문이다.
이런 뛰어난 성능을 보여줬고 이를 챗봇에 응용하면서 최근 챗봇에 대한 구현율, 성능이 높아지고 있고 관심을 받고 있다.
기술에 대해서 간략하게 정리해 모두 적으려고 했는데 적다보니 길어지고 설명이 많아진다.
사실 챗봇에 대해 최근 논문들과 기술 들을 조사하고 이해한 후 세미나를 진행한 것을
나름 정리하려고 블로그에 작성하는 건데,
처음의 목적(간략)과 다르게 깊이가 깊어지는 것 같다.
다음 포스팅은 seq2seq와 encoder decoder의 원리
그리고 가장 중요한
왜 encoder와 decoder를 쓰는가, 어떤 의미를 가지는가? 어떤 결과를 위해서인가? 어떤 문제점 때문인가?
에 대해서 포스팅을 하고,
최근 논문들이 어떤 기술을 접목시키고 어떤 방향으로 나아가고있는지 알아보도록하자.
'ML > theory' 카테고리의 다른 글
[chatbot] 챗봇의 동향, 기술... 등에 대하여(2) (0) | 2017.05.02 |
---|---|
ML 5-2. [Deep Neural Network] XOR (0) | 2017.03.15 |
ML 5-1. [Deep Neural Network] basic concept (0) | 2017.03.13 |
ML 4-2. [Tip] Learning and Testing (0) | 2017.03.10 |
ML 4-1. [Tip] Learning rate, data preprocessing, overfitting (0) | 2017.03.10 |