버티의 블로그

[자연어처리 #02] Text Mining 본문

AI/자연어처리

[자연어처리 #02] Text Mining

ㅤ버티ㅤ 2024. 6. 23. 19:07
728x90

Word2Vec

기존 정수 인코딩과 one-hot 인코딩의 단점들은 다음과 같았다.

  • 단어 사이 연관성 파악의 어려움
  • 과도한 메모리 사용 문제
  • 희소 표현 (Sparse Representation) : 1이 0에 비해 너무 적어 확률이 낮아질 수 있다.

Word2vec은 이러한 단점들을 개선한 방법이다.

  • 단어 사이 유사도Neural Network를 사용하여 Dense Representation으로 표현
  • 벡터 차원을 원하는 대로 설정 가능
  • 데이터를 이용해서 표현을 학습함.
  • CBOW와 Skip-Gram이 존재

1) CBOW (Continuous Bag of Words) : 주변 단어를 활용해 중간 단어를 예측

  • 주변 단어를 one-hot 인코딩하여 Input Layer로 입력, 이 값들을 산술평균 후 weight matrix를 곱함
  • 중간의 Projection Layer 결과는 h차원으로 중심 단어에 대한 dense representation

  • Output Layer 결과는 m차원으로 중심 단어에 대한 ont-hot 인코딩 형태
  • 따라서 h < m이 되어야 한다.
  • 정리하면 최종 예측결과가 중심단어가 되도록 supervised learning한다.
  • 이후 loss function을 계산하고 각 weight에 대한 gradient를 취해서 back-propagation

2) Skip-Gram : 중간 단어를 활용해 주변 단어를 예측

  • CBOW와 완전히 반대되는 개념이라 구조도 정반대이다.

NN-Language Model

 

Neural network n-gram language model에 적용시킨 것이다. 위 예시는 3-gram일 때 앞의 세 단어로 뒤의 단어가 나오도록 NN으로 학습한다. 이때 단어들은 one-hot이나 word2vec 인코딩을 사용한다.

 

그러나 NNLM은 정해진 길이의 과거 저보만 참조하므로 long-term 정보를 파악할 수 없고, 길이가 달라지는 경우에 취약하다.

 

구조를 보면 CBOW와 비슷하지만 차이가 있다. CBOW주변 단어로 중심 단어를 예측하지만, NNLM과거의 단어들로 다음 단어를 예측한다.

지금까지의 방법들은 단어 수가 많아질수록 예측 능력이 떨어지게 되어 Negative Sampling으로 학습 효율을 높이고자 한다. 이는 word2vec 과정에서 대상 단어와 관련이 높은 단어들에 보다 집중한다. 이에 SGNS가 탄생했다.

SGNS

 

Skip-gram과 다르게, SGNS선택된 두 단어가 중심단어와 주변단어 관계인지를 확인한다. 위 그림에서 skip-gram은 중심단어 for로 주변단어인 hard가 바로 나온건데, SGNS는 두 단어인 forhard를 넣고 중심단어와 주변단어 관계인지 확인한다. 1에 가까울수록 그렇다는 것이다.

 

그러면 단어들의 쌍을 0.5를 넘는것만 1을, 못넘으면 0을 부여하여 binary classification 형태로 바꾼다. 그리고 아예 관련 없는 단어를 넣어 negative 예시를 사용하여 학습한다. 그래서 negative sampling이라고 불린다.

활용 예시를 설명하면 다음과 같다.

  1. for, hard에 대한 one-hot 인코딩 벡터가 입력으로 들어간다.
  2. output이 나오면 binary classification에 대한 cross-entropy를 구한다.
  3. Loss를 계산하여 back-propagation으로 gradient를 업데이트시켜 학습한다.

GloVe

Co-occurrence Matrix는 두 문장에서 붙어있는 단어의 수를 단어별로 기록하여 만든 matrix인데, 대각선이 모두 0이고 대각선 기준으로 대칭되어 A = A^T 관계가 성립한다.

여기서 Co-occurrence Probability대상 단어 다음에 특정 단어가 나올 확률을 뜻한다.

ice 다음에 cream이 나올 확률이 높고, ice 다음에 fire가 나올 확률은 낮을 것이다.

 

이때 GloVe는 Co-occurrence probability를 word2vec에 임베딩해보고자 하는 것이다. 중심단어주변단어를 사용하는건 똑같은데, 이들의 내적이 co-occurrence probability와 거의 비슷하게 만들도록 한다.

Glove notation

 

다시 말하지만 GloVe의 목적은 아래와 같이 중심단어와 주변단어 내적이 p(k|i)와 거의 같도록 만든다. 보통 NN에서는 확률에 log를 붙여 사용한다.

 

GloVe Loss Function

wi, wj는 각각 중심단어 후보1, 2고 주변단어 wk가 있을 때 다음과 같이 정의한다.

만약 값이 크면 분자가 크다는 의미이므로 k 다음이 i가 올 확률이 크다는 것이고, 값이 작으면 분모가 크다는 의미이므로 k 다음에 j가 올 확률이 크다는 것이다.

 

그러면 후보1에서 후보2에 대한 임베딩 벡터를 빼주고 결과값을 비율로 따지고자 한다. 그리고 Co-occurrence Matrix는 A=AT이므로 transpose를 취해주고, 준동형성 성질 f(a)/f(b) = f(a-b)를 활용해서 다음과 같이 식을 변형할 수 있다.

 

이제 분자쪽만 살펴봐보자. 여기서 함수 f가 지수함수라 가정하고, 양변에 log를 취해서 우리가 원하는 GloVe의 목적과 걸맞는 식을 도출할 수 있다.

마지막으로 -logXi를 없애주기 위해 일종의 bias만 더해주면 끝난다.

여기서 우항을 좌항으로 넘기고 제곱을 한게 최종 GloVe Loss Function이다.