2016-07-03 5 views
0

Word2vec 모델은 NCE (noise-contrastive estimation) 손실을 사용하여 모델을 교육합니다.word2vec 교육 과정에서 tf.mul을 사용하는 이유는 무엇입니까?

실제 샘플 로짓 계산에 tf.mul을 사용하지만 부정 계산에 tf.matmul을 사용하는 이유는 무엇입니까?

source code을 참조하십시오.

+0

FYI :'tf.mul'가'tf.multiply'으로 변경되었습니다. 참조 : https://www.tensorflow.org/api_docs/python/tf/multiply –

답변

0

NCE 손실 계산을 생각해 볼 수있는 한 가지 방법은 독립적 인 이진 로지스틱 회귀 분류 문제의 일괄 처리입니다. 두 경우 모두 첫 번째 위치에서 보지 않아도 동일한 계산을 수행합니다.

것은 우리가 실제로 같은 일을 계산되어 있음을 표시하려면 실제 입력 부분에 대한 때라도 가정 또한

emb_dim = 3 # dimensions of your embedding vector 
batch_size = 2 # number of examples in your trainings batch 
vocab_size = 6 # number of total words in your text 
       # (so your word ids range from 0 - 5) 

을 일괄에 다음 훈련 예를 가정

1 => 0 # given word with word_id=1, I expect word with word_id=0 
1 => 2 # given word with word_id=1, I expect word with word_id=2 

그런 다음 삽입 행렬 example_emb의 크기는 [2,3]이고 실제 가중치 행렬 true_w의 크기는 [2,3]이며 다음과 같아야합니다.

example_emb = [ [e1,e2,e3], [e1,e2,e3] ] # [2,3] input word 
true_w  = [ [w1,w2,w3], [w4,w5,w5] ] # [2,3] target word 

example_emb은 학습을 위해 노력하고있는 총 단어 임베딩 (emb)의 하위 집합이며 true_w는 가중치 집합 (smb_w_t)의 하위 집합입니다. example_emb의 각 행은 입력 벡터를 나타내며, 가중치의 각 행은 대상 벡터를 나타냅니다.

그래서 [e1, e2, e3]는 word_id = 1 인 emb에서 취한 입력 단어의 단어 벡터이며 [w1, w2, w3]은 word_id = 0 인 예상 대상 단어의 단어 벡터입니다.

직관적으로 말하면, 해결하려는 분류 작업은 다음과 같습니다. 입력 단어와 타겟 단어가 정확하다는 것을 알았습니까?

두 분류 작업은 (바이어스없이 그리고 tensorflow 나중에 S 상 적용이 편리한 'sigmoid_cross_entropy_with_logits'기능을 가짐)이다 :

logit(1=>0) = dot([e1,e2,e3], transpose([w1,w2,w3]) => 
logit(1=>0) = e1*w1 + e2*w2 + e3*w3 

and 

logit(1=>2) = dot([e1,e2,e3], transpose([w4,w5,w6]) => 
logit(1=>2) = e1*w4 + e2*w5 + e3*w6 

우리 [로짓 계산할 수를 (1 => 0)], [logit (1 => 2)]] 가장 간단한 방법은 원소 단위의 곱셈 tf.mul()을 수행 한 다음 각 행을 합산하는 것입니다.

이 계산의 결과는 올바른 단어에 대한 로그를 포함하는 [batch_size, 1] 행렬이됩니다. 우리는이 예들에 대한 지상 진실/레이블 (y ')을 알고 있는데, 이것이 올바른 예들이기 때문에 1입니다.

true_logits = [ 
    [logit(1=>0)], # first input word of the batch 
    [logit(1=>2)] # second input word of the batch 
] 

이제 우리는 부정적인 샘플링에 tf.matmul()를 사용하는 이유 질문의 두 번째 부분 들어, 우리는 (= 3 num_sampled) 3 개 부정적인 샘플을 그릴 수 있다고 가정하자. 그래서 sampled_ids = [3,4,5].

직관적으로, 이것은 당신이 즉, 일괄 여섯 개 더 많은 교육 사례를 추가하는 것이 의미

1 => 3 # given word_id=1, do i expect word_id=3? No, because these are negative examples. 
1 => 4 
1 => 5 
1 => 3 # second input word is also word_id=1 
1 => 4 
1 => 5 

그래서 당신은 [3, 3] 행렬로 밝혀 당신의 sampled_w를 찾아보십시오.이제 귀하의 매개 변수는 다음과 같습니다 :

example_emb = [ [e1,e2,e3], [e1,e2,e3] ] # [2,3] input word 
sampled_w = [ [w6,w7,w8], [w9,w10,w11], [w12,w13,w14] ] # [3,3] sampled target words 

진정한 경우와 마찬가지로 모든 부정적인 학습 사례에 대한 로그가 필요합니다. 예를 들어, 첫 번째 예 : 우리 sampled_w 행렬 전치 후

logit(1 => 3) = dot([e1,e2,e3], transpose([w6,w7,w8]) => 
logit(1 => 3) = e1*w6 + e2*w7 + e3*w8 

지금이 경우, 우리는 매트릭스 승산을 사용할 수있다. 이것은 tf.matmul() 호출에서 transpose_b = True 매개 변수를 사용하여 수행됩니다. 전치 가중치 행렬은 다음과 같다 :
sampled_w_trans = [ [w6,w9,w12], [w7,w10,w13], [w8,w11,w14] ] # [3,3] 

그래서 지금 tf.matmul() 동작이 각 행의 입력 배치의 한 예를 들면 logits가된다 [BATCH_SIZE, 3 행렬을 반환한다. 각 요소는 분류 작업에 대한 로짓을 나타냅니다.

음극 샘플링 결과 전체 행렬이 포함되어 이들의 부정적인 예이기 때문에 sampled_logits위한

sampled_logits = [ 
    [logit(1=>3), logit(1,4), logit(1,5)], # first input word of the batch 
    [logit(1=>3), logit(1,4), logit(1,5)] # second input word of the batch 
] 

라벨/지표 사실은 모두 제로이다.

두 경우 모두 이진 분류 로지스틱 회귀 (나중에 적용되는 시그 모이 드가없는)와 동일한 계산을 수행합니다.