앞서 설명했던 시소러스와 통계 기반 기법과 달리 이번에 설명할 추론 기반 기법은 신경망을 사용한다.

 

 

통계 기반 기법의 문제점

통계 기반 기법에 대해 간단히 설명하자면, 통계 기반 기법은 주변 단어의 빈도를 기초로 단어를 표현하는 방법이다. 구체적으로는 단어의 동시발생 행렬을 만들고 그 행렬에 특잇값 분해(SVD)를 적용하여 밀집벡터(단어의 분산 표현)를 얻었다. 하지만 이러한 방식은 실제 생활에서 사용하는 수많은 단어를 다루기에는 적합하지 않다. 예를 들어 어휘가 100만 개라면, 통계 기반 기법에서는 100만x100만이라는 거대 행렬을 만들기 때문이다. 이처럼 행렬이 매우 크기 때문에 특잇값 분해(SVD)를 사용해 차원을 축소하는 것은 사실상 불가능한 일이다.

 

 

 

 

추론 기반 기법

추론 기반 기법은 신경망을 사용하여 단어를 처리하는 기법으로 미니배치 학습을 하여 수많은 어휘를 효율적으로 학습한다. 추론 기반 기법과 통계 기반 기법의 차이점에 대해서는 아래의 표를 참고하길 바란다.

 

통계 기반 기법(배치 학습) 학습 데이터를 한꺼번에 처리한다.
/
어휘에 추가할 새 단어 발생시 단어 분산 표현 갱신을 위해 처음부터 다시 계산해야한다.
/
단어의 유사성 인코딩
추론 기반 기법(미니배치 학습) 학습 데이터의 일부를 사용하여 순차적으로 학습한다.
/
어휘에 추가할 새 단어 발생시 단어 분산 표현 갱신을 위해 매개변수만 다시 학습하면 되므로 기존에 학습한 내용을 해치지 않고 단어의 분산 표현을 효율적으로 갱신할 수 있다.
/
단어의 유사성 인코딩 및 단어 사이의 패턴 파악 가능
ex. king-man+woman=queen

 

 

통계 기반 기법은 단어의 맥락을 파악했다면, 추론 기반 기법은 맥락을 입력하면 사이에 나올 단어의 출현 확률을 출력하는 형태이다. 예를 들어 you ___ goodbye and I say hello. 라는 문장에서 ___ 에 들어갈 문장에 대한 확률을 추측하는 것이 바로 추론 기반 기법이다.

 

 

추론 기반 기법이란 위의 이미지에서의 모델이 맥락 정보를 입력받아 ___에 나올 수 있는 단어의 출현 확률을 출력하고, 우리는 말뭉치를 사용해 모델이 올바른 추측을 하도록 학습시키며 그 학습의 결과로 단어의 분산 표현을 얻는 기법을 뜻한다.

 

위의 모델은 신경망을 의미한다. 그럼 어떻게 해야 신경망이 you와 goodbye를 이해하며 받아들일 수 있을까? 이를 위해 우리는 input data인 단어들을 one-hot 벡터로 변환하여 입력한다.

 

 

one-hot 벡터는 위의 you, say, goodbye의 각각의 벡터들과 같이 본인들이 표현되는 위치만 1이고 나머지는 모두 0인 벡터를 의미한다. 이처럼 one-hot encoding을 하는 이유는 신경망의 입력층의 뉴런 수를 고정시키기 위해서이다. 이렇게 만들어진 각각의 벡터들은 기존에 우리가 배운 신경망의 학습 방법과 동일하게 가중치와의 연산을 통해 은닉층으로 넘어가게 되고 이 과정을 반복하며 유의미한 가중치(매개변수)를 얻어낼 수 있다.

 

 

 

 


 

 

Word2Vec

CBOW 모델

word2vec이라는 용어는 원래 프로그램이나 도구를 가리키는 데 사용됐다고 한다. 하지만 이 용어가 유명해지면서, 문맥에 따라 신경망 모델을 가리키는 경우도 볼 수 있다고 한다. 이 글에서의 word2vec은 신경망 모델을 가리키는 경우로 판단하길 바란다. CBOW 모델은 wrod2vec에서 제안하는 신경망으로 맥락으로부터 타깃을 추측하는 용도의 신경망이다. 여기서 타깃이란 중앙 단어이고 그 주변 단어들을 맥락이라고 표현한다. 즉 위의 예제에서 you goodbye는 맥락, ___에 들어갈 say가 타깃이라고 볼 수 있겠다.

 

 

CBOW 모델의 구조는 위의 이미지와 같은데 여기서 입력층이 2개인 이유는 맥락으로 고려할 단어를 2개로 정했기 때문이다. 만약 맥락에 포함시킬 단어를 N개로 지정하면 입력층도 N개가 된다.

 

