본문 바로가기
자연어처리

[밑딥2] 신경망에서의 단어 처리와 word2vec

by 다람이도토리 2021. 7. 31.

목표

문장 상에서, 문맥을 통해 어떤 단어가 들어갈지를 추측하고자 한다.
이 때, 단순히 one-hot만 적용해서는 단어간 의미를 반영하기는 어렵다.
따라서 단어간 의미를 반영하는 벡터화를 하기 위한 방법이 바로 Word2Vec이다.

Word2Vec의 방식

Word2Vec에는 다음 두 가지 방식이 존재한다.

- CBOW(Continuous Bag of Words) : 주변 단어를 통해 중심 단어를 추론하기
- Skip-Gram : 중심 단어를 통해 주변 단어를 추론하기

여기서 중심 단어란, 예측해야 하는 단어를 의미하고, 주변 단어는 중심단어 앞 뒤로, 예측에 사용되는 단어를 의미한다.

즉 중심단어가 target이 되며, 주변 단어는 context, 맥락이 된다. 이 때, 주변단어 앞 뒤로 몇 개를 볼지를 window 크기로 정의한다.

그리고, 이를 one-hot encoding을 실시한다.

예시)

You say goodbye and I say Hello.

중심단어 goodbye를 예측하기 위해 , window = 1이라고 둘 시, say, and는 주변단어가 된다.

 

 

CBOW

'The fat cat sat on the mat'라는 문장에서 sat를 예측하는 상황을 고려해보자.

window = 2인 경우를 고려하면 , fat, cat, on, the로  sat을 예측해야 한다.
이를 위해서는 Projection 단계에 4개의 Input을 넣어주면 된다.

이후 이를 바탕으로 Projection에서 선택하는 단계(예시 - Softmax등을 바탕으로)

skip-gram

ski-gram은 반대로, 진행하면 된다!

 

구현 - CBOW(밑딥 2 코드)

#밑딥2 Simple_CBOW(p135-138)
class SimpleCBOW:
	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_layer0 = MatMul(W_in)
        self.in_layer1 = MatMul(W_in)
        self.out_layer = MatMul(W_out)
        self.loss_layer = SoftmaxWithLoss()
        
        # 가중치, 기울기 리스트에
        layers = [self.in_layer0, self.in_layer1, 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):
    	h0 = self.in_layer0.forward(contexts[:, 0])
        h1 = self.in_layer1.forward(contexts[:, 1])
        h = (h0 + h1) * 0.5
        score = self.out_layer.forward(h)
        loss = self.loss_layer.forward(score, target)
        return loss
        
    def backward(self, dout = 1):
    	ds = self.loss_layer.backward(dout)
        da = self.out_layer.backward(ds)
        da *= 0.5
        self.in_layer1.backward(da)
        self.in_layer0.backward(da)
        return None

 

패키지를 활용한 Word2Vec

위키 북스 내용 참조 실습 실시.

https://github.com/SeongwonTak/TIL_swtak/blob/master/Word2Vec.ipynb

 

GitHub - SeongwonTak/TIL_swtak: Today, I learned.

Today, I learned. Contribute to SeongwonTak/TIL_swtak development by creating an account on GitHub.

github.com