본문 바로가기
Drawing (AI)/DeepLearning

딥러닝 직접 구현하기 - (word2vec)

by 생각하는 이상훈 2024. 2. 1.
728x90

단순한 word2vec

지금까지 살펴본 모델을 신경망으로 구축하도록 하자. 사용해볼 신경망은 word2vec에서 제안하는 CBOW(continuous bag-of-words)모델이다. CBOW 모델은 맥락으로부터 타깃을 추측하는 용도의 신경망이다. 타깃은 중앙 단어이고, 그 주변 단어들이 맥락이다. 이 CBOW 모델이 가능한 한 정확하게 추론하도록 훈련시켜서 단어의 분산 표현을 얻어내는 것이 목표이다. CBOW 모델의 input은 맥락이다. 따라서 맥락을 one-hot 표현으로 변환하여 CBOW 모델이 처리할 수 있도록 한다.

위 그림은 CBOW 모델의 신경망이다. 입력층이 2개 있고, 은닉층을 거쳐 출력층에 도달한다. 두 입력층에서 은닉층으로 변환은 똑같은 FCN이 처리한다. 그후 은닉층에서 출력층 뉴런으로의 변환은 다른 FCN이 처리한다. 그림에서 입력층이 2개인 이유는 맥락으로 고려할 단어를 2개로 정했기 때문이다. 다음으로 은닉층을 살펴보자. 은닉층의 뉴런은 입력층의 FCN에 의해 변환된 값이 되는데, 입력층이 여러 개이면 전체를 평균하면 된다. 그림에서 출력층의 뉴런은 총 7개인데, 중요한 것은 이 뉴런 하나하나가 각각의 단어에 대응한다는 점이다. 그리고 출력층 뉴런은 각 단어의 점수를 뜻하며, 값이 높을수록 대응 단어의 출현 확률도 높아진다. 여기서 점수란, 확률로 해석되기 전의 값이고, 이 점수에 Softmax 함수를 적용해서 확률을 얻을 수 있다. 점수를 Softmax 계층에 통과시킨 후의 뉴런을 출력층이라고도 한다.

이번에는 계층 관점에서 CBOW 모델의 신경망 구성을 살펴보자.

CBOW 모델의 가장 앞단에는 2개의 MatMul 계층이 있다. 이어서 이 두 계층이 출력이 더한 후 0.5를 곱해 평균이 되고 이 값이 은닉층 뉴런이 된다. 마지막에 MatMul 계층이 적용되어 score가 출력된다.

import sys
sys.path.append('..')
import numpy as np
from common.layers import MatMul

# 샘플 맥락 데이터
c0 = np.array([[1, 0, 0, 0, 0, 0, 0]])
c1 = np.array([[0, 0, 1, 0, 0, 0, 0]])

# 가중치 초기화
W_in = np.random.randn(7, 3)
W_out = np.random.randn(3, 7)

# 계층 생성
in_layer0 = MatMul(W_in)
in_layer1 = MatMul(W_in)
out_layer = MatMul(W_out)

# 순전파
h0 = in_layer0.forward(c0)
h1 = in_layer1.forward(c1)
h = 0.5 * (h0 + h1)
s = out_layer.forward(h)
print(s)
#[[ 0.30916255  0.45060817  -0.77308656  0.22054131  0.15037278  -0.93659277  -0.59612048]]

위 코드에서 우선 필요한 가중치들 (W_in과 W_out)을 초기화한다. 그리고 입력층을 처리하는 MatMul 계층을 맥락 수만큼 생성하고, 출력층 측의 MatMul 계층은 1개만 생성한다. 다음은 입력층 측의 MatMul 계층들의 forward() 메서드를 호출해 중간 데이터를 계산하고, 출력층 측의 MatMul 계층(out_layer)을 통과시켜 각 단어의 점수를 구한다. 


CBOW 모델의 학습

지금까지 설명한 CBOW 모델은 출력층에서 각 단어의 점수를 출력했다. 이 점수에 소프트맥스 함수를 적용하면 확률을 얻을 수 있다. 이 확률은 맥락이 주어졌을 때, 그 중앙에 어떤 단어가 출현하는지를 나타낸다. 아래의 예에서 맥락은 "you"와 "goodbye"이고, 정답 레이블은 "say"이다.

CBOW 모델의 학습에서는 올바른 예측을 할 수 있도록 가중치를 조정하는 일을 한다. 그 결과, 입력측/출력측 가중치에 단어의 출현 패턴을 파악한 벡터가 학습된다. 이렇게 얻은 CBOW 모델과 skip-gram 모델로 얻을 수 있는 단어의 분산 표현은 단어의 의미 면에서나 문법 면에서 모두 우리의 직관에 부합한다.

추론 처리를 수행하는 CBOW 모델에 Softmax 계층과 Cross Entropy 계층을 추가한 것만으로도 손실을 얻을 수 있다. 이상이 CBOW 모델의 손실을 구하는 계산 흐름이자, 이 신경망의 순방향 전파이다. Softmax 계층과 Cross Entropy Error 계층은 Softmax with Loss 계층 하나로 구현할 수 있다. 앞으로 구현할 신경망의 정확한 모습은 아래와 같다.


word2vec의 가중치와 분산 표현

word2vec 에서 사용되는 신경망에는 두 가지 가중치가 있다. 입력 측 완전연결계층의 가중치와 출력 측 FCN의 가중치이다. 그리고 입력 측 가중치의 각 행이 각 단어의 분산 표현에 해당한다. 다만, 출력 측 가중치는 각 단어의 분산 표현이 열 방향으로 저장된다.

최종적으로 이용하는 단어의 분산 표현으로 사용할 수 있는 가중치에 대한 선택지는 3가지 정도가 있다.

1. 입력 측의 가중치만 이용

2. 출력 측의 가중치만 이용

3. 양쪽 가중치를 모두 이용

 

word2vec, 특히 skip-gram 모델에서는 입력 측 가중치만 이용하는 것이 가장 대중적이다.


728x90