본문 바로가기
----------책----------/밑바닥부터 시작하는 딥러닝2

CHAPTER 3 word2vec

by 탶선 2020. 2. 3.
반응형

3.1 추론 기반 기법과 신경망

단어를 벡터로 표현하는 방법

  • 통계 기반 기법
  • 추론 기반 방법

3.1.1 통계 기반 기법의 문제점

통계 기반 기법 - 학습 데이터를 한번에 처리(배치 학습)

추론 기반 기법 - 학습 데이터의 일부를 사용하여 순차적으로 학습(미니배치 학습)

3.1.3 신경망에서의 단어 처리

신경망에서 단어를 사용하기 위해 고정 길이의 벡터로 변환

  • one-hot 벡터 - 벡터의 원소 중 하나만 1, 나머지는 모두 0인 벡테

"You say goodbye and i say hello" 의 one-hot 표현 예시

3.2 단순한 word2vec

CBOW(continuous bag-of-words) 모델의 추론 처리

CBOW - context(주변 단어)로부터 Target(중앙 단어)을 추측하는 용도의 신경망

다중 클래스 분류 신경망

  • 맥락에 포함시킬 단어가 N개일 경우 입력층도 N개

CBOW 모델의 신경망 구조(노드 값의 크기 흑백의 진함으로 표현)

완전연결계층에 의한 첫 번째 입력층을 $h_{1}$ 으로 변환 / 두 번째 입력층을 $h_{2}$로 변환했다고 할 때 은닉층의 뉴런 : $\frac{1}{2}(h_{1}+h_{2})$

은닉층의 뉴런 수를 입력층의 뉴런 수보다 적게 하는것이 핵심

  • 단어 예측에 필요한 정보를 간결하게 담을 수 있음
  • 밀집벡터 표현을 얻을 수 있음
  • 은닉층의 정보는 인간이 이해할 수 없는 코드(인코딩)
  • 은닉층의 정보로부터 원하는 결과를 얻는 작업(디코딩)

import numpy as np

class MatMul:
    def __init__(self, W):
        self.params = [W]
        self.grads = [np.zeros_like(W)]
        self.x = None

    def forward(self, x):
        W, = self.params
        out = np.dot(x, W)
        self.x = x
        return out

    def backward(self, dout):
        W, = self.params
        dx = np.dot(dout, W.T)
        dW = np.dot(self.x.T, dout)
        self.grads[0][...] = dW
        return dx

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)

#forward
h0 = in_layer0.forward(c0)
h1 = in_layer1.forward(c1)
h = 0.5 * (h0+h1)
s = out_layer.forward(h)

print(s)

softmax - 점수를 확률로 변환 / 확률, 정답 레이블로부터 cross entropy 오차를 구해 생긴 loss를 사용하여 학습

3.2.3. word2vec 가중치와 분산표현

$W_{in}$ - 입력측 완전연결계층의 가중치 / 각 행이 각 단어의 분산표현에 해당

$W_{out}$ - 출력 측 완전연결계층의 가중치 / 단어의 의미가 인코딩된 벡터가 저장

CBOW 모델의 신경망 구성
CBOW 모델의 역전파

3.5.1 CBOW 모델과 확률

word2vec의 CBOW 모델

$P(W_{t}|W_{t-1},W_{t+1}) : W_{t-1}, W_{t+1}이 일어난 후 W_{i}가 일어난 확률$ 즉 CBOW의 모델링 식

$$L = -\sum_k t_k \log{y_k}$$

$y_{k}$ - k번째에 해당하는 사건이 일어날 확률

$t_{k} - 정답 레이블/ one-hot vector로 표현(W_{t}가 발생, W_{t} 에 해당하는 원소만 1 나머지는 0) $

$L = -logP(W_{t}|W_{t-1},W_{t+1}) $
$P(W_{t}|W_{t-1},W_{t+1})$ 의 확률에 log를 취한 다음 마이너스를 붙인 CBOW모델의 손실함수 (negative log likelihood)
이를 확장하여
$$L = -\frac{1}{T}\sum_{t=1}^T logP(W_{t}|W_{t-1},W_{t+1}) $$
CBOW모델의 학습이 수행하는 일은 위의 식이 가능한 작게 만드는 것

3.5.2 skip-gram 모델

CBOW에서 다루는 context와 target을 역전시킨 모델

입력층 - 하나

출력층 - context의 수

loss - softmax with loss 계층들을 이용하여 구함 / 개별 손실들을 모두 더한 값을 최종 손실로

$ target(W_t)로부터 context(W_{t-1},W_{t+1})을 추측 $
$ P(W_{t-1},W_{t+1}|W_t) $ - skip-gram의 모델링 식

skip-gram모델에서는 context의 단어들이 조건부 독립이라 가정한 후 아래와 같이 분해
$P(W_{t-1},W_{t+1}|W_t) = p(W_{t-1} | W_t)P(W_{t+1}|W_t) $

이후 cross entropy error를 적용하여 skip-gram모델의 loss function 유도
$ L = -logP(W_{t-1},W_{t+1}|W_t) $
$ = -logP(W_{t-1}|W_t)P(W_{t+1}|W_t) $
$ = -(logP(W_{t-1}|W_t)+logP(W_{t+1}|W_t) $

말뭉치 전체로 확장한 skip-gram모델의 loss function
$$L = -\frac{1}{T}\sum_{t=1}^T logP(W_{t-1}|W_t)+logP(W_{t+1}|W_t)) $$

skip-gram 모델
맥락의 수만큼 loss추측 - loss function은 각 context에서 구한 loss의 총합
단어 분산 표현의 정밀도면에서 CBOW보다 더 좋은 경우가 많음

CBOW 모델
타깃 하나의 loss 추측
skip-gram모델보다 학습속도 빠름

3.5.3 통계 기반 vs 추론 기반

통계 기반 - 말뭉치의 전체 통계로부터 1회 학습
- 처음부터 계산하여 학습속도 상대적 느림
- 단어 유사성
추론 기반 - 말뭉치의 일부분씩 여러번 학습(mini batch)
- parameter 학습
- 단어 유사성 + 단어사이의 패턴

 

### 본 게시물은 밑바닥부터 시작하는 딥러닝 2를 읽고 정리한 노트입니다. ###

 

반응형

댓글