Word2vec 모델은 NCE (noise-contrastive estimation) 손실을 사용하여 모델을 교육합니다.word2vec 교육 과정에서 tf.mul을 사용하는 이유는 무엇입니까?
실제 샘플 로짓 계산에 tf.mul
을 사용하지만 부정 계산에 tf.matmul
을 사용하는 이유는 무엇입니까?
source code을 참조하십시오.
Word2vec 모델은 NCE (noise-contrastive estimation) 손실을 사용하여 모델을 교육합니다.word2vec 교육 과정에서 tf.mul을 사용하는 이유는 무엇입니까?
실제 샘플 로짓 계산에 tf.mul
을 사용하지만 부정 계산에 tf.matmul
을 사용하는 이유는 무엇입니까?
source code을 참조하십시오.
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
]
라벨/지표 사실은 모두 제로이다.
두 경우 모두 이진 분류 로지스틱 회귀 (나중에 적용되는 시그 모이 드가없는)와 동일한 계산을 수행합니다.
FYI :'tf.mul'가'tf.multiply'으로 변경되었습니다. 참조 : https://www.tensorflow.org/api_docs/python/tf/multiply –