아무튼 이 입력층 데이터는 은닉층을 거쳐 출력층으로 나오고, 두 입력층에서 은닉층으로의 변환은 똑같은 완전연결계층(가중치 : Win)이 처리한다. 또한 은닉층에서 출력층 뉴런으로의 변환은 다른 완전연결계층(가중치 : Wout)이 처리한다. 결론적으로 입력층과 은닉층 사이의 매개변수인 Win은 두개의 입력층이 같은 값을 공유한다는 이야기이며 입력층과 은닉층 사이의 가중치와 은닉층과 출력층 사이의 가중치는 서로 다른 값이라는 이야기이다.

 

은닉층의 뉴런은 입력층 전체의 평균이며, 출력층의 뉴런은 총 7개로, 뉴런 하나하나가 문장 각각의 단어에 대응한다. 또한 출력층 뉴런은 각 단어의 점수를 의미하며 이 점수가 Softmax 함수를 지나면 출현 확률로 나타내진다.

 

또한 입력층과 은닉층 사이의 매개변수인 Win은 단어의 분산 표현을 의미한다. Win의 크기는 위의 이미지를 참고하면 7x3의 행렬이며, 가중치의 각 행은 해당 단어의 분산 표현이다. 따라서 학습이 진행될수록 맥락에서 출현하는 단어를 잘 추측하는 방향으로 이 분산 표현들이 갱신될 것이다.

 

은닉층의 뉴런 수는 입력층의 뉴런 수보다 적어야하는데, 그 이유는 은닉층에는 단어 예측에 필요한 정보를 간결하게 담아 밀집벡터 표현을 얻기 위해서이다. 입력층과 매개변수(Win)의 연산 결과로 나온 은닉층(인코딩)은 인간이 이해할 수 없으나 이를 인간이 이해할 수 있는 표현으로 복원(디코딩)하게 되면 우리는 밀집벡터 표현을 얻을 수 있다.

 

설명한 내용 시각화

 

 

CBOW 모델이 학습하는 것은 매개변수이다. 이 매개변수들은 가중치에 단어의 출현 패턴을 파악한 벡터가 학습된다. CBOW 모델은 단어 출현 패턴을 사용하는 말뭉치에서 배우기 때문에 말뭉치가 다르면 학습 후 얻게 되는 단어의 분산 표현도 달라질 수 있다.

 

CBOW 모델은 결론적으로 다중 클래스를 분류하는 신경망으로, 학습에 사용되는 것들은 Softmax 함수와 Cross Entropy(교차 엔트로피) 오차이다. 여기서 Softmax 함수는 출력층의 결과인 점수를 확률로 변환하는 것이고, 그 확률과 정답 라벨의 오차(분류이기 때문에 Cross Entropy 사용)를 손실로 사용하여 매개변수를 학습한다.

 

 

 


 

 

 

CBOW모델 개선

Embedding(임베딩) 계층

CBOW 모델의 입력층인 맥락은 위에서 설명한것처럼 one-hot encoding된 형태일 수 있지만 이렇게 되면 단어의 개수가 많아질수록 연산량 또한 많아진다. 하지만 실질적으로 one-hot encoding된 입력층과 MatMul(Win) 계층의 행렬 곱은 단지 행렬의 특정 행을 추출하는 것 뿐이다.

 

 

따라서 one-hot encoding한 입력층과 MatMul 계층의 행렬 곱 연산은 사실상 필요하지 않다. 따라서 이와 같은 효과를 지닌, 즉 가중치 매개변수로부터 단어 ID에 해당하는 행(벡터)을 추출하는 계층인 Embedding(임베딩)계층을 사용한다. 결론적으로 Embedding 계층은 단어의 분산 표현을 저장하는 것이다. MatMul 계층을 Embedding 계층으로 전환하는 것은 메모리 사용량 감소와 계산량 감소의 효과를 불러일으킨다.

 

 

 

이진 분류

이진 분류는 은닉층 이후의 연산에 대한 병목 현상, 즉 다중 분류의 문제점을 효과적으로 해결하기 위한 방안이다. 은닉층 이후에서 계산이 오래 걸리는 곳은 은닉층의 뉴런과 가중치 행렬(Wout)의 곱과 Softmax 연산, 이 두곳이다. 이 두곳의 문제점을 해결하는 방법은 이진 분류이다. 우리는 은닉층 이후의 병목 현상이 나타나는 이유로, 다중 분류의 문제점을 파악할 수 있다. 다중 분류는 수많은 어휘 각각마다의 확률 및 계산 결과를 알아야하기 때문에 그만큼 연산량이 많아지지만, 이를 이진 분류 문제로 바꿔 Yes/No의 대답으로 나타낼 수 있게끔 하면 계산량이 효과적으로 줄어들 수 있다. 예를 들어 맥락이 you와 goodbye일 때, 타깃 단어가 say냐는 물음에 우리는 say가 나올 확률을 출력하면 된다.

 

 

결론적으로 앞에서 설명했던 방식의 출력층은 모든 단어를 대상으로 계산을 수행했으나, 타깃으로 예상되는 단어에 주목하여 그 점수, 확률만을 계산하는 것이 차이이다.

 

