본문 바로가기

딥러닝/[밑바닥부터 시작하는 딥러닝]딥러닝

단순한 word2vec

원래 word2vec은 구글에서 개발한 자연어 처리를 위한 도구로서,
단어를 벡터로 표현하여 단어 간의 유사성을 계산하는 기능을 제공하였습니다.
하지만 이후에 이 도구가 사용한 알고리즘인 CBOW와 skip-gram이라는 모델이 유명해져서,
word2vec이라는 용어는 이 모델을 가리키는 것으로도 자주 사용되게 되었습니다.
word2vec에서는 CBOW 모델과 skip-gram 모델 두 가지를 사용하며, 각각의 모델에 대해 신경망을 구성합니다.
CBOW 모델은 주변 단어들을 입력으로 받아 중앙 단어를 예측하는 방식이고,
skip-gram 모델은 중앙 단어를 입력으로 받아 주변 단어를 예측하는 방식입니다.

 

1.CBOW 모델의 추론 처리

 

CBOW 모델은 Context Bag of Words의 약자로,
주변 단어들의 벡터의 평균값을 입력으로 받아서 중심 단어를 예측하는 모델입니다.
맥락에 포함시킬 단어가 N개라면, CBOW 모델의 입력층은 N개의 뉴런으로 구성됩니다.
각 뉴런은 맥락에 포함된 단어의 분산 표현(단어 벡터)을 입력으로 받습니다.
따라서 입력층의 크기는 맥락의 길이에 따라 달라집니다.
맥락에 포함된 단어가 N개일 때 CBOW 모델의 입력층은 N개의 원핫 벡터가 됩니다.
이들을 완전연결계층에 통과시켜 가중치와 행렬곱을 수행하면 N개의 출력이 나오게 됩니다.
이 출력들의 평균을 구해 하나의 벡터를 만든 후,
이를 다시 다른 가중치와 행렬곱하여 출력층을 통과시키면 각 단어의 등장 확률이 됩니다.
따라서, 입력층의 평균값이 은닉층의 뉴런이 됩니다.
입력층의 각 뉴런은 해당 단어가 맥락 안에 있는지 여부를 나타내는 역할을 합니다.
이와 달리, 은닉층의 뉴런은 입력층의 정보를 종합해 중앙 단어의 분산 표현을 계산하는 역할을 합니다.
출력층 뉴런의 점수는 확률로 해석되기 전의 값입니다.
출력층 뉴런의 값은 소프트맥스 함수를 통해 해당 단어의 등장 확률을 나타내는 값으로 변환됩니다.
소프트맥스 함수는 각 출력값을 0과 1 사이의 값으로 변환하며, 모든 출력값의 합이 1이 되도록 보정해줍니다.
이렇게 변환된 값은 해당 단어의 등장 확률로 해석될 수 있습니다.
Softmax 함수를 거쳐 나온 출력값을 갖는 뉴런을 '출력층 뉴런'이라고 합니다.
입력층의 뉴런 수보다 은닉층의 뉴런 수를 적게 하는 것이 중요합니다.
이렇게 함으로써, 예측에 필요한 정보를 좀 더 간결하게 담을 수 있으며, 결과적으로 밀집벡터 표현을 얻을 수 있습니다.
이를 통해 모델의 성능을 향상시키고 연산 비용을 낮출 수 있습니다.
이러한 방법을 사용하여 학습한 단어 벡터는 차원이 적고, 밀집한 형태를 갖는데, 이러한 특성은 다양한 자연어 처리 문제에서 유용하게 활용됩니다.
인코딩은 입력 데이터를 모델이 이해하기 쉬운 형태로 변환하는 과정이며,
디코딩은 모델이 예측한 결과를 원래의 데이터 형태로 복원하는 과정입니다.
은닉층은 인코딩 과정에서 사용되며, 디코딩 과정에서 출력층의 결과를 만드는 데 사용됩니다.

편향을 사용하지 않는 완전연결계층의 처리는 MatMul 계층의 순전파와 같습니다.

MatMul 계층은 입력값인 행렬과 가중치 행렬을 곱해줍니다.
이때 가중치 행렬은 각 입력에 대응하는 가중치를 가지고 있습니다.
이러한 처리를 통해 편향이 없는 완전연결계층의 처리를 구현할 수 있습니다.

 

