3장에서는 단어 2개를 맥락으로 사용해 타깃을 추측하는 간단한 CBOW를 구현했습니다.
어휘가 100만 개, 은닉층의 뉴런이 100개인 CBOW모델
아래 두 개의 계산이 병목됩니다.
⇒ 가중치 매개변수로부터 단어ID에 해당하는 벡터를 추출하는 계층 생성(Embedding 계층)
Embedding 계층의 forward() 메서드 구현
class Embedding:
'''
forward 계층 : 가중치 W의 특정 행 추출
인스턴스 변수 idx에는 추출하는 행의 인덱스(단어ID)를 배열로 저장
backward 계층 : 출력 층으로부터 전해진 기울기를 입력 층으로 흘려줌
가중치 기울기 dW를 꺼낸 다음, dW[...]=0문장에서 dW의 원소를 0으로 덮어씀
출력 층으로부터 전해진 가중치 기울기를 가중치 기울기 dW의 특정 행에 설정
'''
def __init__(self,W):
self.params = [W]
self.grad = [np.zeros_like(W)]
self.idx = None
def forward(self,idx):
W, = self.params
self.idx = idx
out = W[idx]
return out
def backward(self,dout):
dW, = self.grads
dW[...] = 0
for i, word_id in enumerate(self.idx):
# dh의 각 행의 값을 dW의 해당 행에 더해준다.
dW[word_id] += dout[i]
return None