brunch

매거진 DTAN

You can make anything
by writing

C.S.Lewis

by sokoban Nov 22. 2018

Word2Vec & Doc2Vec

Word Embeddings

  이전 부분에서 간단하게 문자들로 이루어진 범주형 데이터들을 기계가 인식하기 위한 형태로 만들기 위한 One-Hot Encoding에 대해서 알아 보았다. 그렇다면 범주로 나누기 힘들정도의 문자열 들로 이루어져 있는 데이터들을 기계가 인식하게 하기 위해서는 어떻게 하면 될까를 알아 보고자 한다.

  최종적인 목표는 인터넷상에서 이루어지는 많은 데이터들에 대해서 정상과 비정상을 찾아내는 것을 해보는것을 목표로 작업을 진행해 보고자 한다. 


  가령 예를 들어 이메일 상에서 햄과 스팸을 구별하기 위한 방법에는 어떤것이 있을까 ? 일반적인 스패머들은 돈이 되는한 스팸 필터 시스템을 우회 하기위해서 최대한 정상 메일로 위장하거나 아예 내용 자체를 간소화 시키는등 으로 필터를 우회 한다. 이럴때에는 정말 스팸이나 악성 코드가 숨겨진 메일을 찾기는 힘들다. 


  이럴때에도 만약 기계가 스팸의 유형에 대해서 좀 더 정확하게 학습할 수 있다면 이전의 필터링 시스템 보다는 좀 더 효과적으로 악성 메일을 잘 분류 할 수 있지 않을까 생각된다.  word2vec을 이용하여 스팸을 필터링 하는 시스템에 대해서도 고민해 볼수 있다고 생각된다.


Word2Vec 이란 ? 

  Word2Vec은 단어들을 벡터 값으로 표기하는데 있어 단어의 의미와 맥락을 고려하여 단어를 벡터로 표현하는 Word Embeddings를 하기 위한 텍스트 처리 방식이며 인공 신경망으로 두개의 층으로 구성됩니다. 

  

  일반적인 언어 모델링에는 N-gram 모델이 있고 이는 문자열을 N개의 길이를 기준 단위로 절단하여 학습하는 방법이며 이를 통해서 단어의 인식등을 수행한다. 하지만 간단하게 잘라서 처리하는 것은 단어 간에 대한 유사도 및 문맥에 대한 이해는 전혀 포함되지 않고 단순한 인덱싱에 그치는 경우가 많다.


  이를 해결 하기 위해서 연속적인 벡터로 단어를 인식하여 이를 분류하는데에 사용할 수 있다. 


NNLM (Neural Network Language Model)은

N-Gram NNLM

New Log-linear Models

1. Continuous Bag-of-Words Model (CBOW)

2. Continuous Skip-gram Model


  의미있는 표현을 위해서 word2vec은 라벨이 꼭 필요하지 않는다. 즉 이는 일반적인 실세계에 존재하는 다양한 요소들을 사용하여 학습 할수 있고 라벨 없이 비지도 학습의 성격을 띈다.


Word2Vec의 알고리즘


To-Be Continue






스팸 메일의 탐지의 활용


https://github.com/doodyparizada/word2vec-spam-filter

  위 git에 등록되어 있는 툴은 스탠포드의 glove를 사용하여 학습하고 스팸으로 지속적으로 리포트 될 경우 이를 스팸으로 인식한다. 스팸의 일부 내용이 변경되더라도 word2vec을 이용한 근접도를 사용하기 떄문에 탐지가 가능하다.







Word2Vec을 이용한 웹로그상의 비정상 로그 탐지 방법

 

  웹로그를 보다 보면 다양한 요청이 들어오게 된다. 이럴 경우 개발자의 의도나 서비스의 의도와는 관계없이 예외상황이 많이 발생하게 된다. 즉 이런경우 의도치 않은 보안 취약점이 발견될 수도 있고 서비스에 큰 영향을 미칠수도 있으므로 주의해서 모니터링 하고 대응 하여야 한다.


  그럼 Word2Vec을 이용해서 어떻게 하면 웹 로그상에서 이러한 비정상적인 로그를 잘 탐지할수 있을지를 알아보고자 한다.


  우선 웹 스캔 공격이 발생한 웹서버의 웹 로그를 준비하고 이를 공격과 정상으로 분류하였다.최초 비지도 학습을 통해서 자동으로 공격과 정상을 분류하는것을 목표로 연구를 진행하였으나 이 부분은 좀 더 연구가 필요한 부분이라고 생각되고 우선은 지도 학습으로 진행 해 보았다.


  실제 공격로그를 비정상으로 분류하여 Word2Vec으로 학습 시켰을때 이를 잘 분류해 주는것을 볼수 있었다. 다만 전체 웹 로그의 정상 데이터를 학습 시켜야 하는 단점이 있었으며 아래의 방식으로 해결해 볼수 있지 않을까라고 고민해 보았다.


