혜온의 이것저것

[Chapter 3 word2vec] 2 단순한 word2vec 본문

Deep Learning/밑바닥부터 시작하는 딥러닝2

[Chapter 3 word2vec] 2 단순한 word2vec

혜온 :) 2022. 4. 7. 10:41

3.2.1 CBOW 모델의 추론 처리

CBOW 모델은 맥락으로부터 target을 추축하는 용도의 신경망이다. 우리는 CBOW 모델이 가능한 한 정확하게 추론하도록 훈련시켜서 단어의 분산 표현을 얻어낼 것이다.

 

CBOW 모델의 입력은 맥락이다.

가장 먼저, 이 맥락을 원핫 표현으로 변환하여 CBOW 모델이 처리할 수 있도록 준비한다.

입력층이 2개 있고, 은닉층을 거쳐 출력층에 도달한다.

두 입력층에서 은닉층으로의 변환은 똑같은 완전연결계층이 처리하고, 은닉층에서 출력층 뉴런으로의 변환은 다른 완전연결계층이 처리한다.

 

은닉층의 뉴련은 입력층의 완전연결계층에 의해 변환된 값이 출력되는데, 입력층이 여러 개이면 전체를 평균하면 된다.

출력층의 뉴런은 총 7개인데, 여기서 중요한 것은 이 뉴런 하나하나가 각각의 단어에 대응한다는 점이다.

그리고 출력층 뉴런은 각 단어의 점수를 뜻하며, 값이 높을수록 대응 단어의 출현 확률도 높아진다.

여기서 점수란 확률로 해석되기 전의 값이고, 이 점수에 소프트맥수 함수를 적용해서 확률을 얻을 수 있다.

 

입력층에서 은닉층으로의 변환은 완전연결계층에 의해서 이뤄진다. 이때 완전연결계층의 가중치는 7X3 행렬이며, 이 가중치가 단어의 분산 표현의 정체이다.

가중치 W의 각 행에는 해당 단어의 분산 표현이 담겨 있다고 볼 수 있다.

따라서 학습을 진행할수록 맥락에서 출현하는 단어를 잘 추축하는 방향으로 이 분산 표현들이 갱신된다.

그리고 이렇게 해서 얻은 벡터에는 단어의 의미도 잘 녹아들어 있다.

 

뉴런 관점에서 말고 계층 관점에서 그려보면 다음과 같다.

CBOW 모델의 가장 앞단에는 2개의 MatMul 계층이 있고, 이어서 이 두 계층의 출력이 더해진다.

그리고 더해진 값에 0.5를 곱하면 평균이 되며, 이 평균이 은닉층 뉴련이 된다.

마지막으로 은닉층 뉴런에 또 다른 MatMul 계층이 적용되어 점수가 출력된다.

 

CBOW 모델의 추론 처리를 파이썬으로 구현해보자.

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_later=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.1503278 -0.93659277 -0.59612048]]

먼저, 필요한 가중치(W_in과 W_out)을 초기화 한다.

그리고 입력층을 처리하는 MatMul 계층을 맥락 수만큼 생성하고, 출력층 측의 MatMul 계층은 1개만 생성한다.

입력층 측의 MatMul 계층들의 forward() 매서드를 호출해 중간 데이터를 계산하고, 출력층 측의 MatMul 계층을 통과시켜 각 단어의 점수를 구한다.

 

CBOW 모델은 활성화 함수를 사용하지 않는 간단한 구성의 신경망이다.

입력층이 여러 개 있고 그 입력층들이 가중치를 공유한다는 점을 제외하면 어려운 부분은 없을 것이다.

 

3.2.2 CBOW 모델의 학습

CBOW 모델은 출력층에서 각 단어의 점수를 출력했다.

이 점수에 소프트맥스 함수를 적용하면 확률을 얻을 수 있다.

이 확률은 맥락(전후 단어)이 주어졌을 때 그 중앙에 어떤 단어가 출현하는지를 나타낸다.

 

책의 예시에서 맥락은 "you"와 "goodbye"이고, 정답 레이블은 "say"이다.

이때 가중치가 적절히 설정된 신경망이라면 확률을 나타내는 뉴런들 중 정답에 해당하는 뉴런의 값이 클 것이라 기대할 수 있다.

CBOW 모델의 학습에서는 올바른 예측을 할 수 있도록 가중치를 조정하는 일을 한다.

그 결과로 가중치 W_in에 단어의 출현 패턴을 파악한 벡터가 학습된다.

그리고 지금까지 실험에 의해 CBOW 모델로 얻을 수 있는 단어의 분산 표현은 단어의 의미 면에서나 문법 면에서 모두 우리의 직관에 부합하는 경우를 많이 볼 수 있다.

 

우리가 다루고 있는 모델은 다중 클래스 분류를 수행하는 신경망이다.

따라서 이 신경망을 학습하려면 소프트맥스와 교차 엔트로피 오차만 이용하면 된다.

여기에서는 소프트맥스 함수를 이용해 점수를 확률로 변화하고, 그 확률과 정답 레이블로부터 교차 엔트로피 오차를 구한 후, 그 값을 손실로 사용해 학습을 진행한다.

앞 절에서 설명한 추론 처리를 수행하는 CBOW 모델에 Softmax 계층과 Cross Entropy Error 계층을 추가했을 뿐이다.

이것만으로 손실을 얻을 수 있다.

Softmax 계층과 Cross Entropy Error 계층을 Softmax with Loss라는 하나의 계층으로 구현 할 것이다.

 

3.2.3 word2vec의 가중치와 분산 표현

word2vec에서 사용되는 신경망에는 두 가지 가중치가 있다.

입력 측 완전연결계층의 가중치(W_in)와 출력 측 완전연결계층(W_out).

그리고 입력 측 가중치 W_in의 각 행이 각 단어의 분산 표현에 해당한다.

또한 출력 측 가중치 W_out에도 단어의 의미가 인코딩된 벡터가 저장되고 있다고 생각할 수 있다.

다만, 출력 측 가중치는 각 단어의 분산 표현이 열 방향으로 저장되낟.

그러면 최종적으로 이용하는 단어의 분산 표현으로는 어느 쪽 가중치를 사용하는 좋을까?

A) 입력 측의 가중치만 이용한다.

B) 출력 측의 가중치만 이용한다.

C) 양쪽 가중치를 모두 이용한다.

 

A와 B 안은 어느 한쪽 가중치만 이용한다는 것이다.

마지막 C 안에서는 두 가중치를 어떻게 조합하느냐에 따라 다시 몇 가지 방법을 생각해낼 수 있다.

그 중 하나는 두 가중치를 단순히 합치는 것이다.

 

word2vec에서는 A안인 '입력 측의 가중치만 이용한다.'가 가장 대중적인 선택이다.

많은 연구에서 출력 측 가중치는 버리고 입력 측 가중치는 W_in만을 최종 단어의 분산 표현으로서 이용한다.

우리도 이를 따라 W_in을 단어의 분산 표현으로 이용할 것이다.

 

 

Comments