Neural Vector Space Model 개발 일지

-------
군대에서 query와 document들을 매칭시키는 검색 체계 개발 프로젝트를 맡게 되었다.

근데 문제는 document들이 너무 specific한 주제들이라 query를 입력하는 사람들이 불편함을 느끼는 경우가 많다.

즉 대충 문자열로 때려 맞추는데 성능이 워낙 한계가 있다보니까 NLP적 요소를 섞어 해결해야 한다.

근데 이게 가장 문제점은 data가 없다는 것이다. document들은 주어진 상황인데 query와 같은 데이터들이 하나도 없고 심지어 feedback algorithm으로 실시간으로 query를 받아 학습하는 것도 불가능하다. 무조건 unsupervised learning을 사용해야한다.

이에 어려움을 느껴 맨 처음에 기본적인 Doc2Vec이나 TextRank와 같은 알고리즘을 섞은 혼합 짬뽕탕 같은 것들을 사용하였는데 어느 정도 성능은 나왔지만 한계가 분명 보였다.

가장 최근에 나온 unsupervised learning 기법이 2018년 쯤에 나온 C. Van Gysel의 <Vector Spaces for Unsupervised Information Retrieval>이라는 논문이다.

기법은 단순하다.

맨 처음 각각의 document들로 부터 n-gram을 뽑아낸다.

예를 들어 "we learn representations directly by gradient descent from sampled n-gram/document pairs extracted from the corpus"와 같은 문장에 대해

<we, learn, representations, directly, by>

<learn, representations, directly, by, gradient>

<representations, directly, by, gradient, descent>
와 같은 n-gram을 뽑아낸다.

그리고 embedding layer를 만들어서 각각의 단어들에 대한 embedding vector를 뽑아내는데, n-gram은 이 embedding vector를 평균내서 n-gram representation을 만든다.

이후 이를 document vector로 transformation하는 Linear Layer를 만들어서 document vector들과 대충 cosine similarity 구해서 학습하자는 내용인데, 내용이 매우 쉽기도 하고 unsupervised learning 중에는 이 방법밖에 없기도 해서 이를 구현했다.

기존에 나와있는 코드가 tensorflow 1 버전으로 구현되어 있는데 한국어로는 대충 n-gram 6 정도로 잡고 doc_emb 512, word_emb 256 잡고하면 성능 잘 나온다.

문제는 Out-of-vocabulary 문제인데 word가 vocabulary에 없을 경우에 <UNK> 토큰을 넣기 때문에 실제 쿼리를 이용하는 사람들한테 큰 문제가 생긴다.

이를 해결하려고 sub-word를 사용하는 BERT-NVSM을 사용했는데 성능이 진짜 최악이다.

아마 n-gram을 bert에 넣는 것 자체가 무리수인 것 같다. 특히 ko-bert는 tokenizer로 sentence-piece를 사용하는데 한국어 sub-word가 거의 글자 단위로 나오는 느낌이 강하기 때문에 bert에 넣는 게 무리수 인듯하다. 

그래서 document를 bert에 넣을까도 생각했지만 ko-bert는 max-length가 512가 한계다. 무리가 있다.

oov를 어떻게 해결해야 할지 감이 사실 안 잡힌다. 

댓글

  1. 논문과 프로젝트에 대해 궁금한 점이 몇가지 있는데 혹시 연락드릴 수 있을까요??

    답글삭제

댓글 쓰기

가장 많이 본 글