확률 표기법
CBOW 모델 확률 표기법 기술
CBOW모델의 식과 손실 함수
말뭉치 전체로 확장한 CBOW 손실 함수
⇒ CBOW 모델의 학습이 수행하는 일은 손실 함수를 가능한 작게 만드는 것입니다. 이때의 가중치 매개변수가 저희가 얻고자 하는 단어의 분산 표현입니다.
word2vec은 2개의 모델을 제안합니다.
skip-gram 모델의 입력층은 하나이고 출력층은 맥락의 수만큼 존재하게 됩니다.
각 출력층에서는 softmax with loss계층 등을 이용해 개별적으로 손실을 구하고, 이 개별 손실들을 모두 더한 값을 최종 손실로 합니다.
skip-gram모델 확률 표기법 기술
위 식을 교차 엔트로피 오차에 적용하여 skip-gram모델의 손실 함수를 유도하면 아래와 같습니다. 맥락 별 손실을 구한 후 모두 더합니다.
말뭉치 전체로 확장한 skip-gram 손실함수
CBOW모델 vs skip-gram모델 손실 함수 차이
CBOW모델과 skip-gram모델 중 어느 모델을 사용할까요?
import sys
sys.path.append('..')
import numpy as np
from common.layers import MatMul, SoftmaxWithLoss
class SimpleSkipGram:
def __init__(self, vocab_size, hidden_size):
V, H = vocab_size, hidden_size
# 가중치 초기화
W_in = 0.01 * np.random.randn(V, H).astype('f')
W_out = 0.01 * np.random.randn(H, V).astype('f')
# 계층 생성
self.in_layer = MatMul(W_in)
self.out_layer = MatMul(W_out)
self.loss_layer1 = SoftmaxWithLoss()
self.loss_layer2 = SoftmaxWithLoss()
# 모든 가중치와 기울기를 리스트에 모은다.
layers = [self.in_layer, self.out_layer]
self.params, self.grads = [], []
for layer in layers:
self.params += layer.params
self.grads += layer.grads
# 인스턴스 변수에 단어의 분산 표현을 저장한다.
self.word_vecs = W_in
def forward(self, contexts, target):
h = self.in_layer.forward(target)
s = self.out_layer.forward(h)
l1 = self.loss_layer1.forward(s, contexts[:, 0])
l2 = self.loss_layer2.forward(s, contexts[:, 1])
loss = l1 + l2
return loss
def backward(self, dout=1):
dl1 = self.loss_layer1.backward(dout)
dl2 = self.loss_layer2.backward(dout)
ds = dl1 + dl2
dh = self.out_layer.backward(ds)
self.in_layer.backward(dh)
return None