word2vec
전 장과는 다른 통계 기반 기법과는 다른 추론 기반 기법이 등장하고 당연하게도 딥러닝 부분도 포함한다.
추론 기반 기법과 신경망
통계 기반 기법의 문제점 (p.115)
- 통계 기반 기법은 말뭉치 전체의 통계를 단 1회의 처리로 단어의 분산 표현을 얻는다. -> 시간이 오래 걸리고 컴퓨팅 자원이 많이 들어갈 수 밖에 없다.
- 반면 추론 기반 기법은 신경망을 이용해 미니배치로 학습하는 것이 일반적이다. -> 소량의 학습 샘플씩 반복해서 학습하며 가중치를 갱신해간다. -> 병렬 계산이 가능하고, 계산량이 큰 작업도 가능하게 만든다.
- 배치 학습과 미니 배치 학습으로 구분할 수도 있겠다.
- 여기서 추론이란 주변 단어(맥락)이 주어졌을 때 타깃이 되는 단어(미지의 단어)가 무슨 단어가 될 지 추측 하는 작업이다.
- 추론 문제를 반복해서 풀면서 단어의 출현 패턴을 학습하는 것이다.
신경망에서의 단어 처리
신경망을 이용해 단어를 처리하기 위해서는 단어를 우선 고정 길이의 벡터로 변환해야 한다. (one-hot) 사용
- 원-핫 벡터 : 벡터의 원소 중 하나만 1이고 나머지는 0인 벡터
- 예를 들어 'You say goodbye and I say hello.'에 경우 각 단어들을 (전처리 후) 하나의 원소로 갖는 고정 길이의 벡터로 만든다. -> 이 경우는 원소가 7개 -> 각 단어 대응하는 원소가 1이다.
- 그리고 7개 뉴런으로 구성된 입력층을 만든다.
- 입력층 뉴런과 가중치합이 은닉층 뉴런이 된다. 책에서는 완전연결계층으로 구성한다. (p.119)
- 값이 1인 원소 빼고 나머지는 행렬 곱에서 걸러져 은닉층으로 도달하지 못한다. (p.119) -> 개선 예정
단순한 word2vec (p.121)
word2vec에서 제안하는 CBOW(continuous bag-of-words) 모델을 구현할 예정이다.
학습 데이터 준비 (p.131)
word2vec 에서는 신경망의 입력은 '맥락'이고, 정답이 되는 데이터는 '타깃'이니 이 둘을 우선적으로 준비해야겠다.
데이터 준비 작동 과정
- 말뭉치 텍스트를 단어 ID로 전처리한다. -> preprocess() 사용
- 맥락과 타깃을 만든다.
- 맥락과 타깃을 각각 넘파이 다차원 배열로 반환
- 원-핫 벡터로 변환
주의해야 할 점
- 맥락은 보통 복수이니 함수 구현 때 어미에 's'를 붙여주자.
- 맥락 입력은 원-핫으로 변환 될 때 형상이 변한다. -> 이 예에서는 하나 늘어난다.
CBOW 모델 구현 (p.135)
모델 구조는 위에 구현한 CBOW + 소프트맥스와 손실함수 계층을 합친 층을 더한 구조이다.
여기에 순전파와 역전파까지 구현한다. 이 예에서 매개변수 갱신 최적화 방법은 Adam을 사용한다.
word2vec 보충 (p.141)
CBOW의 확률 관점
- CEE = L=−k∑tklogyk
yk = k번째에 해당하는 사건이 일어날 확률
tk = 정답 레이블, 원-핫 벡터로 표현
위 식을 참고로 다음 식 유도 가능 :
- L=−logP(wt∣wt−1,wt+1)
음의 로그 가능도(negative log likelihood) : 로그를 취한 뒤 마이너스 붙이기
위 식을 말뭉치 전체로 확장하면 :
- L= −T1t=1∑TlogP(wt∣wt−1,wt+1)
CBOW 모델의 학습이 수행하는 일은 이 손실 함수 L의 값을 가능한 작게 하는 것이겠다.
skip-gram의 확률 관점
word2vec에서 제안한 모델은 2개이고 skip-gram이 그 두번째이다.
- skip-gram은 CBOW의 맥락과 타깃을 역전시킨 것이다.
- 즉, 타깃으로부터 주변 맥락을 추론하는 모델이다.
- 그러니 입력층 벡터는 1개, 출력층은 맥락의 수와 선형적으로 비례한다.
- 출력층에서 개별적으로 손실을 구하고, 개별 손실들을 모두 더한 값을 최종 손실로 한다.
skip-gram의 확률 모델 표기
- P(wt−1,wt+1∣wt)
wt이 일어난 후 wt−1와 wt+1이 동시에 일어날 확률
skip-gram 모델에서는 맥락의 단어들 사이에 관령성이 없다고 가정하고(조건부 독립) 분해 :
- = P(wt−1,wt+1∣wt) = P(wt−1∣wt)P(wt+1∣wt)
CEE 적용해서 손실함수 유도 :
- L = −logP(wt−1,wt+1∣wt)
= −logP(wt−1∣wt)P(wt+1∣wt)
= −(logP(wt−1∣wt)+logP(wt+1∣wt))
로그의 성질 사용
말뭉치 전체에 적용 :
- L = −T1t=1∑T(logP(wt−1∣wt)+logP(wt+1∣wt))
참고
동시 확률 : P(A,B)
사후 확률 : P(A∣B)
ex) P(wt∣wt−1,wt+1) = wt−1와 wt+1이 일어난 후 wt이 일어날 확률
두 모델의 차이점
- skip-gram은 맥락의 수만큼 추측하기 때문에 그 손실 함수는 각 맥락에서 구한 손실의 총합이어야 한다.
- CBOW는 타킷 하나의 손실을 구한다.
- skip-gram 모델의 결과가 단어 분산 표현의 정밀도 면에서 앞서는 경우가 많다. -> 특히 말뭉치가 커질수록
통계 기반 vs 추론 기반 (p.146)
확실히 초깃값을 수정하거나, 학습 효율, 분산 표현의 성격이나 정밀도 면에서 우세한 면이 있으나 추론 기반이 통계 기반보다 정확하다고 할 수는 없다. -> 정량 평가 겨로가 의외로 추론 기반과 통계 기반기법의 우열을 가릴 수 없었다고 한다.
word2vec 이후 추론 기반 과 통계 기반을 융합한 GloVe 기법이 있다고 한다.
요약
간단한 word2vec 모델을 구현해보았다. 제대로 된 말뭉치도 아니고 모델은 더더욱 아니지만 뭔가 하나씩 배우고 있다는 느낌은 확실히 들어 좋다.