일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Apache
- MySQL
- word2vec
- AndroidStudio를활용한안드로이드프로그래밍
- aws
- 밑바닥부터시작하는딥러닝
- 한빛아카데미
- 한빛미디어
- CBOW
- 셀레니움
- 수동설치
- 예제중심HTML&자바스크립트&CSS
- 크롤링
- Selenium
- Crawling
- 논문리뷰
- 머신러닝
- 프로그램새내기를위한자바언어프로그래밍
- 생활코딩
- Lamp
- 비지도학습
- 밑바닥부터시작하는딥러닝2
- image
- 가비아
- 컴파일설치
- jupyter
- 딥러닝
- deeplearning
- attention
- 소스설치
- Today
- Total
안녕, 세상!
(2)-3-2 word2vec 보충 본문
CBOW 모델을 확률 관점에서 살펴보겠습니다.
(1) CBOW 모델과 확률
확률 표기법
동시 확률 : P(A , B) - A와 B가 동시에 일어날 확률
사후 확률 : P(A | B) - B(라는 정보)가 주어졌을 때 A가 일어날 확률
말뭉치를 w1,w2, ... ,wr 처럼 단어로 표기한다면 특정 단어와 그 단어에 대한 윈도우 크기가 1인 맥락을 다음과 같이 표현할 수 있습니다.
그렇다면 W(t-1) 과 W(t+1)이 주어졌을 때 Wt의 확률은 다음과 같이 표현할 수 있습니다.
이 식을 이용하여 CBOW 모델의 손실함수를 나타낼 수 있습니다.
앞서 Cross-entropy를 사용했으므로 교차 엔트로피식으로 생각해보겠습니다.
교차 엔트로피 식은
과 같습니다.
tk와 yk 모두 one-hot-encoding 형식이며 tk는 정답을 나타내는 것이므로 정답 부분만 1이고 나머지는 모두 0이기 때문에 yk부분에서 1인 부분만 곱해져서 살아남을 것이므로 이 점을 고려하여 다음과 같이 식을 바꿀 수 있습니다.
이 식은 음의 로그 가능도(negative log likelihood)라는 것을 알 수 있으며, 손실함수를 음의 로그 가능도로 나타낼 수 있습니다.
이 식은 샘플 데이터 하나에 대한 손실함수이고, 이를 말뭉치 전체로 확장하게 된다면 다음 식이 됩니다.
가능도에 대해서는 머신러닝을 공부할 때 자세히 다뤘습니다.
luminitworld.tistory.com/68?category=968936
(2) skip-gram 모델
word2vec은 2개의 모델, CBOW 모델과 skip-gram 모델이 있다고 했습니다.
skip-gram모델은 CBOW에서 다루는 맥락과 타깃을 역전시킨 모델입니다.
즉, Skip-gram 모델은 중앙의 단어(타깃)로 부터 주변의 여러 단어(맥락)를 추측합니다.
skip-gram 모델을 전체적으로 그리면 다음과 같이 그려집니다.
skip-gram 모델의 입력층은 하나이고, 반면 출력층이 맥락의 수만큼 존재합니다.
따라서 각 출력층에서는 개별적으로 손실함수를 구하고, 이 개별 손실값들을 모두 더한 값을 최종 손실로 합니다.
skip-gram 모델을 확률로 표기하면 다음과 같이 나타낼 수 있습니다.
Wt가 주어졌을 때 W(t-1)과 W(t+1)이 동시에 일어날 확률을 뜻합니다.
여기서 skip-gram 모델에서는 맥락의 단어들 사이에 관련성이 없다고 가정하고 다음과 같이 분해합니다.
('조건부 독립'이라고 가정)
앞서 CBOW와 마찬가지로 교차 엔트로피 오차에 적용하고 말뭉치 전체로 확장하면 다음과 같은 식들이 나옵니다.
CBOW 모델은 타깃 하나의 손실을 구하지만,
skip-gram 모델은 맥락의 수만큼 추측하기 때문에 그 손실 함수는 각 맥락에서 구한 손실의 총합이어야 합니다.
그럼 CBOW와 skip-gram 모델 중 어느 것을 사용해야 할까요?
바로 skip-gram이 더 정밀한 결과를 나타나기 때문에 skip-gram 모델이 성능면에서는 좋다고 할 수 있습니다.
물론 CBOW가 학습 속도면에서는 빠르지만,
단어 분산 표현의 정밀도 면에서 skip-gram 모델이 더 뛰어나며, 말뭉치가 커질수록 저빈도 단어나 유추 문제의 성능 면에서도 skip-gram 모델이 더 뛰어납니다.
이유를 직관적으로 생각해보면 skip-gram 모델쪽이 더 풀기 어려운 문제에 도전하기 때문입니다.
우리가 두 모델의 문제를 각각 풀어본다고 했을 때 맥락을 통해서 중앙 단어를 유추하는 것보다,
중앙 단어를 통해서 양쪽의 맥락을 파악하는 것이 더 어렵습니다.
어려운 상황에서 단련하는 만큼 skip-gram 모델이 내어 주는 단어의 분산 표현이 더 뛰어날 가능성이 커집니다.
skip-gram class에 대한 코드는 다음과 같습니다.
# 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
클래스는 다음과 같이 하며 해당 모델을 구현해주고 학습하는 부분에서는 CBOW와 다르게 구현해야 합니다.
출력층 부분에서 손실함수들의 합을 최종 손실함수로 사용하여 최종 손실함수로 학습을 시켜야되기 때문입니다.
(3) 통계 기반 vs 추론 기반
어휘에 추가할 새 단어가 생겨서 단어의 분산 표현을 갱신해야 하는 상황이 있다고 합시다.
통계 기반 기법에서는 계산을 처음부터 다시 해야 합니다.
동시발생 행렬을 다시 만들고 SVD를 수행하는 일련의 작업을 다시 해야 합니다.
그에 반해, 추론 기반 기법은 매개변수를 다시 학습할 수 있습니다.
전에 학습시킨 가중치를 초깃값으로 사용해 다시 학습하면 되는데,
이러한 특성 덕분에 기존 학습한 경험을 해치지 않으면서 단어의 분산 표현을 효율적으로 갱신할 수 있습니다.
두 기법으로 얻는 단어의 분산표현의 성격이나 정밀도 면에서는
통계 기반은 주로 단어의 유사성이 인코딩이되고,
추론 기반은 유사성 뿐만 아니라 단어 사이 패턴, 유추 문제까지 풀 수 있어서
추론 기반이 통계 기반보다 정확하다고 오해하곤 합니다.
그러나 실제로 단어의 유사성을 정량 평가해본 결과, 의외로 추론 기반과 통계 기반의 우열을 가릴 수 없다고 합니다.
(여러 논문들에서 단어의 유사성 관련 작업의 경우 정확성은 하이퍼 파라미터에 크게 의존하며, 통계 기반과 추론 기반의 우열을 명확히 가릴 수 없다고 보고됨)
또 다른 중요한 사실로,
추론 기반 기법과 통계 기반 기법은 서로 관련되어 있다고 합니다.
구체적으로,
skip-gram과 네거티브 샘플링을 이용한 모델은 모두 말뭉치 전체의 동시발생 행렬에 특수한 행렬 분해를 적용한 것과 같습니다.
다시 말해, 두 세계는 특정 조건 하에서 '서로 연결되어 있다'고 할 수 있습니다.
word2vec 이후 추론 기반 기법과 통계 기반 기법을 융합한 GloVe 기법이 등장했습니다.
GloVe 기법은 말뭉치 전체의 통계 정보를 손실 함수에 도입해 미니배치 학습을 하는 것입니다.
www.aclweb.org/anthology/D14-1162/
이로 인해 두 세계를 명시적으로 융합하는데 성공했습니다.
(위의 내용은 밑바닥부터 시작하는 딥러닝 2 (한빛미디어)를 바탕으로 글을 작성하였습니다)
'It공부 > Deep learning' 카테고리의 다른 글
(2)-4-2 개선된 word2vec 학습 (0) | 2021.01.20 |
---|---|
(2)-4-1 word2vec 속도 개선 (0) | 2021.01.19 |
(2)-3-1. word2vec (0) | 2021.01.17 |
SVD를 이용한 차원 축소가 의미하는 바 (0) | 2021.01.16 |
(2)-2. 자연어와 단어의 분산 표현 (2) | 2020.06.30 |