Tensorflow 2 NLP(자연어처리)/단어 임베딩

[3-1] NPLM이란?

Suhd 2021. 11. 12. 22:33

NPLM (Neural Probabilisitic Languague Model)은

기존의 통계 기반 언어 모델의 단점을 어느정도 극복시킨 모델이다.

그렇다면, 기존의 통계기반 언어 모델은 무엇인가?

앞서, 언어 모델이란 단어 시퀀스(순서) 에 확률을 부여하는 모델이다.

흐름을 설명해 보겠다.

1. 만약 '영원히 기억될 최고의' 라는 표현 다음에 '명작이다' 라는 단어가 나타날 확률 을 구해보자

이는 최대우도추정법으로 유도 가능하다.

 

최대우도추정법에 대한 설명은 내 블로그 NLP 카테고리를 보면 이해가 가능하다.

여기서 우리는 최대우도추정법을 이용해 '영원히' ,'기억될' ,'최고의' 라는 변수만을 이용해 본래 변수인

'명작이다'라는 변수까지 추정해 볼 수 있다는 것이다.

하지만, 문제가 생긴다. 통계기반 언어 모델은 한번도 보지 못한 단어 순서로 이루어진 문장에는

확률을 0으로 부여한다.

(이유 : 특정 순서의 문장이 나타날 경우/전체 문장 경우 를 할때 분자가 0이 되므로)


2. 이런 문제를 일부 해결하기 위해 우리는 전체 단어 시퀀스 등장확률을 적은 단어 시퀀스의 등장 확률로

근사 한다. 이것은 '한 상태의 확률은 그 직전 상태에만 의존한다' 는 마코프 가정에 기반했다.

이제 우리는 '영원히 기억될 최고의' 다음에 '명작이다'가 나올 확률을

=> '최고의' 다음에 '명작이다'가 나올 확률로 근사할 수 있다.

 

기존의 '영원히 기억될 최고의 명작이다'가 나올 확률은

=> ('영원히'뒤에 '기억될'이 올 확률) X ('기억될' 뒤에 '최고의' 가 올 확률)

X ('최고의' 뒤에 '명작이다' 가 올 확률) 이다.

하지만 근사를 통해 하나의 확률만 취함으로 인해 확률이 많이 높아졌다. (확률 높이는게 목적)

 

하지만 그래도 문제가 있다. 학습 데이터에 한 번도 등장하지 않은 n-gram (단어들) 이 존재할 때

그 단어의 옳음 확률을 0으로 판단한다(아까와 똑같은 이유로 분자가 0이 됨)


여기에 back-off 와 smoothing 기법이 문제를 완화 시켜 주지만 이것만으로는 부족하다.

 

+ back-off : 기존에는 문장에 있는 전체 단어가 모두 배운적이 있어야지만 옳은 문장이였지만

배운적이 있는 단어 몇 개가 포함되어 있기만 하면 그 문장이 옳은 문장이다라는 확률을 일정 부여

+ smoothing : 배운적이 없는 단어 순서로 이루어진 문장에도 옳은 문장이다라는 확률을 일정 부여

(모든 등장 빈도에 k를 더하는 것이기 떄문에 Add-k smoothing 이라고도 부름)


이에 요슈아 벤지오 연구팀이 제안한 기법(Benigo et al.2003)

https://www.jmlr.org/papers/volume3/tmp/bengio03a.pdf

이 등장했다.

이들은 기존의 문제를 다음과 같이 정리했다.

 

1. back-off와 smoothing 만으로는 완전하지 않다.

2. 문장의 장기 의존성(long-term dependency)을 포착해내기 어렵다

(= 문장에 포함된 단어가 너무 많아질수록 등장확률이 0인 문장들이 기하급수적으로 증가)

3. 단어/문장 간 유사도 계산 불가

 

다음은 NPLM 구조 그림이다.

논문 내 NPLM 구조 그림

 

이는 딥러닝 학습을 이해하고 있다면 쉽게 이해 가능하다. 딥러닝 학습에 대한 이해는 다음 링크에서 가능하다.

https://wikidocs.net/36033

 

04) 딥 러닝의 학습 방법

이번 챕터에서는 손실 함수와 옵티마이저의 개념을 가지고, 딥 러닝에서 어떻게 학습을 하는지에 대해서 배웁니다. ##**1. 손실 함수(Loss function)** ...

wikidocs.net

 

 

맨 아래에 있는 w들이 단어를 순서대로 입력받는 곳이고,

=> 입력은 원-핫 벡터로 받기 때문에 의미를 부여해주기 위해 랜덤 C 행렬을 곱해준다 (이는 내적과 같다.)

=> 이후 출력을 받은 다음에 우리는 '출력'을 '순서대로 입력받은 단어 뒤에 나올 단어'로 만들기 위해

역전파 방식을 통해 학습을 한다.

요약하면 NPLM은 '순서를 고려하는 단어 몇 개' 를 입력받아 '그 뒤에 오는 단어'를 예측하도록 학습을 해놓은다.

학습 이후에는 우리는 '순서를 고려하는 단어 몇 개' 와 '그 뒤에 오는 단어' 는 서로 연관이 있다고 말할 수 있다.

 

또한, 우리는 '순서를 고려하는 단어 몇 개' 들에 해당하는 단어들은 서로 연관이 있다고도 볼 수 있다.

=> 이에 해당하는 단어들은 C행렬이 학습을 통해 변함에 따라

벡터 공간에 같은 방향으로 점점 맞추어 진다. (gradient descent 사용됨)

이제 우리는 이 정보를 이용해 단어들을 벡터 공간에 표현 (= 단어 임베딩) 을 할 수 있다.