이 코드는 입력층의 두 단어 벡터 c0, c1을 이용하여 CBOW 모델의 학습을 수행하는 예제 코드입니다.

 

h = 0.5 * (h0 + h1)
이는 입력으로 받은 두 개의 맥락 단어 벡터 h0와 h1의 평균값을 취하는 방식으로,
두 개의 맥락에서 각각 하나의 단어를 추정하는 것이 아니라 두 개의 단어를 모두 고려하여 하나의 단어를 추정하는 방식입니다.

 

 

CBOW 모델은 은닉층에 활성화 함수를 사용하지 않고,
단순한 완전연결계층을 사용하여 입력된 맥락 정보를 바탕으로 중앙 단어를 예측하는 신경망입니다.

 

2.CBOW 모델의 학습

 

CBOW 모델의 학습 과정에서는 입력층의 단어 벡터들을 평균한 벡터를 이용해 출력층에서 각 단어의 점수를 계산하고,
이를 바탕으로 손실을 계산하여 가중치를 조정합니다.
이때 가중치 Win은 단어의 출현 패턴을 파악한 벡터로 학습됩니다.
이러한 방식으로 CBOW 모델은 단어 간 유사성을 파악할 수 있는 단어 임베딩을 학습할 수 있습니다
다중 클래스 분류 문제를 해결하기 위한 손실 함수로는 교차 엔트로피 오차(Cross-entropy error)를 사용하는 것이 일반적입니다.
이를 소프트맥스 함수와 결합하여 softmax with cross-entropy loss라고도 부릅니다.
이 방법은 출력층의 뉴런 수가 클래스 수와 동일하게 설정된 경우에 적용됩니다.
다중 클래스 분류를 수행하는 신경망에서는 출력층에서 소프트맥스 함수를 이용하여 각 클래스에 대한 확률을 구하고,
이 확률과 실제 레이블을 비교하여 교차 엔트로피 오차를 계산합니다.
이 교차 엔트로피 오차는 모델이 얼마나 정확하게 예측했는지를 나타내는 손실 값으로 사용됩니다.
이 손실 값이 최소화되도록 가중치를 업데이트하여 모델을 학습시키는 것이 목표입니다.

 

3.word2vec의 가중치와 분산표현

 

word2vec에서 사용되는 신경망에는 입력 측 완전연결계층의 가중치(Win)와 출력 측 완전연결계층의 가중치(Wout)이 있다.

 

Win은 단어를 중심으로 맥락을 예측하는 CBOW 모델에서 사용되는 가중치입니다.
입력 층의 원핫 벡터와 곱해져서 은닉층으로 전달됩니다.
Wout은 중심 단어를 예측하는 Skip-gram 모델에서 사용되는 가중치입니다.
은닉층의 벡터와 곱해져서 출력 층으로 전달됩니다.
입력 측 가중치 Win은 각 행이 각 단어에 해당하는 분산 표현을 가지고 있습니다.
즉, 각 단어는 고정된 차원의 벡터로 표현되며, 입력 측 완전연결계층의 가중치는 이러한 단어의 벡터 표현을 학습합니다.
반면, 출력 측 완전연결계층의 가중치 Wout은 각 열이 각 단어에 해당하는 분산 표현을 가지고 있습니다.
이러한 분산 표현은 softmax 함수를 통해 얻은 각 단어의 확률을 출력하기 위해 사용됩니다.
skip-gram 모델에서는 출력 측 가중치 Wout를 사용하지 않고, 입력 측 가중치 Win만을 사용하여 최종 단어의 분산 표현을 얻습니다. Skip-gram 모델은 중심 단어 주변의 단어들을 예측하는 모델로,
입력으로 중심 단어가 들어가고, 출력으로 중심 단어 주변의 단어들이 예측됩니다.
이때 중심 단어의 분산 표현을 구하기 위해 입력 측 가중치 Win의 특정 행을 사용합니다.
GloVe(Global Vectors for Word Representation)는 카운트 기반과 임베딩 기반 모델을 융합하여 단어의 동시 등장 행렬을 활용해 단어 벡터를 학습합니다.