우리는 CNN 신경망에 대해 자세히 공부하면서 이진 분류일 경우 출력층에서 Sigmoid 함수를, 다중 분류일 경우에는 Softmax 함수를 사용한다는 것을 알 수 있었다.(손실 함수는 둘 다 교차 엔트로피 사용) 따라서 우리는 CBOW 모델을 이진 분류를 수행하는 모델로 바꿔 계산량을 효과적으로 줄일 수 있다.

 

 

위의 이미지에서 은닉층 뉴런 h와 출력 측의 가중치 Wout에서 단어 'say'에 해당하는 단어 벡터와의 내적을 계산하고, 계산 결과를 Sigmoid with Loss 계층에 입력해 최종 손실을 얻는다.

 

 

 

Negative Sampling

위의 이진 분류는 정답에 대해서만 학습하고 오답인 경우에 대해서는 학습하지 않았다. 이 말을 달리 표현하자면 오답인 단어도 충분히 정답과 같은 확률로 나타내질 수 있다는 이야기이다. 우리는 이 신경망 모델이 정답에 대해서는 Sigmoid의 출력이 1에 가깝도록, 오답에 대해서는 0에 가깝도록 만드는 것이 최종적인 목표이다. 따라서 오답인 경우에 대해서도 학습을 시켜야 한다. 어떻게 하면 오답인 경우에 대해서도 효과적으로 학습할 수 있을까?

 

학습에 사용되는 말뭉치에서 오답인 경우를 모두 학습시킨다는 것은 현실적으로 말이 되지 않는다. 따라서 우리는 이런 경우에 효과적인 학습을 위해 Negative Sampling을 사용한다. Negative Sampling은 부정적인 예(오답) 몇 개를 선택(샘플링)하여 사용하는 것이다. 네거티브 샘플링은 긍정적인 예(정답)를 타깃으로 한 경우의 손실과 부정적인 예 몇 개를 샘플링(선별)하여, 그 부정적인 예에 대해서도 손실을 구하고 각각의 데이터의 손실을 더한 값을 최종 손실로 하는 것을 의미한다.

 

그렇다면 어떻게 부정적인 예를 샘플링 할 수 있을까? 단순히 무작위로 샘플링하는 것보다 좋은 방법이 존재하는데, 그것은 바로 말뭉치에서 자주 등장하는 단어를 많이 추출하고 드물게 등장하는 단어를 적게 추출하는 방법이다. 이를 위해 말뭉치에서 각 단어의 출현 횟수를 구해 확률분포로 나타낸 후, 그 확률분포대로 단어를 샘플링한다.

 

Negative Sampling 식

 

위의 Negative Sampling 식에서 확률분포의 각 요소를 0.75 제곱하는 이유는 출현 확률이 낮은 단어의 확률을 살짝 올려 샘플링에서 배제되는 것을 방지하기 위함이다. 꼭 0.75가 아닌 다른 숫자가 와도 된다.

 

 

 

 

 

 

 

Skip-gram 모델

skip-gram 모델은 CBOW에서 다루는 맥락과 타깃을 역전시킨 모델이다. 즉, 입력층에 중앙 단어(CBOW에서 타깃이었던 단어)로부터 주변의 여러 단어(맥락)를 추측한다. skip-gram 모델은 입력층이 하나고 출력층이 맥락의 수만큼 존재한다.

 

 

word2vec에서는 단어의 분산 표현으로 입력과 은닉층 사이의 가중치 Win을 최종 단어의 분산 표현으로 이용한다.

 

그런데 왜 word2vec은 CBOW와 skip-gram 모델 두가지를 추천하는 걸까?

이에 대해서는 두 모델의 장단점을 보면 알 수 있는데, 단어 분산 표현의 정밀도 면에서는 skip-gram 모델의 결과가 더 좋은 경우가 많지만(말뭉치가 커질수록 저빈도 단어나 유추 문제의 성능이 skip-gram이 더 뛰어남) 학습 속도 측면에서는 CBOW모델이 더 빠르다.

 

word2vec으로 얻은 단어의 분산 표현을 사용하면, 벡터의 덧셈과 뺄셈으로 유추 문제를 풀 수 있다. 예를 들어 king : man = queen : ? 에서 ?에 woman을 대답할 수 있고, take : took = go : ? 에서 ?에 went를 대답할 수 있다. 이 말은 즉, 단어의 단순한 의미 뿐만 아니라 문법적 패턴도 파악할 수 있다는 뜻이다.

 

 

 

 


 

 

 

현재까지 설명한 내용 중, 모든 내용이 중요하지만 가장 근본적으로 중요한 것은 역시 단어나 문장을 고정 길이 벡터로 변환할 수 있다는 것이다. 자연어를 벡터로 변환할 수 있게 됨으로써 우리는 일반적인 머신러닝 기법을 적용할 수 있게 되었기 때문이다. 이러한 word2vec의 근본적인 해결책과 생각들은 자연어 뿐만 아니라 음성, 이미지, 동영상 등에서도 응용이 되어 다양한 딥러닝 분야 발전에 도움을 주었다.

 

+ Recent posts