앞 포스팅에서 word2vec를 공부했다. 이제 seq2seq에 대해 알아보자.



먼저 인코더 디코더가 없는 seq2seq에 대해 이야기하자. 하나의 문장을 넣고 그것의 예측된 문장(워드 단위 순차적으로)을 출력한다.


"ABC" 입력에 "WXYZ"가 출력이 된다.

W 출력값을 그대로 입력으로 넣어 다음 값 X를 뽑고, 다시 X를 넣어 Y를 뽑고 .. 이를 반복해 결과를 출력하는 알고리즘이다.


여기서 문제점은 입력 문장의 길이가 길어진다면 RNN의 고질적인 문제점이 그대로 적용된다는 것이다.

초기에 등장한 아주 중요한 단어가 있다. 이 단어는 뉴럴 네트워크를 거치면서 아주 중요하기 때문에 가중치를 0.9(최대1)을 계속해서 할당한다.

즉, 0.9 0.9 0.9 계속 중요하다고 중요하다고 강조한다.

하지만 결국 길이가 길어지면 아무리 중요한 단어라도 0에 수렴하게 되어버린다.

즉 까먹어 버린다는 것이다 중요한 것(과거의 기본 정보 모두)을 점점 잃어버린다는 것이다.


먼저 RNN에서 이런 문제를 최소화 하기 위해 개발된 알고리즘이 있는데 LSTM이다. (물론 GRU도 포함)

따라서 Seq2Seq에서는 LSTM, GRU알고리즘이 가장 많이 사용되고 있다.

(GRU는 LSTM내부의 게이트웨이 숫자를 줄인 알고리즘, 성능은 비슷, 코스트가 좀 더 작은 것이 특징)


또한 여기서 중요한 것을 중요하다고 다시 한번 되새김질하기 위해 개발된 것이 아래의 encoder decoder이다.

§encoder?
§convert the input sentence into a vector

x : input sentence    X : vector value(using word2vec)


h_i : hidden state at time i  f : non-linear function (GRU)


h_i=f(h_(i-1), X_i)


c : context vector  T : length of the input sentence


c=q({h_1,h_2,…,h_T })


§decoder?

§generates the output sentence char by char(or word by word)


인코더 디코더의 특징은 각 입력이 들어갈 때마다 Attention을 통해 좀 더 중요한 것은 중요하다고 기억하고 덜 중요한 것은 덜 중요하다고 기억하는 것이다. 이를 통해 깊이가 깊어지더라도 어떤 단어가 중요하고 어떤 단어가 불필요 한 것인지에 대한 문제점을 최소화 하고있다.


사실 뉴럴네트워크에서 과거의 것을 잃어버리는 것은 아직까지 해결되지 못한 문제이다.

아직까지도 이를 최대한 줄이고 개선시키는 기술은 논문이 지속적으로 나오고 있다.


이외에도 좀 더 사람답게 대답하기 위해 같은 대답의 빈도를 낮추기 위해 출력 초기값을 새로 설정한다던가(LTS 모델), 강화학습을 통해 채팅과 함께 더불어서 성능을 향상 시키는 모델(모른다, 모른다, 모른다의 문제점이 발생-> state-based 모델 등으로 개선중) 등 

Seq2Seq와 encoder decoder라는 기둥을 두고 여러 기술이 적용되고 있다.


또한 Word 단위(Seq2Seq)가 아니라 char단위의 학습(FastText)도 등장하고 있다.

(사실 FastText는 Seq2Seq 개발자 중 1명이 구글에서 페이스북으로 이직한 후 개발한 것)


뭐 그래 그렇다.

내생각을 정리하려고 블로그를 쓰지만 이번 포스팅은 귀찮아서 막던진것같다.

발표자료도 정리안하고 그냥 다 가져다 붙이고..

읽고 이해되는 포스팅은 아닌거 같다. 단순 참고용 정도?


다음은 실제 tensorflow를 활용해 Word2vec, Seq2Seq를 개발하고 encoder, decoder를 통해 Generative model 구현

더 나아가 검색 기반 모델도 구현하고 이를 합쳐 기초적인 챗봇을 만들 예정이다.

이후에는 전체적으로는 개인 프로젝트 AWS와 함께 엮어 클라우드 기반의 챗봇 서비스를 구현하는 것을 목표로 하겠다.



+ Recent posts