% 웹 서버스가 그리 크지 않은 서비스의 경우 파라미터가 그리 많지 않고 Type이 한정적일 것이다. 하지만 최근의 다양한 웹 서비스를 제공하는 회사라면 어마어마한 개수의 파라미터와 Type을 볼수 있다. 이를 모두 라벨링 하도록 학습 할수 있다면 가장 좋을 것이나 만약 이를 조금이라도 편하게 작업 하고자 한다면 아래의 방식을 사용해 볼수 있다고 생각한다.

 1 우선 최초 몇개 서비스에 대해서 탐지 로직을 구성함

 2 이를 적용하여 공격자 IP를 산출

 3 라벨링 되지 않고 오탐이 많은 서비스에서 공격자 IP에서 들어온 것을 공격으로 간주하고 라벨링 하여 학습

 4 다시 머신 러닝을 하여 탐지

  -> 위의 과정을 반복적으로 수행 (다만 실제 공격이 빠질수 있으므로 그 부분에 대해서는 확인이 필요함)


  위의 해결 방법은 한계가 명확하므로 아직 테스트 해보지는 않았지만 정상적인 범주의 데이터가 많이 나올거라고 생각되므로 이에 대해서 어떻게 정상 데이터를 제거 할지를 고민해 보아야 한다.


기타


Sickit Learn 코딩중 문제 해결


SKLearn을 이용중 아래와 같이 NaN으로 아무런 내용이 없는 입력값이 들어갔을때에는 상황에 맞게 NaN을 변경해야 한다.

Traceback (most recent call last): 

  File "word2vec.py", line 174, in <module> 

    forest = forest.fit( trainDataVecs, train["sentiment"] ) 

  File "/opt/anaconda/lib/python3.5/site-packages/sklearn/ensemble/forest.py", line 247, in fit 

    X = check_array(X, accept_sparse="csc", dtype=DTYPE) 

  File "/opt/anaconda/lib/python3.5/site-packages/sklearn/utils/validation.py", line 407, in check_array 

    _assert_all_finite(array) 

  File "/opt/anaconda/lib/python3.5/site-packages/sklearn/utils/validation.py", line 58, in _assert_all_finite 

    " or a value too large for %r." % X.dtype) 

ValueError: Input contains NaN, infinity or a value too large for dtype('float32’). 


NaN이 있는지 확인 하는 방법

print(np.isnan(trainDataVecs).any()) 

 -> True 라면 현재 numpy.ndarray상에 NaN값이 존재한다.


NaN값의 변경

trainDataVecs = np.nan_to_num(trainDataVecs)

 -> np.nan_to_num를 사용하면 현재 NaN으로 아무런 값이 없는 값을 0으로 변경해 준다. 만약 NaN값으로 입력되는 값이 정수나 실수인 경우 위의 처리를 하지 않으면 에러가 난다.




TensorFlow를 이용한 분석 에러 해결


https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec.py 파일을 통해 word2vec을 돌리려고 하자 so파일을 찾을수 없다는 문제가 발생


해결책

아래와 같이 tensorflow를 활용하여 cc파일을 직접빌드하여 so를 생성해주면 해결된다.          

$  cd tutorials/embedding $ gcc -std=c++11 -shared word2vec_ops.cc  word2vec_kernels.cc -o word2vec_ops.so -fPIC -I  /home/lks21c/my27_r013_gpu/lib/python2.7/site-packages/tensorflow/include  -O2 -D_GLIBCXX_USE_CXX11_ABI=0


해결 후 word2vec 실행방법

https://github.com/tensorflow/models/tree/master/tutorials/embedding를 통해 word2vec.py 실행에 필요한 argument 및 데이터를 다운로드 받은 뒤 실행하면 정상 실행 된다.



Deep Learning 4j


https://deeplearning4j.org/kr/word2vec

 방대한 자바 패키지로 되어 있으나 파이선 버전 대비 나은점을 찾을수는 없었음



https://code.google.com/archive/p/word2vec/



참고 사이트


https://datascienceschool.net/view-notebook/6927b0906f884a67b0da9310d3a581ee/

http://www.nltk.org/book/


관련 논문들

Efficient Estimation of Word Representations in Vector Space 

https://arxiv.org/pdf/1301.3781.pdf

https://medium.com/mathpresso/efficient-estimation-of-word-representations-in-vector-space-%EB%B2%88%EC%97%AD-ac2a104a23ca


http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf


Distributed Representations of Words and Phrases and their Compositionality 

TASTE SPACE VERSUS THE WORLD: AN EMBEDDING ANALYSIS OF LISTENING HABITS AND GEOGRAPHY



샘플 소스 코드

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py


https://github.com/tensorflow/models/tree/master/tutorials/embedding

https://github.com/stanfordnlp/GloVe

https://www.kaggle.com/c/word2vec-nlp-tutorial#description

  기본적인 예제와 기술적인 부분에 대해서 설명하고 있으며 참고할 부분이 많다. 예제 내에 NLP와 Word2Vec을 활용한 예제는 실제에 적용할수 있는 좋은 아이디어를 제공한다.






브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari