본문 바로가기

ML & AI/unsupervised

[NLP] 자연어 처리 #2 인공신경망 언어모델

인공신경망 언어모델을 정리하기 전에 자연어 처리를 위해 문자를 숫자로 변경하는 기법에 대하여 이해해야한다. 자연어를 처리하기 위함이라고 하더라도 실제 컴퓨터나 인공신경망은 문자가 아닌 숫자형태로 데이터를 이해하고 처리하기 때문이다. 이를 정수 인코딩이라한다.

정수 인코딩이라함은 간단히 단어 집합을 컴퓨터나 인공신경망이 이해할 수 있는 벡터(Vector)로 변경하는 것을 말하며, 크게 One-hot Encoding과 Word Embedding으로 구분할 수 있다. 

 

1. 원-핫 인코딩(One-Hot Encoding)

원-핫 인코딩은 여러 개의 단어로 구성된 단어 집합에서 중복된 단어를 제외한 단어를 토큰화(Token)하고, 각 단어에 고유 숫자(Index)를 갖는다. 즉 벡터 내 인덱스값을 '1'표시함으로써 단어를 구분할 수 있다.

 

예를 들어 단어의 집합을 정수 인코딩하면 다음과 같다

[문장] 홍길동은 성춘향을 좋아한다.
[토큰] '홍길동', '은', '성춘향', '을', '좋아한다'
[인덱스] {'홍길동' : 0, '은' : 1, '성춘향' : 2, '을' : 3, '좋아한다' : 4} 

또한 위의 정수 인코딩된된 토근과 인덱스를 원-핫 인코딩으로 변경하면 다음과 같다.(희소표현 방식)

'홍길동'    : [1, 0, 0, 0, 0]
'은'          : [0, 1, 0, 0, 0]
'성춘향'    : [0, 0, 1, 0, 0]
'을'          : [0, 0, 0, 1, 0]
'좋아한다' : [0, 0, 0, 0, 1]

원-핫 인코딩은 매우 간결하고 사용이 편리한 장점이 있지만, 단어의 개수가 늘어날 수록 벡터 공간이 증가하는 문제가 있다. 위의 예에서는 단어가 5개로 벡터의 공간도 5개만 있으면된다. 하지만 단어가 1000개, 10000개로 구성된 집합인 경우 벡터공간도 1000개, 10000개가 필요하게 된다. 

 

또다른 문제점은 단어간 유사도를 계산하지 않는다는 것이다. 예를 들어 '홍길동'과 '성춘향'이라는 단어가 매우 밀접한 관계를 가진다고 했을때 원-핫 벡터로 인코딩된 결과에서는 '홍길동'과 '성춘향'을 연관지어 결과를 도출할 수 없다. 즉 '홍길동'을 검색하면 오직 '홍길동'만 검색될 뿐이다. 

 

이러한 문제를 해결하기 위해 단어의 잠재적 의미를 고려하여 단어간 유사도를 유지하면서, 벡터공간 낭비를 줄일 수 있도록 밀집표현 방식으로 다차원 공간 벡터를 만드는 기법을 Word Embedding(워드 임베딩)이라 한다. 이렇한 다차원 공간 벡터화 기법은 크게 카운트(빈도) 기반과 예측 기반으로 나뉘어진다.

 

  • 카운트 기반 벡터화 : LSA, HAL
  • 예측 기반 벡터화 : NNLM, RNNLM, Word2Vec, TastText

가장 많이 사용되는 Word Embedding기법은 Word2Vec(워드투벡터)이지만, 그 전에 기본적인 인공신경망 언어모델인 NNLM에 대해서 정리해본다.

 

2. 피드 포워드 인공신경망 언어모델 (feed-foward Nueral Network Language Model)

NNLM앞서 정리한 n-gram과 마찬가지로 다음 단어를 예측할 때 앞의 모든 단어를 참고하는것이 아니라 정해진 n개의 단어만을 참고한다. 다만 통계적 언어 모델인 n-gram 는 단어의 의미적 유사성을 유지한다는 점에서 차이가 있다.

 

NNLM입력층, 투사층, 은닉층, 출력층으로 총 4개의 층으로 이루어져있다. n=4인 즉 입력이 4개인 NNLM을 구조화하면 다음과 같다.

 

중요한 부분 세가지를 정리해보면...

 

첫번째, 투사층(Projection Layer)는 입력값으로 들어온 4개의 원-핫 벡터와 미리 지정된 가중치행렬(W)를 곱해서 Lookup Table을 생성한다. Lookup Table의 값은 최초에는 랜덤한 값을 가지지만 학습을 거치면서 값이 변경된다. 이를 임베딩 벡터(embedding vector)라고 부른다. 결국은 이 임베딩 벡터가 입력된 단어들의 유사도를 가지는 벡터값으로 예상된다.

 

두번째, M차원의 임베딩 벡터는 은닉층(Hidden Layer)을 지나며 활성화함수(softmax)를 통해 입력값과 동일한 차원의 출력벡터가 생성된다. 출력벡터는 입력벡터와 동일한 크기(차원)을 가지며, 0-1사이의 값이고, 총합이 1인 벡터가 된다.

 

마지막으로 출력층(Output Layer)은 손실함수(cross-entropy)를 사용하여 예측값과 실제값이 가까워지도록 역전파를 통해 지속적으로 학습하게된다.

 

인공신경망의 세부 동작원리를 모두 이해하지는 못한다. 다만 NNLM은 단어간 유사도를 표현한 다차원 공간 벡터를 만들고, 이를 통해 희소문제(sparsity problem)을 해결할 수 있는 것으로 이해된다. 또한 지속적인 학습을 통해 유사도를 변경하며 유사한 단어들의 임베딩 벡터를 비슷하게 만들어가면서 예측률을 높일 수 있다는 것 같다

 


내 목표가 인공신경망 알고리즘을 개발하는 것은 아니지만, 구현하고자 하는 목적에 적합한 알고리즘 또는 모델이 무엇인지 판단할 수 있어야한다고 생각한다. 수식이나 내부 동작 방식 보다다는 장/단점과 활용도를 이해하는 것을 목표로 정리하고 있지만 확실히 수학적인 이해가 많이 아쉽다.

'ML & AI > unsupervised' 카테고리의 다른 글

[NLP] 자연어 처리 #1 개념  (0) 2020.12.04
[알고리즘] 주성분 분석(PCA)  (0) 2020.10.27