2017-09-06 4 views
0

나는 word2vec 내에서 skip-gram 모델을 배우려고 노력하고있다. 그러나 나는 몇 가지 기본 개념에 혼란스러워한다. 시작하려면 여기에 예제로 동기 부여 된 모델에 대한 나의 현재 이해가 있습니다. 내가 가서 파이썬 gensim을 사용하고 있습니다.word2vec 훈련 과정 설명

여기에는 세 문장으로 된 코퍼스가 있습니다.

이에서
sentences = [ 
    ['i', 'like', 'cats', 'and', 'dogs'], 
    ['i', 'like', 'dogs'], 
    ['dogs', 'like', 'dogs'] 
] 

, 나는 나의 어휘, V = ['and', 'cats', 'dogs', 'i', 'like']를 확인할 수 있습니다.

skipgram

다음 softmax를 함수를 이용하여 | 토마스 Mikolov (등)으로 this paper 따라

기본 스킵 g 배합 P (w_t w_t + J)을 정의

여기서 v_w 및 v'_w는 w의 "입력"및 "출력"벡터 표현이고 이고 W는 어휘의 단어 수. 내 이해하는

이, 스킵 그램 모델은 두 개의 행렬을 포함한다 (내가 그들을 전화 할게 IO) "입력/센터"단어의 벡터 표현과 "의 벡터 표현입니다 출력/컨텍스트 "단어. d = 2 (벡터 차원 또는 '크기'를 genison에서 호출 한 것으로 가정) 은 2x5 행렬이어야하고 은 5x2 행렬이어야합니다. 훈련 과정의 시작에서,이 행렬은 무작위 값 (예?)으로 채워집니다. 그래서 우리는 지금이 단어를 "개" "고양이"의 맥락에서 나타나는 확률을 계산하려면

import numpy as np 
np.random.seed(2017) 

I = np.random.rand(5,2).round(2) # 5 rows by 2 cols 
[[ 0.02 0.77] # and 
[ 0.45 0.12] # cats 
[ 0.93 0.65] # dogs 
[ 0.14 0.23] # i 
[ 0.23 0.26]] # like 

O = np.random.rand(2,5).round(2) # 2 rows by 5 cols 
    #and #cats #dogs #i #like 
[[ 0.11 0.63 0.39 0.32 0.63] 
[ 0.29 0.94 0.15 0.08 0.7 ]] 

가있을 수 있습니다 나는

특급을 수행해야합니다 ([0.39, 0.15] * [0.45 0.12])/(...) = (0.1125)은/(...)

이에 대한 몇 가지 질문 :

  1. 알고리즘에 대한 이해는 지금까지 맞습니까? genism 사용
  2. 는, I는 주어진 어레이

 

import gensim 
model = gensim.models.Word2Vec(sentences, sg = 1, size=2, window=1, min_count=1) 
model.wv['dogs'] # array([ 0.06249372, 0.22618999], dtype=float32) 

하여이 데이터에 대해 모델을 학습 할 수 있다는 입력 행렬의 "개"또는 출력 행렬 벡터 ? 최종 모델에서 두 행렬을 모두 볼 수있는 방법이 있습니까?

  1. model.wv.similarity('cats','cats') = 1입니까? 나는 이것이 "고양이"라는 단어가 "고양이"라는 단어의 맥락에서 나타나지 않을 것이라는 것을 데이터가 나타 내기 때문에 이것이 0에 가까워 야한다고 생각했습니다.
+0

리차드 소처 (Richard Socher) (https://www.youtube.com/watch?v=ASn7ExxLZws)의 41:00 - 42:30 경에 따르면 최종 * input * 및 * output * 벡터는 일반적으로 각 단어에 대한 최종 벡터를 생성하기 위해 함께 추가됩니다. – Ben

답변

1

(1) 일반적으로, 그래,하지만 :

O 출력 매트릭스 - 더 제대로 출력 노드의 숫자로, 신경 네트워크의 은닉층의 가중치로 이해 - 서로 다르게 해석됩니다 'negative sampling'('NS') 또는 'hierarchical softmax'('HS') 교육을 사용하든 상관 없습니다. 모두 IO에서 실제로

렌 (Vocab의) 행과 벡터 크기 열입니다. 각 예측 워드는 단일 출력 노드에 해당

내가 생각 좀 더 쉽게 NS를 찾는 (. Omodel.syn1neg NS의 배열 또는 HS에서 model.syn1이다 IWord2Vec model 인스턴스의 model.wv.syn0 배열) . 트레이닝 데이터의 경우 (context) -> (word) 인 경우, 훈련은 해당 단어의 노드 값을 1.0으로, 다른 임의로 선택한 단어 노드 값을 0.0으로 이동하려고 시도합니다.

HS에서 각 단어는 출력 노드의 작은 하위 집합의 허프만 코드로 표현됩니다. 즉, '포인트'는 1.0 또는 0.0으로 설정되어 네트워크가 (컨텍스트) -indicates -> (단어) 예제.

초기 문자 값인 행렬 만 초기 단어 값이 처음에는 낮은 크기의 벡터로 무작위 화됩니다.

(2) 예, 작은 장난감 크기의 예제는 반드시 유용한 별자리를 생성하지 않는다는 점에 유의하십시오. word2vec로부터 평가되는 벡터 좌표.

(3) 참고 : model.similarity('cats', 'cats')은 실제로 두 단어에 대한 (입력) 벡터 간의 코사인 유사성을 확인하고 있습니다. 그것들은 같은 단어이므로, 그것들은 정의 상 동일한 벡터를 가지며, 동일한 벡터들 사이의 유사성은 1.0입니다.

즉, similarity()이 아니며은 모델에 예측을 요청하고 키로 학습 된 단어를 검색하고 해당 벡터를 비교합니다. (gensim의 최신 버전은 predict_output_word() 함수를 가지고 있지만 NS 모드에서만 작동하며 예측을하는 것은 실제로 word2vec의 요점이 아니며 많은 구현은 예측 API를 전혀 제공하지 않고 오히려 다양한 다른 업무에 유용하게 사용되는 단어 벡터를 유도하기 위해 훈련 중에 예측을 시도했습니다.)

그러나 예측을 읽는 경우에도 '고양이'는 여전히 모델에서 합당하지만 나쁜 예측 일 수 있습니다 '고양이'의 맥락에서 '밀도'삽입의 작은 차원으로 큰 어휘를 강제하는 본질은 압축입니다. 입력의 모든 세부 사항을 간단히 암기하기에 충분한 내부 복잡성 (학습 가능한 매개 변수)이 없기 때문에이 모델은 관련 단어를 함께 클러스터링 할 수밖에 없습니다. (대부분은 훈련 자료의 특이성을 과장하지 않고 일반화 가능한 패턴을 산출하기 때문에 좋은 것입니다.)

단어 '고양이'는 '개'와 '애완 동물 왜냐하면 그들은 모두 비슷한 단어 나 다른 단어와 함께 발생하기 때문입니다. 따라서 입력 벡터가 그다지 변하지 않기 때문에 모델은 각각에 대해 유사한 출력 예측을해야합니다.그리고 반복적 인 단어처럼 논리적 인 언어 사용에있어서 무의미한 몇 가지 예언이있을 수 있습니다. 그러나 더 큰 오류를 취하는 것이 다른 가중치 대안에 비해 전체 훈련 세트에 대해 여전히 적은 오류를 제공하기 때문에 가능합니다.